Переривання це подія, при якому відбувається призупинення основної програми і перехід на виконання підпрограми переривання. Щоб дізнатися, які ж є переривання в МК, необхідно відкрити Datasheet мікроконтролера та зайти на вкладку Interrupts і там на самому початку побачимо таблицю векторів переривань. Наприклад, для МК Atmega8 вона виглядає як наведено в табл.1.
У кожному векторі переривання знаходиться команда переходу з адресою початку підпрограми переривання. Будь-яка програма починається з Reset, в якому знаходиться команда переходу до блоку ініціалізації. А далі, кожне переривання налаштований на якусь подію і при спрацьовуванні цієї події програма переходить до сценарію обробки цього переривання. Видно, що кожному перериванню відповідає свій вектор переривання. Чим вище адреса переривання, тим нижчий пріоритет переривання. Тобто в черзі переривань, переривання з великим пріоритетом будуть виконуватись раніше. Якщо почалася обробка якого-небудь переривання, жодне інше переривання не може бути викликано, навіть з більшим пріоритетом. Інакше виходив би рекурсивний (нескінченний) виклик обробників переривань і складніше було б відстежити роботу програми.
При виклику обробника будь-якого переривання біт глобального дозволу переривань I регістра SREG (status register - регістр стану) скидається в "0" і тільки по завершенні обробки переривання знову встановлюється в "1" і дозволяє почати обробку наступного переривання в черзі. Щоб встановити примусово цей біт існує функція sei(), а щоб скинути - cli(). При запуску програми цей біт завжди скинутий і щоб переривання спрацьовували його потрібно встановити (викликати sei()).
Отже, у цьому параграфі нас будуть цікавити тільки зовнішні переривання, тобто переривання, що виникають при зміні стану певних входом МК. З таблиці векторів переривань видно, що у МК ATmega8 таких переривань 2 - INT0 і INT1 і їх пріоритет вище інших переривань. При детальному розгляді Datasheet External Interrupts і виявляємо, що для налаштування цих переривань потрібно скористатися регістром MCUCR (MCU Control Register - регістр управління) і GICR (General Interrupt Control Register - загальний регістр управління перериваннями). Розглянемо їх детальніше.
Також будь-яке переривання має свій прапор переривання. Цей прапор встановлюється в "1" у момент, коли мало відбутися переривання, навіть якщо переривання глобально заборонені і відповідна програма обробки переривання не викликається. Можна, наприклад, усередині якого-небудь обробника переривання по цьому прапору перевіряти було якесь переривання чи ні. Прапори зовнішніх переривань є 7-м і 6-м бітами регістра GIFR. Прапори переривань скидаються записом у них "1".
Регістр GIFR
Біт 7 - INTF1: Прапор зовнішнього переривання 1.
Біт 6 - INTF0: Прапор зовнішнього переривання 0.
Розглянемо приклад роботи з перериванням. На рис.1 наведена принципова схема пристрою. У нормальному режимі світлодіод D2 світиться, а світлодіод D1 – ні. Якщо натиснути кнопку то навпаки, світлодіод D2 не буде світитися, а світлодіод D1 – буде. Розглянемо програму зроблену у середовищі CodeVisionAVR, що реалізує даний пристрій.