AVR128: настройка и использование аналогового компаратора |
![]() |
Добавил(а) microsin | ||||||||||||||||||||||||||||||||||||||||
Этот перевод апноута AVR128 [1] показывает, как подготовить и использовать встроенный в кристалл микроконтроллера AVR аналоговый компаратор (далее просто компаратор). Соответствующие примеры даны в файле исходного кода на языке ассемблера (avr128.asm): • Детектирование положительного перепада на выходе компаратора путем опроса бита ACO в регистре состояния и управления компаратором (Analog Comparator Control and Status Register, ACSR). [Детектирование положительного перепада опросом ACO] Эта часть кода показывает тривиальный способ детектирования положительного перепада на выходе компаратора. Из-за своей простоты (используется только 4 слова команд, без какой-либо первоначальной настройки) этот способ может привести к проблемам. Если произойдет короткий импульс на выходе компаратора, когда программа находится в цикле ожидания, то он может быть пропущен, так как напрямую соединен с выходом компаратора. Если пользователю нужно вставить код в цикл ожидания, то вероятность пропустить короткий импульс увеличится. Подобный код мог бы содержать период таймаута, если никакого перепада не произойдет за определенный промежуток времени. Процедура детектирования выглядит следующим образом: 1. Если на выходе лог. 1, то ожидание, пока на выходе не появится лог. 0. Рис. 1. Алгоритм опроса ACO. ;*************************************************************************** ;* wait_edge1 ;* ;* Этот кусок кода демонстрирует ожидание события, когда на выходе ;* компаратора (бит ACO в регистре ACSR) появится лог. 1. Такой способ ;* работы с компаратором не требует никакой предварительной настройки, ;* однако очень короткие импульсы на выходе компаратора могут быть ;* пропущены, потому что программа проходит выполнение 3 циклов ядра ;* между каждой проверкой бита выхода компаратора. Другим недостатком ;* является то, что программа сначала ждет, чтобы на выходе появился ;* лог. 0 - когда при начале опроса на выходе пока имеется лог. 1. ;*************************************************************************** wait_edge1: sbic ACSR,ACO ;если на выходе лог. 1, rjmp wait_edge1 ; то ожидание we1_1: sbis ACSR,ACO ;если на выходе лог. 0, rjmp we1_1 ; то ожидание Таблица 1. Параметры эффективности алгоритма опроса ACO
[Детектирование положительного перепада опросом ACI] Эта часть кода показывает более защищенный и гибкий способ детектирования положительного перепада на выходе компаратора. Даже если прерывание компаратора (Analog Comparator Interrupt, от называния прерывания и пошло название флага прерывания ACI), флаг прерывания ACI все равно будет аппаратно установлен, когда событие на выходе компаратора будет соответствовать настройке битов ACIS1/ACIS0 регистра ACSR. Например, положительный перепад будет всегда устанавливать бит ACI в регистре ACSR, если оба бита ACIS1/ACIS0 установлены в лог. 1 (подробности см. в даташите на используемый микроконтроллер). Флаг ACI покажет, произошло ли событие на выходе компаратора с момента последней очистки флага ACI. В этом апноуте детектирование положительного перепада опросом ACI реализовано следующим образом: 1. Настройка: биты ACIS0 и ACIS1 устанавливаются в лог. 1. Рис. 2. Алгоритм опроса ACI. ;*************************************************************************** ;* wait_edge2 ;* ;* Этот кусок кода демонстрирует ожидание, пока флаг ACI в регистре ACSR ;* не зафиксирует появление на выходе компаратора лог. 1. Это более защищенное ;* решение, чем простой опрос бита ACO, потому что опрашивается флаг прерывания. ;* Это позволит пользователю добавить свой код в цикл ожидания, потому что ;* аппаратура "запомнит" даже самые короткие импульсы, которые меньше интервала ;* между опросами. Другое достоинство этого способа - теперь не нужно ждать ;* пока на выходе появится лог. 0. ;*************************************************************************** wait_edge2: ;***** начальная настройка аппаратуры (предполагается, что после сброса ACIE = 0) sbi ACSR,ACIS0 sbi ACSR,ACIS1 ;разрешить прерывание по фронту на выходе компаратора sbi ACSR,ACI ;запись лог. 1 в флаг ACI для его очистки we2_1: ;----------------------- здесь начинается код пользователя sbis ACSR,ACI ;если ACI в лог. 0, rjmp we2_1 ; то ожидание Таблица 2. Параметры эффективности алгоритма опроса ACO
[Использование прерывания по событию компаратора] В этом апноуте показано, как разрешить прерывание по событию компаратора. В программе примера показано использование прерывания по переключению компаратора следующим образом: 1. Очистка флага прерывания и битов ACIS1/ACIS0. Сначала нужно очистить флаг прерывания. Если так не сделать, и флаг по какой-то причине был установлен, то ядро AVR немедленно начнет выполнять обработчик прерывания, когда прерывания будут разрешены. Очистка ACIS1/ACIS0 настраивает прерывание по переключению выхода компаратора. Имейте в виду, что поскольку регистр ACSR находится в области 32 младших регистров ввода вывода, то можно использовать инструкцию SBI для установки, очистки и тестирования отдельных бит. .def temp =r16 ;регистр для временного хранения .def cntL =r17 ;регистр для младшего байта счетчика .def cntH =r18 ;регистр для старшего байта счетчика ;***** Векторы прерывания rjmp RESET ;переход на обработчик сброса .org ACIaddr rjmp ANA_COMP ;переход на обработчик прерывания Analog Comparator ;*************************************************************************** ;* ANA_COMP ;* ;* Это код обработчика прерывания, который обрабатывает событие на выходе ;* компаратора, настроенное битами ACIS1/ACIS0 регистра ACSR. Прерывание ;* сработает, когда установится флаг ACI в регистре ACSR, если разрешено ;* прерывание компаратора установкой бита ACIE. Обработчик прерывания ;* в целях демонстрации просто инкрементирует 16-битный счетчик. ;*************************************************************************** .def ac_tmp =r0 ;временное хранилище для SREG ANA_COMP: in ac_tmp,SREG ;сохранение регистра состояния (Status register) subi cntL,low(-1) sbci cntH,high(-1) ;counter = counter + 1 out SREG,ac_tmp ;восстановление Status register reti RESET: ... ;*************************************************************************** ;* ana_init ;* ;* В этом коде разрешается прерывание компаратора (Analog Comparator Interrupt), ;* чтобы оно срабатывало по переключению выхода компаратора. После всех настроек ;* программа переходит в пустой бесконечный цикл. Перед разрешением прерывания ;* очищается 16-разрядный счетчик прерываний. ;*************************************************************************** .def temp =r16 ;регистр для временного хранения ana_init: ;***** очистка 16-разрядного счетчика cntH:cntL clr cntL clr cntH ;***** Разрешение прерывания (предполагается, что после сброса ACIE = 0) ldi temp,(ACI<<1) ;очистка флага прерывания и битов ACIS1/ACIS0 out ACSR,temp ; для настройки срабатывания прерывания ; по переключению выхода компаратора sei ;общее разрешение прерываний sbi ACSR,ACIE ;разрешить прерывание от Analog Comparator forever: rjmp forever Таблица 3. Параметры эффективности алгоритма работы с компаратором по прерываниям.
[Ссылки] 1. AVR128: Setup and Use the Analog Comparator site:atmel.com. |