Этот перевод апноута AVR128 [1] показывает, как подготовить и использовать встроенный в кристалл микроконтроллера AVR аналоговый компаратор (далее просто компаратор). Соответствующие примеры даны в файле исходного кода на языке ассемблера (avr128.asm):
• Детектирование положительного перепада на выходе компаратора путем опроса бита ACO в регистре состояния и управления компаратором (Analog Comparator Control and Status Register, ACSR). • Детектирование положительного перепада на выходе компаратора путем опроса флага прерывания компаратора (Analog Comparator Interrupt Flag, ACI) в регистре ACSR. • Инициализация прерывания по событию переключения выхода компаратора. В качестве примера дан обработчик прерывания, который просто инкрементирует 16-разрядный счетчик.
[Детектирование положительного перепада опросом ACO]
Эта часть кода показывает тривиальный способ детектирования положительного перепада на выходе компаратора. Из-за своей простоты (используется только 4 слова команд, без какой-либо первоначальной настройки) этот способ может привести к проблемам. Если произойдет короткий импульс на выходе компаратора, когда программа находится в цикле ожидания, то он может быть пропущен, так как напрямую соединен с выходом компаратора. Если пользователю нужно вставить код в цикл ожидания, то вероятность пропустить короткий импульс увеличится. Подобный код мог бы содержать период таймаута, если никакого перепада не произойдет за определенный промежуток времени. Процедура детектирования выглядит следующим образом:
1. Если на выходе лог. 1, то ожидание, пока на выходе не появится лог. 0. 2. Ожидание, пока на выходе не появится лог. 1.
Рис. 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
Параметр |
Значение |
Размер кода |
4 слова (8 байт) |
Время инициализации |
0 |
Время реагирования |
3..5 циклов |
Использование регистров |
нет |
Прерывания |
не используются |
Периферийные устройства |
аналоговый компаратор |
[Детектирование положительного перепада опросом ACI]
Эта часть кода показывает более защищенный и гибкий способ детектирования положительного перепада на выходе компаратора. Даже если прерывание компаратора (Analog Comparator Interrupt, от называния прерывания и пошло название флага прерывания ACI), флаг прерывания ACI все равно будет аппаратно установлен, когда событие на выходе компаратора будет соответствовать настройке битов ACIS1/ACIS0 регистра ACSR. Например, положительный перепад будет всегда устанавливать бит ACI в регистре ACSR, если оба бита ACIS1/ACIS0 установлены в лог. 1 (подробности см. в даташите на используемый микроконтроллер). Флаг ACI покажет, произошло ли событие на выходе компаратора с момента последней очистки флага ACI. В этом апноуте детектирование положительного перепада опросом ACI реализовано следующим образом:
1. Настройка: биты ACIS0 и ACIS1 устанавливаются в лог. 1. 2. Очистка бита ACI путем записи в него лог. 1. 3. Цикл: ожидание пока бит ACI не станет 1. Если бит ACI==1, то переход на шаг 2. 4. Переход на шаг 3.
Рис. 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
Параметр |
Значение |
Размер кода |
5 слов (10 байт) |
Время инициализации |
2 цикла |
Время реагирования |
3..5 циклов |
Использование регистров |
нет |
Прерывания |
не используются |
Периферийные устройства |
аналоговый компаратор |
[Использование прерывания по событию компаратора]
В этом апноуте показано, как разрешить прерывание по событию компаратора. В программе примера показано использование прерывания по переключению компаратора следующим образом:
1. Очистка флага прерывания и битов ACIS1/ACIS0. Сначала нужно очистить флаг прерывания. Если так не сделать, и флаг по какой-то причине был установлен, то ядро AVR немедленно начнет выполнять обработчик прерывания, когда прерывания будут разрешены. Очистка ACIS1/ACIS0 настраивает прерывание по переключению выхода компаратора. 2. Разрешение глобальных прерываний (установкой общего флага разрешения прерываний). 3. Разрешение прерывания компаратора (Analog Comparator Interrupt) путем установки бита ACIE в регистре ACSR.
Имейте в виду, что поскольку регистр 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. Параметры эффективности алгоритма работы с компаратором по прерываниям.
Параметр |
Значение |
Размер кода |
4 слова (8 байт) |
Время выполнения |
5 циклов |
Использование регистров |
1 регистр в старших адресах |
Прерывания |
по событию на выходе аналогового компаратора |
Периферийные устройства |
аналоговый компаратор |
[Ссылки]
1. AVR128: Setup and Use the Analog Comparator site:atmel.com. |