Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры Atmega AVR
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.65/26: Рейтинг темы: голосов - 26, средняя оценка - 4.65
SRiW
0 / 0 / 0
Регистрация: 20.04.2014
Сообщений: 44
1

ADC Tiny24 @ Proteus

23.04.2014, 15:57. Просмотров 4758. Ответов 17
Метки нет (Все метки)

Поделитесь дельным советом.
Симулирую работу АЦП в Протеусе, а он отказывается читать.

Инициализация
Код
 .equ ADCIN1=1         ;флаги активации портов ввода АЦП используется в регистре DIDR0
.equ ADCIN2=2
.equ MUXUIN=1
.equ MUXUREF=2
;описание битов флага регистра FlagADC
.equ DIADC=7      ;бит наличия новых данных с АЦП FlagADC
.equ DUIN=0      ;бит наличия новых данных от переменного напряжения
.equ DUREF=1      ;бит наличия новых данных от виртуального нуля
;.equ DUBAT=2      ;бит наличия новых данных от виртуального нуля

.equ ADCSROMUIN=0x60
.equ ADCSROMUREF=0xA0
;настройка АЦП

outi ADCSRA,(1<<ADIM)|(1<<ADPS0)|(1<<ADPS1)|(1<<ADPS2); тактовая частота 1/128 = 60 кГц
sbi ADCSRB,ADLAR      ;выравнивание резултата по старшему ADCH
outi DIDR0,~(1<<ADCIN1|1<<ADCIN2) ; отключение портов АЦП
;ADMUX
sbi ADMUX,MUXUIN; переводим мультиплексор на входное напряжение
;sbi ADMUX,REFS0
sbi ADCSRA,ADIE
sbi ADCSRA,ADSC
sei
Код прерывания

Код
 ADCC:
;in r19,ADCL
in r19,ADCH

sbis ADMUX,MUXUIN
rjmp DataUref
ldi FlagADC,(1<<DIADC)|(1<<DUIN) ; установили флаг прихода новых данных от переменного напряжения
cbi ADMUX,MUXUIN      ;меняем вход мультиплексора
sbi ADMUX,MUXUREF
rjmp EndMuxADC

DataUref:
ldi FlagADC,(1<<DIADC)|(1<<DUREF) ; установили флаг прихода новых данных от опорного напряжения
cbi ADMUX,MUXUREF
sbi ADMUX,MUXUIN
EndMuxADC:
Программа в цикле
Код
ADCDataSave:   ;обработка данных АЦП
sbrs FlagADC,DIADC ;проверка наличия флага прихода новых данных
rjmp EndADCDataSave
DataSaveUIN:
sbrs FlagADC,DUIN
rjmp DataSaveUREF

ldi XH,high(ADCSROMUIN)
ldi XL,Low(ADCSROMUIN)
st X+,r19
nop
rjmp EndDataSave
DataSaveUREF:
ldi XH,high(ADCSROMUREF)
ldi XL,Low(ADCSROMUREF)
st X+,r19

EndDataSave:
sbi ADCSRA,ADSC      ;запускаем преобразование
omdi FlagADC,~(1<<DIADC) ;сброс флага прихода новых данных
EndADCDataSave:
Прописывает в
UIN 0х60 - 68
UREF А0-00
UREF 2.047VDC виртуальный нуль

Всю голову сломал.
отключаю UIN, все равно 0х60 - 68
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.04.2014, 15:57
Ответы с готовыми решениями:

ADC и Микропаскаль
на пинборде 1 мега16 собрал: от adc2 к переменнику ( центр), к одному краю переменника +5, к...

ADC Atmega8
Написал программу, которая включает обработчик АЦП каждые 2 секунды, но он делает всего 1 начальное...

ADC+AVR
Кто посоветует самую дешёвую версию AVR с ADC? Точнее не кто посоветует, а какую посоветуете?

ATtiny13 и ADC
Пытаюсь в МК ATtiny13 запустить ADC, считывание показаний с термистора. Напряжение подается на...

Attiny 13 ADC
решил сделать автовключение света в ванной. купил дальнометр 2Y0A21, подключил его к ардуино и...

17
oxford
0 / 0 / 0
Регистрация: 20.05.2016
23.04.2014, 17:58 2
Дельный совет: Зачем вам AVR, да еще и на астме? STM микроконтроллеры ведь доступны, язык Си. Хватит уже заниматься туфтой.
0
Bmox77
0 / 0 / 0
Регистрация: 06.04.2014
Сообщений: 215
23.04.2014, 18:06 3
А вы в каком режиме АЦП запускаете? Я на attiny 13 писал прогу, в протеусе удалось только в режиме одиночного преобразования результат получить. Принудительно дергал запуск, а потом считывал, в автоматическом режиме не работало. В железе не проверял.
0
SRiW
0 / 0 / 0
Регистрация: 20.04.2014
Сообщений: 44
24.04.2014, 05:14 4
Цитата Сообщение от Bmox77
attiny 13 в протеусе удалось только в режиме одиночного преобразования результат получить.
Запускаю в одиночном. Менял контроллеры, режимы. Все тщетно. Так понимаю нужно в железе проверять, а рановато.
0
YTYOUT
0 / 0 / 0
Регистрация: 02.10.2012
Сообщений: 1,946
24.04.2014, 07:49 5
Нет , не складывается картинка . Выкладывайте весь код. И переходите сразу на отладку в железе.
0
tyzord66
0 / 0 / 0
Регистрация: 14.10.2011
Сообщений: 806
24.04.2014, 09:41 6
Цитата Сообщение от YTYOUT
Нет , не складывается картинка . Выкладывайте весь код. И переходите сразу на отладку в железе.
+1
Хотелось бы увидеть как стэк установден, таблицу векторов прерываний, сохранение PSW при входе в прерывание и т.д.

PS: В рпотеусе все длжно работать, заработает в нем, то и в железе заработает.
0
SRiW
0 / 0 / 0
Регистрация: 20.04.2014
Сообщений: 44
24.04.2014, 12:32 7
Листинг программы!.def tmp=r16
.def sdata=r17
.def FlagADC=r18

.equ Fuel=0
.equ Sronk=1
.equ Stop=2
.equ Kim=7
.equ Choke=6

.equ MOSI=1 ;Динные вывода
.equ SCK=0 ;Вывод тактовой частоты
.equ SS=2 ;Стоб записи
.equ SPISUMBIT=8 ;число битов стробирования SPI
.equ PORTSPI=PORTB ;Назначаем порт вывода для SPI
.equ DDRSPI=DDRB
.equ ADCIN1=1 ;флаги активации портов ввода АЦП используется в регистре DIDR0
.equ ADCIN2=2
.equ MUXUIN=1
.equ MUXUREF=2
;описание битов флага регистра FlagADC
.equ DIADC=7 ;бит наличия новых данных с АЦП FlagADC
.equ DUIN=0 ;бит наличия новых данных от переменного напряжения
.equ DUREF=1 ;бит наличия новых данных от виртуального нуля
;.equ DUBAT=2 ;бит наличия новых данных от виртуального нуля

.equ ADCSROMUIN=0x60
.equ ADCSROMUREF=0xA0
;====================================================================
; Макросы
;====================================================================
.Macro outi
ldi R16,@1
out @0,R16
.endm
;====================================================================
; Область данных
;====================================================================

;====================================================================
; Таблица прерываний
;====================================================================
.cseg
rjmp Riset
reti; rjmp EXT_INT0 ; External Ymtirrupt Request 0
reti; rjmp PCI0 ; Pin Change Ymtirrupt Request 0
reti; rjmp PCI1 ; Pin Change Ymtirrupt Request 1
reti; rjmp WATCHDOG ; Watchdog Time-out
reti; rjmp ICP1 ; Timer/Counter1 Capture Ivimt
reti; rjmp OC1A ; Timer/Counter1 Compare Match A
reti; rjmp OC1B ; Timer/Counter1 Compare Match B
reti; rjmp OVF1 ; Timer/Counter1 Overflow
reti; rjmp OC0A ; Timer/Counter0 Compare Match A
reti; rjmp OC0B ; Timer/Counter0 Compare Match B
reti; rjmp OVF0 ; Timer/Counter0 Overflow
reti; rjmp ACI ; Analog Comparator
rjmp ADCC ; ADC Conversion Complete
reti; rjmp ERDY ; EEPROM Ready
reti; rjmp USI_STR ; USI START
reti; rjmp USI_OVF ; USI Overflow

ADCC:
;in r19,ADCL
in r19,ADCH

sbis ADMUX,MUXUIN
rjmp DataUref
ldi FlagADC,(1<<DIADC)|(1<<DUIN) ; установили флаг прихода новых данных от переменного напряжения
cbi ADMUX,MUXUIN ;меняем вход мультиплексора
sbi ADMUX,MUXUREF
rjmp EndMuxADC

DataUref:

ldi FlagADC,(1<<DIADC)|(1<<DUREF) ; установили флаг прихода новых данных от переменного напряжения
cbi ADMUX,MUXUREF
sbi ADMUX,MUXUIN
EndMuxADC:
reti
;====================================================================
; RESIT настройка портов и периферии
;====================================================================
Riset:

outi SPL,low(ramend)
outi ACSR,(1<<ACD)
;ldi tmp,low(ramend)
;out SPL, tmp
;ldi tmp,(1<<ACD)
;out ACSR,tmp

;настройка порта А
clr tmp
out DDRA,tmp
out DDRB,tmp

ser tmp
out PORTB, tmp
out PORTA, tmp

; настройка порта В
ldi sdata,(1<<MOSI)|(1<<SCK)|(1<<SS) ;настройка порта ввода вывода
in tmp,DDRSPI
or tmp,sdata
out DDRSPI, tmp
in tmp,PORTSPI
or tmp,sdata
out PORTSPI,tmp

;настройка порта С

;настройка АЦП

outi ADCSRA,(1<<ADIM)|(1<<ADPS0)|(1<<ADPS1)|(1<<ADPS2); тактовая частота 1/132 = 60 кГц
sbi ADCSRB,ADLAR ;выравнивание резултата по старшему ADCH
outi DIDR0,~(1<<ADCIN1|1<<ADCIN2) ; отключение портов АЦП
;ADMUX
sbi ADMUX,MUXUIN; переводим мультиплексор на входное напряжение
;sbi ADMUX,REFS0 ;Питание АЦП
sbi ADCSRA,ADIE
sbi ADCSRA,ADSC
sei
;====================================================================
; Основная программа
;====================================================================
Main:

sbr sdata,1<<Fuel|1<<crank|1<<stop
rcall SPI_MOSI
mm:; delete
ori sdata,(1<<Choke)
rcall SPI_MOSI
omdi sdata,~(1<<Choke)

ADCDataSave: ;обработка данных АЦП
sbrs FlagADC,DIADC ;проверка наличия флага прихода новых данных
rjmp EndADCDataSave
DataSaveUIN:
sbrs FlagADC,DUIN
rjmp DataSaveUREF

ldi XH,high(ADCSROMUIN)
ldi XL,Low(ADCSROMUIN)
st X+,r19
nop
rjmp EndDataSave
DataSaveUREF:
ldi XH,high(ADCSROMUREF)
ldi XL,Low(ADCSROMUREF)
st X+,r19

EndDataSave:
sbi ADCSRA,ADSC ;запускаем преобразование
omdi FlagADC,~(1<<DIADC) ;сброс флага прихода новых данных
EndADCDataSave:

rjmp mm; delete
rjmp Main

;====================================================================
; Передача данных по SPI
;====================================================================
SPI_MOSI:
/*
Частота процессора 8 МГц, следует обеспечить передачу данных на частоте 0,5 - 1,0 МГц
Передачу осуществляем программным методом запрещая прерывания
частота тактирования 10-16 циклов
*/
cli
push tmp
in tmp,sreg
push tmp
push sdata

;cbi PORTSPI, SCK ;начало тактирования
ldi tmp,SPISUMBIT
cbi PORTSPI, SS ;строб начала передачи данных low
nop
nop
nop
SPI_loop_Wr: ;начало цикла передачи битов
sbi PORTSPI, SCK
lsl sdata ;смещаем в перенос старший бит
brbc 0, NegWrByt
sbi PORTSPI,MOSI
rjmp WrByt
NegWrByt:
cbi PORTSPI,MOSI
WrByt:
cbi PORTSPI, SCK
nop
nop
nop
nop
nop

dec tmp
brne SPI_loop_Wr
sbi PORTSPI, SCK
sbi PORTSPI,SS
pop sdata
pop tmp
out SREG,tmp
pop tmp
sei
ret
скин протеуса вложил
0
YTYOUT
0 / 0 / 0
Регистрация: 02.10.2012
Сообщений: 1,946
24.04.2014, 17:36 8
Ну , начало вроде как и ничего , только:
АЦП срабатывает один раз и на этом его работа закончилась.
Программа Main живёт своей жизнью и никак не связана с жизнью АЦП , она даже не подозревает что должна работать с АЦП. Конечно она работает с переменными имеющие названия ADC , но никакого отношения к нему они не имеют.
0
SRiW
0 / 0 / 0
Регистрация: 20.04.2014
Сообщений: 44
24.04.2014, 19:34 9
Вы заблуждаетесь.

sbi ADCSRA,ADSC ;запускаем преобразование

Запуск АЦП после обработки данных. Флаг прихода данных с ацп (7 бит) дает добро на работу обработчика. Нет бита гуляем - по простору.
0
YTYOUT
0 / 0 / 0
Регистрация: 02.10.2012
Сообщений: 1,946
24.04.2014, 20:19 10
Это Вы заблуждаетесь . Ваш АЦП настроен на одиночное преобразование . В прерывании нет установки флага , что преобразование закончилось. У Вас он устанавливается только DataUref.
0
SRiW
0 / 0 / 0
Регистрация: 20.04.2014
Сообщений: 44
24.04.2014, 22:00 11
В прерывании считываем буфер
Код
in r19,ADCH
переключаем мультиплексор и устанавливаем флаг прихода новых данных DIADC

в основной программе по флагу DIADC идет обработка и запуск следующего преобразования.

Начал уж было сомневаться:)
0
YTYOUT
0 / 0 / 0
Регистрация: 02.10.2012
Сообщений: 1,946
24.04.2014, 22:11 12
Код
in r19,ADCH

sbis ADMUX,MUXUIN
rjmp DataUref
.......
rjmp EndMuxADC

DataUref:

ldi FlagADC,(1<<DIADC)|(1<<DUREF) ; установили
В каком случае флаг в прерывании установится , а в каком нет?
0
SRiW
0 / 0 / 0
Регистрация: 20.04.2014
Сообщений: 44
24.04.2014, 22:22 13
Код
              sbis ADMUX,MUXUIN
rjmp DataUref
ldi FlagADC,(1<<DIADC)|(1<<DUIN) ; установили флаг прихода новых данных от переменного напряжения[/color]
----------
rjmp EndMuxADC  [color=#000000]установили по первому[/color]

DataUref:[/color]
ldi FlagADC,(1<<DIADC)|(1<<DUREF) ; установили флаг прихода новых данных от опорного напряжения [color=#000000]установили по второму[/color]

EndMuxADC:
Работает четко. Делал прогоны
0
SRiW
0 / 0 / 0
Регистрация: 20.04.2014
Сообщений: 44
24.04.2014, 22:26 14
sbis - если да., то через команду
если нет следующая. Кушает один или два такта в зависимости возврата логики
0
YTYOUT
0 / 0 / 0
Регистрация: 02.10.2012
Сообщений: 1,946
24.04.2014, 22:29 15
Вы входите в прерывание 2 раза , но считываете только раз т.к. флаг устанавливается только в DataUref Зачем?
0
SRiW
0 / 0 / 0
Регистрация: 20.04.2014
Сообщений: 44
24.04.2014, 22:47 16
Илья огромное спасибо за направление:) Заработало.
0
YTYOUT
0 / 0 / 0
Регистрация: 02.10.2012
Сообщений: 1,946
24.04.2014, 22:51 17
И в прерывание добавь хотя бы сохранение SREG/ От глюков
0
SRiW
0 / 0 / 0
Регистрация: 20.04.2014
Сообщений: 44
25.04.2014, 01:01 18
Решение следующие. оказывается в TINY24 Нога AINO по умолчанию INT0. АЦП определяет 0 бит АЦП со второй ноги т.е 1 бит. Код ровный. Всем спасибо, и на заметку!
0
25.04.2014, 01:01
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.04.2014, 01:01

atmega8a ADC
Читаю доку на atmega8 не могу понять что значит цифровое питание и аналоговое при использовании...

AVR и 24x ADC
В общем есть необходимость использовать 24x АЦП (SPI, последовательный интерфейс). И поскольку...

ADC+EEPROM+UART
Всем доброго дня)))....вопрос такой...Реализую программно шину I2C на Atmega8 на асме(так надо)!...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru