Периферийный модуль Внешнее Прерывание-EXT_INT может обнаружить и изменение одного из выводов МК с возможным(в последствии) генерированием прерывания,которое можно обработать при помощи подпрограммы обработки прерываний EXT_INT_ISR. Также является одним из самых простых и необходимых периферийных модулей , который может генерировать прерывания.Внешние прерывания прикреплены к выводам INT0,INT1 и INT2 МК. Данные выводы также можно сконфигурировать как выход. Эта характеристика обеспечивает возможность генерировать прерывания прямо в программе посредством изменения значений выводов . На рисунке, представленном ниже , приведён пример генерирования прерывания,путём нажатия кнопки и обработки его подпрограммой обработки прерываний.

Можем увидеть,что,чтобы была вызвана подпрограмма обработки прерываний , необходимо удовлетворение следующих условий:
1) Бит глобального разрешения прерываний - I=1;
2) Прерывание со внешнего вывода-разрешено-INT0=1;
3) А также - INTF0=1;Данный периферийный модуль сравним с модулем GPIO, который реагирует в реальном времени на любое изменение физического вывода, это и есть на самом деле.
Это свойство интеллектуального вывода периферийного модуля EXT_INT может быть использовано для обнаружения изменений бинарного датчика , т.е. появления внешнего физического эффекта.
Например : напряжение, температура, свет и т.д.
Как и для любого периферийного модуля , для данного модуля зарезервирован набор регистров состояния и контроля для конфигурации и работы данного модуля.
Периферийные регистры , из всех 64-х МК AVR , зарезервированные для EXT_INIT следующие:
1)Для разрешения или запрещения внешних прерываний предназначен управляющий регистр GICR (General Interrupt Control Register).
Установка битов INT1, INT0 или INT2 разрешает прерывания при возникновении события на соответствующем выводе микроконтроллера AVR, а сброс — запрещает.
Естественно нужно установить еще и флаг глобального разрешения прерываний - I, который расположен в регистре SREG. Без него вообще ни одно прерывание вызываться не будет.
Внешнее прерывание может происходить по одному из условий:
– по низкому уровню на выводах INT0, INT1,
– по любому изменению логического уровня на выводах INT0, INT1
– по спадающему фронту сигнала на выводах INT0, INT1, INT2,
– по нарастающему фронту на выводах INT0, INT1, INT2.
Пример:
ldi R16, 1<<INT0 // запись значения 0b10000000 в R16 out GICR, R16 // активирование прерывания Int0
sei // глобальное активирование прерываний
чтобы активировать прерывание во время выполнения программы рекомендуется использование команд установки бита в периферийном регистре :
sbi GICR, INT0 // активирование прерывания Int0
GIFR (General Interrupt Flag Register). В нем содержатся флаги, устанавливаемые в случае формирования запроса на внешнее прерывание.Флаги сбрасываются аппаратно, когда вызывается обработчики прерываний. Также их можно сбросить программно, записав в регистр единицы. Причем сброс нужно производить перезаписью регистра GIFR, на не операцией побитового ИЛИ.Неправильно: GIFR |= (1<<INTF1) Правильно: GIFR = (1<<INTF1)Условия генерации прерываний устанавливаются с помощью конфигурационных регистров. Для INT0, INT1 – это регистр MCUCR (MCU Control Register). Для INT2 – MCUCSR (MCU Control and Status Register).
В таблице ниже приведены возможные значения разрядов ISC01, ISC00 и соответствующие им условия генерации внешнего прерывания.
Для прерывания INT1 таблица выглядит аналогично, только управляющие разряды другие — это ISC11 и ISC10.Прерывание INT2 может происходить только по фронтам сигнала, поэтому для установки условий используется всего один бит - это бит ISC2 регистра MCUCSR.Таким образом, в качестве заключения, чтобы настроить систему, как показано выше ,в качестве примера, будут необходимы следующая последовательность в программе ASM.объявление вектора обработки внешних прерываний:... .org INT0addr: // переход по адресу INT0addr в // память программ rjmp INT0_ISR // перенаправление через подпрограмму // обработки прерываний ...Установка и конфигурирование модуля прерываний в разделе инициализации главной программы (прерывание reset):reset:
ldi R16, (1<<ISC01)|(0<<ISC00) // запись значения // 0b00000010 в R16
out MCUCR, R16 // Применение конфигурации модуля // для обнаружения прерываний
cbi DDRD, PIND3 // конфигурирование вывода,как вход
sbi PORTD, PIND3 // подтягивание pull-up резистора на 3-ий пин ldi R16, 1<<INT0 // запись значения 0b10000000 в R16
out GICR, R16 //Активация прерывания Int0 ...Глобальная активация прерываний:sei // глобальная активация прерываний
Бесконечный цикл контроля:
main_loop: // бесконечный цикл контроля ... rjmp main_loop
Подпрограмма обработки прерываний:INT0_ISR: ... ... // тело подпрограммы обработки // прерываний ... reti
Niciun comentariu:
Trimiteți un comentariu