Кто-нибудь сталкивался с некорректной работой АЦП. Подаю разное напряжение на вход АЦП в том числе и стандартное 1,1V никакого результата. Подавали даже напрямую напряжение батарейки на разные входы - результат одинаковый - в регистрах ADCL,ADCH - нули или около того порядка 5-10 (dec) (скорее всего шумы). Тактовая частота 8 МГц. предделитель АЦП 1/32. Возможно программная ошибка? или всё таки аппаратная ошибка?
domowoj
May 1 2008, 11:39
Без схемы и программы подсказать трудно.
Часть кода отвечающая за работу АЦП. Результат работы АЦП сравнивается с 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
Цитата
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.
Конструкцию вида:
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)
Цитата(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. Но всё равно спасибо.
Цитату из datasheet в посте №4 не заметили? У Вас порядок чтения ADC неверный.
Заметил

Буду проверять в железе. Спасибо. Надеюсь проблема только в этом.
Цитата(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
May 2 2008, 04:14
Да, в этих моделях обращение к ряду регистров В\В ТОЛЬКО как к памяти
и в отличии от IN,OUT выполняются за 2 такта.
Дон Амброзио
May 2 2008, 05:53
Цитата(exert @ May 1 2008, 15:16)

Возможно программная ошибка? или всё таки аппаратная ошибка?
А Вы сами как дуиаете? У тысяч людей, использующих Меги, нет никакой "аппаратной ошибки", а вот Вы такой особенный, что именно у Вас она есть
domowoj
May 2 2008, 07:16
Цитата(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, получилось?