Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры Atmega AVR
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.91/23: Рейтинг темы: голосов - 23, средняя оценка - 4.91
VyvotzorD
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 2,309
1

Проблема с АЦП на ATMEGA48PA

28.03.2013, 13:16. Просмотров 4098. Ответов 5
Метки нет (Все метки)

Ребят, проблема такая: использую АЦП на борту ATMEGA48PA. Все делал по даташитам и рекомендациям самой ATMEL. И получил такой интересный глюк: самое первое преобразование после ресета контроллера проходит правильно. А вот все остальные - как-то не так. Все вроде идет так как надо, но содержимое регистров ADCH и ADCL не меняется. То есть как в первый раз записал туда значения АЦП, так они все время и висят, независимо от сигнала на входе АЦП.

Если сделать контроллеру ресет, то первое преобразование опять проходит нормально... и все... дальше значения в регистрах не меняются...

Кто нибудь сталкивался с таким косяком?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.03.2013, 13:16
Ответы с готовыми решениями:

проблема с АЦП в ATmega168V
Имеется мк atmega168V в DIP корпусе с 28-ножками Необходимо получить...

Еще одна проблема с АЦП
Делал на днях индикатор уровня громкости на mega8. Идея проста: сигнал со...

Проблема с диференциальным АЦП (Atmega644P, mikroPascal)
Есть проблема с диференциальным АЦП: при включении устройства в отсчетах лажа....

Проблема при чтении результата АЦП
Микроконтроллер ATmega8,программа должна измерять напряжение,обрабатывать и...

Atmega48PA и 32.768kHz
День добрый! Возникла проблема с подключением часового кварца к ATmega48PA -...

5
Striss
0 / 0 / 0
Регистрация: 06.02.2011
Сообщений: 50
28.03.2013, 13:50 2
АЦП настроено не на режим разового измерения? Напишите настройки регистров АЦП
0
DOOMSDOY
0 / 0 / 0
Регистрация: 13.07.2012
Сообщений: 566
28.03.2013, 14:37 3
В какой последов. читаете регистры с рез. преобразования?
0
VyvotzorD
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 2,309
28.03.2013, 15:01 4
Вот инициализация
Код
   ldi tmp, 0b10101000   ; Отключили лишние таймеры и TWI
sts PRR, tmp
ldi tmp, 0b01000000   ; AVcc - опорное напряжение, ADC0 - текущий используемый вход
sts ADMUX, tmp
ldi tmp, 0b10000100   ; ADC разрешен, делитель частоты - 16, прерывание разрешено
sts ADCSRA, tmp
clr tmp
sts ADCSRB, tmp
ldi tmp, 0b00000011 ; Запрещаем работу портов PC0, PC1 (т.к. используем ADC0 и ADC1)
sts DIDR0, tmp
А вот подпрограмма, которая берет значения со входов ADC0 и ADC1:
Код
GetTemp:   ; Получает данные о температуре
push tmp
ldi tmp, 0b01000001   ; AVcc - опорное напряжение, ADC1 - текущий используемый вход
sts ADMUX, tmp
ldi tmp, 0b11000100 ; Запускаем работу АЦП
sts ADCSRA, tmp
wl3:
lds tmp, ADCSRA      ; ждем конца преобразования
sbrs tmp, 4
rjmp wl3
ldi tmp, 0b10010100
sts ADCSRA, tmp
ldi tmp, 0b11000100 ; снова запускаем работу АЦП, так как первый семпл - не воспринимаем за результат
sts ADCSRA, tmp
wl4:
lds tmp, ADCSRA      ; ждем конца преобразования
sbrs tmp, 4
rjmp wl4
ldi tmp, 0b10010100
sts ADCSRA, tmp
lds tm1hi, ADCH      ; сохраняем данные
lds tm1lo, ADCL
;      --
ldi tmp, 0b01000001   ; AVcc - опорное напряжение, ADC1 - текущий используемый вход
sts ADMUX, tmp
ldi tmp, 0b11000100 ; Запускаем работу АЦП
sts ADCSRA, tmp
wl5:
lds tmp, ADCSRA      ; ждем конца преобразования
sbrs tmp, 4
rjmp wl5
ldi tmp, 0b10010100
sts ADCSRA, tmp
ldi tmp, 0b11000100 ; снова запускаем работу АЦП, так как первый семпл - не воспринимаем за результат
sts ADCSRA, tmp
wl6:
lds tmp, ADCSRA      ; ждем конца преобразования
sbrs tmp, 4
rjmp wl6
ldi tmp, 0b10010100
sts ADCSRA, tmp
lds tm2hi, ADCH      ; сохраняем данные
lds tm2lo, ADCL
pop tmp
ret
Причем тут есть несколько вещей: готовность данных проверяется по флагу прерывания от АЦП. Можно проверять по состоянию бита ADSC в регистре ACSRA - но результат такой же. Так же прочитал в сети что можно (нужно) сбрасывать после окончания преобразования флаг прерывания, ибо флаг этот сбрасывается автоматически, если только вызывается обработчик прерывания. А если работа идет без прерываний - то надо сбрасывать. Сбрасывал - результат тот же. Причем работал с АЦП и с прерыванием и без прерывания - все одно и то же.

2 DOOMSDOY
А последовательность чтения регистра имеет значение??? Оо
0
DOOMSDOY
0 / 0 / 0
Регистрация: 13.07.2012
Сообщений: 566
28.03.2013, 15:05 5
ADCL must be read first, then ADCH
0
VyvotzorD
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 2,309
28.03.2013, 15:06 6
2 DOOMSDOY
Ептыть... вон оно как...

UPD:
ЗАРАБОТАЛО!!! Всем спасибо!!! А то я уже думал, что шайтан в микросхеме живет :-)
0
28.03.2013, 15:06
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.03.2013, 15:06

Проблемы с ATmega48PA-AU
Добрый день! Делал устройство на этом камне. Столкнулся с двумя проблемами....

ATMega48PA не выходит из сна
Здравствуйте! Прошу помощи. Может кто-то сталкивался с подобным. Проблема...

ATMEGA48PA - непонятный глюк с UART
Вобщем дело такое... я сваял девайс для рабочих нужд, задача которого читать...


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

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

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