Просьба сразу ногами не пинать (ну только если в нужном направлении
- Вложения
-
- 2.zip
- (44.98 КБ) 294 скачивания
Во-первых каков алгоритм преобразования, никак не пойму зачем умножать результат на 5?. Чтобы получить значение напряжения, действующего на входе АЦП нужно число, получившееся после преобразования (назовем это число ADC) умножить на Опорное напряжение и поделить на 2 возведенное в степень разрядности АЦП (в нашем случае 10) т. е. Vin=ADC*Vref/1024. Из вашего ассемблерного листинга совсем не ясно как вы делаете преобразование.Sannex писал(а):Значит вот в чем суть: после ацп преобразования мы получаем 10 битный результат (от 0 до 1023). Вопрос такой - если я подаю на вход 5В (при этом опорное напряжение = 5В), то после умножения результата на 5 и перекодировки в 4-х значное 2-10-е число, я получаю 5,115. Подскажите как выйти на показание 5,000В: что нужно сделать программно - вычесть какую-либо константу или что-то еще.. Проект для КодеВижн и Протеус прилагаю.
Просьба сразу ногами не пинать (ну только если в нужном направлении), т.к. только въезжаю в эту кухню.
Код: Выделить всё
sbi ADCSRA, 6Правильно, а какой код следует за командой ? Там же у вас обработчик прерывания от АЦП начинается, естественно контроллер его и будет выполнять, а после этого вернется из прерывания в никуда, странно как вообще программа работает. Чтобы контроллер ничего не делал нужно либо отправить его спать как вы правильно заметили, либо зациклить на одном месте, например такSannex писал(а): После команды
sbi ADCSRA, 6
по идее желательно бы контроллер отправить спать, а в данном случае он идет выполнять код до тех пор, пока не настанет прерывание от ацп
Код: Выделить всё
sbi ADCSRA, 6
rjmp PCКод: Выделить всё
sbi ADCSRA, 6
retiОбычно я не пишу готовый код, а пытаюсь подсказать так, чтобы человек сам до этого дошел, но сегодня что-то лень другими делами заниматься, поэтому попробую, как напишу выложу.Vin=ADC*Vref/1024 - по поводу этой формулы, не могли бы показать ее в коде?
я так понимаю после установки бита и перехода к команде rjmp PC произойдет переход на тоже самое место - rjmp PC?sbi ADCSRA, 6
rjmp PC
PC- Programm Counter , по-русски действительно счетчик команд.Sannex писал(а): если правильно понял, то РС - системный счетчик, или счетчик команд, или как он там правильно зовется...
Код: Выделить всё
; r4 = 5, r17r16 = ADCH:ADCL в r4 число на которое умножаем
; в r17 и r16 старший и младший байты результата аналого-цифрового преобразования (смещение правое)
; результат в R9:r8
mul r4,r16
movw r8,r0
mul r4,r17
add r8,r0
adc r9,r1 ; результат в r9:r8
Код: Выделить всё
Вот примерный код, который будет нормировать результат к 5000 мВ (миливольт)
mul r4,r16
movw r8,r0
mul r4,r17
add r8,r0
adc r9,r1
movw r4, r8 ;кидаем результат умножения на 5 в пару r5:r4
ldi r17, high(64000)
ldi r16, low(64000)
call scale16uu
;после выполнения подпрограммы результат будет в r9:r8, его нужно преобразовать из бинарной формы
; в двоично-десятичную и вывести на индикаторНе совсем понятно. Буду идти по строчкам:;
r4 = 5, r17r16 = ADCH:ADCL в r4 число на которое умножаем
; в r17 и r16 старший и младший байты результата аналого-цифрового преобразования (смещение правое)
; результат в R9:r8
mul r4,r16
movw r8,r0
mul r4,r17
add r8,r0
adc r9,r1 ; результат в r9:r8
Так и быть поясню, но затем вы уж прочитайте пожалуйста AVR Instruction Set (можно скачать по адресу www.atmel.com/atmel/acrobat/doc0856.pdf - около 1,3 МБ.) а также помощь в АВРСтудии по atmel AVR assembler.Sannex писал(а):
Не совсем понятно. Буду идти по строчкам:
1. я так понимаю, что после команды mul r4,r16 результат сохраняется в регистре r0, или в паре регистров - r0:r1?;
Если вы про команду movw r8,r0 , то при выполнении ее скопируется пара r1:r0 в пару r9:r8, т. е. ничего не потреяется.Допустим, что в r16=1111 1111, тогда при умножении на 5, получим
1 0011 1111 1011 - как нам это поместить в r8? или же в r8 ляжет только 1111 1011, но тогда остальное потеряется, или нет?
Эта запись означает следующее: загрузить в r17 старший байт константы 64000, загрузить в r16 младший байт константы 64000И еще, можно пояснить запись:
ldi r17, high(64000)
ldi r16, low(64000)
Вы совершенно правы. Вообщем все получилось 5ть вольт каким-то макаром на LCD высветилоa_skr писал(а):хотя по даташиту: The minimum value represents GND and the maximum value represents the voltage on
the AREF pin minus 1 LSB.
т.о. мы не должны получить 5В никогда.
Округление, округление...Вообщем все получилось 5ть вольт каким-то макаром на LCD высветило
