Програмування мікроконтролерів

Ще одна тема для новачків: переривання.

Багато хто з новачків чув про це, але зрозуміти, що це таке і з чим це їдять і як це застосовувати і навіщо це потрібно — не знають. А коли розуміють, що це таке і як це потрібно застосовувати, то планка знань та рішень готових реалізацій піднімається набагато вище.

Розглянемо мікроконтролер від Атмел ATtiny13A, як найпростіший і доступніший. Середовище розробки – CodeVisionAVR.

Якщо описати простою мовою, то переривання, це зупинення загального циклу програми за якоюсь подією та виконання після цього шматка коду програми в рамках переривання.

У мікроконтролера є багато різних переривань. спрацьовують від різних умов. Коли є багато переривань, необхідні правила їх виконання при одночасному спрацьовуванні умов їх виконання — пріоритет. Якщо одночасно наступають події, що одночасно викликають різні переривання, то виконуватися почне те, у якого вище пріоритет — яке головніше. Пріоритет переривань описується цифрою. Чим менше пріоритет прірвання, тим пріоритетніше виконання переривання. Англійською це називається Interrupt Vectors — вектор переривань.

Із життєвої ситуації можна описати так:

У датасіті докладно описаний принцип роботи в режимі переривання, що виконується при вході в переривання, що робиться з регістрами і пам'яттю і за скільки тактів процесора.

Вектор переривань описується в таблиці Interrupt Vectors, зараз опишемо, що вони означають:

виконання

Найголовніше переривання нульове - RESET. Адреса його нульова — вектор номер один. Джерело переривання - скидання мікроконтролера по ресету від входу RESET, від провалу напруги по живленню, якщо ативен фьюзBrown-out Reset та від спрацьовування сторожового таймера. Тут все й так зрозуміло.

Вектор два: INT0 — переривання зовнішнього входу INT0. У ATTiny13 це п'ята ніжка PB0. Ніжку INT0 можна налаштувати на спрацьовування на виконання переривання, наскільки я пам'ятаю, по фронту сигналу, спаду або зміни сигналу - і фронт і спад. Я, наприклад, застосовую це переривання за необхідності виконати точний підрахунок тривалості імпульсу до виконання алгоритму розподілу чи множення частоти.

Вектор три: PCINT0 - переривання зі зміни стану по входах PB0 - PB5 (PCINT0 - PCINT5), коротше кажучи всі ніжки мікроконтролера при цьому можна застосувати для виконання цього переривання. Один із моїх улюблених переривань, використовую його в основному для пробудження зі сну зі зміни на входах, коли мікроконтролер спить.