Программирование AVR AVR128: настройка и использование аналогового компаратора Thu, November 21 2024  

Поделиться

Нашли опечатку?

Пожалуйста, сообщите об этом - просто выделите ошибочное слово или фразу и нажмите Shift Enter.


AVR128: настройка и использование аналогового компаратора Печать
Добавил(а) microsin   

Этот перевод апноута 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.

AVR128-ACO-Polling

Рис. 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.

AVR128-ACI-Polling

Рис. 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.

 

Добавить комментарий


Защитный код
Обновить

Top of Page