Переривання – це механізм управління виконанням, який є в більшості мікроконтролерів. Багато подій зовнішнього світу відбуваються асинхронно (т. Е. Не пов’язані з тактовим сигналом): натискання кнопки, посилка байта через послідовний порт, переповнення таймера і т. д. Переривання говорить процесору про те, що сталося якась подія, щоб процесору не потрібно було постійно опитувати цю подію. Наприклад, існують два способи, якими процесор може дізнатися, натиснута кнопка чи ні. Один спосіб – постійно сканувати стан кнопки. Інший – повідомити процесору про натискання кнопки шляхом переривання виконання головної програми.

Якщо пристрій перериває роботу процесора, то виконання головної програми зупиняється і процесор переходить на відповідну процедуру, яка називається ISR (процедура обробки переривання). Після виконання необхідних дій перерване виконання програми поновлюється.

У контролерах AVR є безліч переривань (як синхронних, так і асинхронних). Слід дозволити необхідні переривання і саму можливість переривання. Під час переривань та викликів процедур в стеку зберігається адреса повернення, який є адресою наступної команди в головній програмі. Стек виділяється в пам’яті даних, отже, його розмір обмежений тільки загальним розміром пам’яті і ступенем її завантаження. Всі користувальницькі програми повинні ініціалізувати покажчик стека SP (в підпрограмі скидання, яка виконується до виконання процедур або переривань).

Прототип для переривання

При програмуванні на мові С обробляти переривання просто, оскільки для переривань є процедури під різними іменами і компілятор зберігає вміст регістру стану перед виконанням ISR. Коли процесор переходить на ISR- переривання автоматично забороняються (щоб ніяке інше переривання не могло статися). По завершенні ISR переривання автоматично дозволяються. У мові асемблера повернення з ISR виконується за допомогою команди reti, яка дозволяє переривання (і тим самим відрізняється від оператора ret). Далі показаний приклад включення таймера на мікроконтролері AVR (для переривання за переповненням). Задіяний 8-розрядний таймер TimerO.

// Ініціалізація TimerO

// Дозвіл переривань sei ();

// Установка частоти таймера = fclk / 1024 TCCRO = (1 «CS02) I (1« CS01);

TCNTO = 0x00;

// Дозволяємо переривання по переповнення таймера TIMSK | = (1 «ТО1Е0);

// Визначення процедури переривання по переповненню таймера ISR (TIMER 0_OVF_vec t)

{

PORTD = Oxff; // Звичайні команди і операції <