duminică, 17 noiembrie 2013

Периферийный модуль Внешнее Прерывание - EXT_INT


Периферийный модуль Внешнее Прерывание-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