Прерывание – процесс, нарушающий выполнение нормального хода программы. Прерывания инициируются внутренними или внешними событиями микроконтроллера. При возникновении прерывания микроконтроллер сохраняет в стеке содержимого счетчика команд PC и загружает в него адрес соответствующего вектора прерывания, в котором, как правило, содержится команда безусловного перехода к подпрограмме обработки прерывания. Последней командой подпрограммы – обработчика прерываний должна быть команда reti, которая обеспечивает возврат в основную программу путем восстановления значения предварительно сохраненного счетчика команд.
Вектор прерывания представляет собой адрес процедуры обработки прерывания. Вектора прерываний от разных источников объединены структуру, называемую таблицей векторов прерываний. В микроконтроллере AVR АТMEGA 128 таблица векторов прерываний находится, начиная с адреса 0002h. Положение вектора в таблице прерываний определяет приоритет соответствующего прерывания, который уменьшается с увеличением адреса в таблице прерывания (чем меньше адрес – тем выше приоритет). Размещение векторов прерываний микроконтроллера AVR АТMEGA 128 приводится в таблице 4.1. Регистр состояния SREG аппаратно не обрабатывается процессором, как при вызове подпрограмм, так и при обслуживании прерываний. Если программа требует сохранения SREG, то это должно производиться программой пользователя.
Таблица 4.1 – Номера векторов прерываний и идентификаторы процедур-обработчиков прерываний микроконтроллера AVR АТMEGA 128.
Номер вектора | Адрес | Источник прерывания | Идентификатор прерывания | Описание прерывания |
0000h | RESET | Вывод сброса, отключение электропитания, сброс от сторожевого таймера | ||
0002h | INT0 | EXT_INT0 | Внешнее прерывание по линии запроса 0 | |
0004h | INT1 | EXT_INT1 | Внешнее прерывание по линии запроса 1 | |
0006h | INT2 | EXT_INT2 | Внешнее прерывание по линии запроса 2 | |
0008h | INT3 | EXT_INT3 | Внешнее прерывание по линии запроса 3 | |
000Аh | INT4 | EXT_INT4 | Внешнее прерывание по линии запроса 4 | |
000Сh | INT5 | EXT_INT5 | Внешнее прерывание по линии запроса 5 | |
000Еh | INT6 | EXT_INT6 | Внешнее прерывание по линии запроса 6 | |
0010h | INT7 | EXT_INT7 | Внешнее прерывание по линии запроса 7 | |
0012h | TIMER2 COMP | TIM2_COMP | Совпадение таймера/счетчика Т2 | |
0014h | TIMER2_OVF | TIM2_OVF | Переполнение таймера/счетчика Т2 | |
0016h | TIMER1 CAPT1 | TIM1_CAPT | Захват таймера/счетчика Т1 | |
0018h | TIMER1 COMP1 | TIM1_COMPA | Совпадение «А» таймера/счетчика Т1 | |
001Аh | TIMER1 COMPB | TIM1_COMPB | Совпадение «В» таймера/счетчика Т1 | |
001Сh | TIMER1 OVF | TIM1_OVF | Переполнение таймера/счетчика Т1 | |
001Еh | TIMER0 COMP | TIM0_COMP | Совпадение таймера/счетчика Т0 | |
0020h | TIMER0 OVF | TIM0_OVF | Переполнение таймера/счетчика Т0 | |
0022h | SPI STC | SPI_STC | Передача данных по SPI закончена | |
0024h | USART0 RXC | USART0_RXC | Прием по интерфейсу UART0 завершен | |
0026h | USART0 DRE | USART0_DRE | Регистр данных UART0 пуст | |
0028h | USART0 TXC | USART0_TXC | Передача по USART0 завершена | |
002Аh | ADC INT | ADC_INT | Преобразование АЦП завершено | |
002Сh | EE RDY | EE_RDY | Прерывание при готовности EEPROM | |
002Еh | ANA COMP | ANA_COMP | Прерывание от аналогового компаратора | |
0030h | TIMER1 COMPC | TIM1_COMPC | Совпадение «С» таймера-счетчика Т1 | |
0032h | TIMER3 CAPT | TIM3_CAPT | Захват таймера-счетчика Т3 | |
0034h | TIMER3_COMPA | TIM3_COMPA | Совпадение «А» таймера-счетчика Т3 | |
0036h | TIMER3_COMPB | TIM3_COMPB | Совпадение «В» таймера-счетчика Т3 | |
0038h | TIMER3_COMPC | TIM3_COMPC | Совпадение «В» таймера-счетчика Т3 | |
003Аh | TIMER3_OVF | TIM3_OVF | Переполнение таймера-счетчика Т3 | |
003Сh | USART1_RXC | USART1_RXC | Прием по интерфейсу UART1 завершен | |
003Еh | USART1_DRE | USART1_DRE | Регистр данных UART1 пуст | |
0040h | USART1_TXC | USART1_TXC | Передача по USART1 завершена | |
0042h | TWI | TWI | Прерывание от модуля TWI | |
0044h | SPM_RDY | SPM_RDY | Готовность SPM |
Функция – обработчик прерывания записывается в компиляторе Code Vision AVR С в соответствие со следующими правилами:
interrupt [ идентификатор прерывания ]
тип возвращаемого значения имя функции (список аргументов)
{
тело функции обработки прерывания
}
Пример декларации обработчика прерывания ADC_INT по вектору 002Аh, которое вырабатывается при завершении преобразования АЦП:
interrupt [ADC_INT] void adc_interrupt ( void )
{
тело функции обработки прерывания
}
Минимальное время реакции прерывание составляет 4 периода тактовой частоты, в результате которых значение программного счетчика записывается в стек, а указатель стека уменьшается на 2. После этого выполняется относительный переход на подпрограмму (функцию), обрабатывающую данное прерывание. Если прерывание происходит во время выполнения команды длящейся несколько циклов, перед вызовом прерывания завершается выполнение этой команды. Выход из программы обслуживания прерывания занимает 4 периода актовой частоты, во время которых из стека восстанавливается значение программного счетчика. После выхода из прерывания процессор всегда выполняет еще одну команду, прежде чем обслужить любое отложенное прерывание.