Переривання - це сигнал, який повідомляє процесору про настання якої-небудь події, яке вимагає негайної уваги. Процесор повинен відреагувати на цей сигнал, перервавши виконання поточних інструкцій і передавши управління оброблювачу переривання (ISR, Interrupt Service Routine). Оброблювач - це звичайна функція, яку ми пишемо самі і поміщаємо туди той код, який повинен відреагувати на подію. Після обслуговування переривання ISR функція завершує свою роботу і процесор із задоволенням повертається до перерваних занять - продовжує виконувати код з того місця, в якому зупинився. Все це відбувається автоматично, тому наше завдання полягає тільки в тому, щоб написати обробник переривання, нічого при цьому не зламавши і не змушуючи процесор занадто часто відволікатися на нас. Знадобиться розуміння схеми, принципів роботи пристроїв, що підключаються і уявлення про те, як часто може бути викликане переривання, які особливості його виникнення. Все це і становить основну складність роботи з перериваннями.
Апаратні та програмні переривання
Переривання в Ардуіно можна розділити на кілька видів:
- апаратні переривання. Переривання на рівні мікропроцесорної архітектури. Саме подія може відбутися в продуктивний момент від зовнішнього пристрою - наприклад, натискання кнопки на клавіатурі, рух комп'ютерної миші і т.п.
- Програмні переривання. Запускаються всередині програми за допомогою спеціальної інструкції. Використовуються для того, щоб викликати оброблювач переривань.
- Внутрішні (синхронні) переривання. Внутрішнє переривання виникає в результаті зміни або порушення у виконанні програми (наприклад, при зверненні до неприпустимого адресою, неприпустимий код операції та інші).
Апаратні переривання виникають у відповідь на зовнішнє подія і виходять від зовнішнього апаратного пристрою. У Ардуіно представлені 4 типи апаратних переривань. Всі вони розрізняються сигналом на контакті переривання:
- Контакт притягнутий до землі. Оброблювач переривання виповнюється доти, поки на піне переривання буде сигнал LOW.
- Зміна сигналу на контакті. В такому випадку Ардуіно виконує обробник переривання, коли на піне переривання відбувається зміна сигналу.
- Зміна сигналу від LOW до HIGH на контакті - при зміні з низького сигналу на високий буде виконуватися обробник переривання.
- Зміна сигналу від HIGH до LOW на контакті - при зміні з високого сигналу на низький буде виконуватися обробник переривання.
Основними причинами, за якими необхідно викликати переривання, є:
- Визначення зміни стану виводу;
- Переривання по таймеру;
- Переривання даних по SPI, I2C, USART;
- Аналогово-цифрове перетворення; Готовність використовувати EEPROM, флеш-пам'ять.
Залежно від апаратної реалізації конкретної моделі мікроконтролера є кілька переривань. Плата Arduino Uno має 2 переривання на другому і третьому піне, але якщо потрібно більше двох виходів, плата підтримує спеціальний режим «pin-change». Цей режим працює зі зміни входу для всіх пинов. Відмінність режиму переривання по зміні входу полягає в тому, що переривання можуть генеруватися на будь-якому з восьми контактів. Обробка в такому випадку буде складніше і довше, так як доведеться відстежувати останній стан на кожному з контактів. На інших платах число переривань більше. Наприклад, плата Ардуіно Мега 2560 має 6 пінів, які можуть обробляти зовнішні переривання. Для всіх плат Ардуіно при роботі з функцією attachInterrupt (interrupt, function, mode) аргумент Inerrupt 0 пов'язаний з цифровим піном 2.