Переривання – процес, що порушує виконання нормального ходу програми. Переривання ініціюються внутрішніми або зовнішніми подіями мікроконтролера. При виникненні переривання мікроконтролер зберігає в стеці вміст лічильника команд 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 періоди актової частоти, під час яких зі стека відновлюється значення програмного лічильника. Після виходу з переривання процесор завжди виконує ще одну команду, перш ніж обслужити будь-яке відкладене переривання.