Аналого-цифровой преобразователь запускается установкой бита ADSC
(ADc Start Conversion) в регистре управления ADCSRA
на 1. Это делается линиями
lds rmp, ADCSRA
ori rmp, (1<<ADSC)
sts ADCSRA, rmp
.бит остается на 1, пока происходит преобразование.Как только преобразование выполнено, АЦП устанавливает бит в 0, чтобы обозначить этот факт.
Затем программа проверяет этот бит, чтобы узнать, когда преобразование завершено.Это цель цикла loopx
:
loopx: ; start of loop
lds rmp, ADCSRA ; load ADCSRA into register rmp
sbrc rmp, ADSC ; conditionnally skip next instruction
rjmp loopx ; jump back to the start of the loop
Инструкция sbrc
(Пропустить, если бит в регистре сброшен) проверяет бит 6 (это значение ADSC) регистра rmp
,Если этот бит равен нулю, он пропускает следующую инструкцию rjmp
, тем самым выходя из цикла.Таким образом, цикл завершается, когда преобразование АЦП завершено.
Может быть несколько причин, по которым это не работает в вашей настройке.Если вы используете эмулятор, возможно, он неправильно эмулирует работу АЦП.Затем, если вы установите бит ADSC
в 1, он останется равным 1, что делает цикл бесконечным.
Другая возможность состоит в том, что вы не подождали достаточно долго.Первое преобразование после включения АЦП занимает 3200 циклов ЦП с вашими настройками.Это 640 итераций цикла.Если вы выполняете отдельные шаги в отладчике, это может быть слишком долго для вашего терпения.