Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Проблема с АЦП у Atmega48(V)
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
exert
Кто-нибудь сталкивался с некорректной работой АЦП. Подаю разное напряжение на вход АЦП в том числе и стандартное 1,1V никакого результата. Подавали даже напрямую напряжение батарейки на разные входы - результат одинаковый - в регистрах ADCL,ADCH - нули или около того порядка 5-10 (dec) (скорее всего шумы). Тактовая частота 8 МГц. предделитель АЦП 1/32. Возможно программная ошибка? или всё таки аппаратная ошибка?
domowoj
Без схемы и программы подсказать трудно.
exert
Часть кода отвечающая за работу АЦП. Результат работы АЦП сравнивается с Umin.


.equ Umin =500 ;миниммальное пороговое значение напряжения
;============== Ацп ==========
;Задаём кол-во измерений
ldi r16,0b11100110 ;включение Ацп и Timer/Counter1
sts PRR,r16 ;PRR
ldi r18,0b01100010 ;выбираем 2-ой канал
sts ADMUX,r16 ;ADMUX
ldi r16,0b10000111 ;настройка Ацп
sts ADCSRA,r16 ;ADCSRA
ldi r16,0b00000100
sts DIDR0,r16
;Сделаем 1-ое преобразование (его учитывать не надо, т.к. оно ложное)

ldi r16,0b11000111 ;сделаем 1-ое измерение
sts ADCSRA,r16 ;уст бит "старт преобразования"
;sbi ADCSRA,ADSC
WaitADC1: ;ждём пока выполнится преобразование
lds r16,ADCSRA
sbrs r16,4
rjmp WaitADC1
// sts ADCSRA,r16

lds ZH,ADCH
lds ZL,ADCL
;здесь отсчёт уже сделан
ldi r16,0b11000111 ;сделаем 2-ое измерение
sts ADCSRA,r16 ;уст бит "старт преобразования"
;sbi ADCSRA,ADSC
WaitADC2: ;ждём пока выполнится преобразование
lds r16,ADCSRA
sbrs r16,4
rjmp WaitADC2
// sts ADCSRA,r16
lds ZH,ADCH
lds ZL,ADCL


;=================== Сравнение напряжений =======================
;Установка Umin (YH YL)
;Сравнение напряжений ZH,ZL (U) с Umin
cpi ZH, Umin
brlo LowPower
ae_
Цитата
lds ZH,ADCH
lds ZL,ADCL
;здесь отсчёт уже сделан

When ADCL is read, the ADC Data Register is not updated until ADCH is read. Consequently, if
the result is left adjusted and no more than 8-bit precision is required, it is sufficient to read
ADCH. Otherwise, ADCL must be read first, then ADCH.
tazik
Конструкцию вида:
ldi r16,0xAA
sts ADCSRA,r16
применять нельзя

вместо sts нужна команда out

sts адресует всю SRAM, включая 32 регистра r0-r31, out - только I/O область SRAM. Адреса регистров, перечисленные в файле ...def.inc рассчитаны на применение команд in/out, а не sts/lds

если все-таки хочется использовать команду sts, то к адресу регистра необходимо прибавлять смещение 0x20h (адреса регистров r0-r31)
exert
Цитата(tazik @ May 1 2008, 17:39) *
Конструкцию вида:
ldi r16,0xAA
sts ADCSRA,r16
применять нельзя

вместо sts нужна команда out

sts адресует всю SRAM, включая 32 регистра r0-r31, out - только I/O область SRAM. Адреса регистров, перечисленные в файле ...def.inc рассчитаны на применение команд in/out, а не sts/lds

если все-таки хочется использовать команду sts, то к адресу регистра необходимо прибавлять смещение 0x20h (адреса регистров r0-r31)


регистр ADCSRA и ADMUX не относятся к I/O области. Так что sts тут к месту. Хотя я на всякий случай попробовал с out. С ним вообще программа не компилируется. AVR Studio пишет M:\2008.04\....\Proga.asm(109): error: Operand 1 out of range: 0x7c
Так что проблема не в sts. Но всё равно спасибо.
ae_
Цитату из datasheet в посте №4 не заметили? У Вас порядок чтения ADC неверный.
exert
Заметил smile.gif Буду проверять в железе. Спасибо. Надеюсь проблема только в этом.
tazik
Цитата(exert @ May 1 2008, 22:21) *
регистр ADCSRA и ADMUX не относятся к I/O области. Так что sts тут к месту. Хотя я на всякий случай попробовал с out. С ним вообще программа не компилируется. AVR Studio пишет M:\2008.04\....\Proga.asm(109): error: Operand 1 out of range: 0x7c
Так что проблема не в sts. Но всё равно спасибо.


Скачал pdf на мегу 48. Да, действительно, Вы правы
domowoj
Да, в этих моделях обращение к ряду регистров В\В ТОЛЬКО как к памяти
и в отличии от IN,OUT выполняются за 2 такта.
Дон Амброзио
Цитата(exert @ May 1 2008, 15:16) *
Возможно программная ошибка? или всё таки аппаратная ошибка?

А Вы сами как дуиаете? У тысяч людей, использующих Меги, нет никакой "аппаратной ошибки", а вот Вы такой особенный, что именно у Вас она есть
domowoj
Цитата(ae_ @ May 1 2008, 20:28) *
When ADCL is read, the ADC Data Register is not updated until ADCH is read. Consequently, if
the result is left adjusted and no more than 8-bit precision is required, it is sufficient to read
ADCH. Otherwise, ADCL must be read first, then ADCH.

Поменяли местами ADCL и ADCH, получилось?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.