Переривання можуть використовуватися для того, щоб змусити мікроконтролер виконувати певні ділянки програми автоматично та дозволяють вирішити проблеми із синхронізацією. Типовими завданнями, що вимагають використання переривань, є зчитування сигналу енкодера або моніторингу керування користувачем.
На Arduino Uno переривання підтримуються на 2 та 3 входах.
Події на вході для спрацювання переривання
- LOW переривання спрацьовує щоразу коли на вході низький рівень
- HIGH переривання спрацьовує щоразу коли на вході високий рівень
- CHANGE переривання спрацьовує щоразу коли на вході рівень змінюється з високого на низький, та з низького на високий
- FALLING переривання спрацьовує щоразу коли на вході рівень змінюється з високого на низький
- RISING переривання спрацьовує щоразу коли на вході рівень змінюється з низького на високий
Схема підключення
Код програми
#include <Arduino.h>
#define LED_PIN 13
volatile bool state = false;
void blink()
{
static unsigned long timer = 0;
if ((millis() - timer) > 50)
{
state = !state;
digitalWrite(LED_PIN, state);
timer = millis();
}
}
void setup()
{
pinMode(LED_PIN, OUTPUT);
attachInterrupt(0, blink, RISING);
}
void loop()
{
delay(10000);
}
В даному прикладі ми вмикаєм та вимикаєм світлодіод при натисканні на кнопку. Програма працює асинхронно і не залежить від основного циклу.
Як прцює
attachInterrupt(0, blink, RISING);
Першим параметром ми передаєм канал переривання (для Arduino Uno 0 канал вхід D2, 1 канал вхід D3). Другим параметром задаєм функцію яка буде виконуватись при спрацювання переривання, в нашому випадку ‘blink’. Третім параметром подію для спрацювання. В нашому випадку зміна статусу світлодіода, увімкнення/вимкнення, відбувається при відпусканні кнопки.
volatile bool state = false;
Ще одна осбливість змінні які використовуються у функцях переривання, повинні бути оголошені з дериктивою ‘volatile‘. Директива ‘volatile‘ вказує компілятору розміщувати змінну в ОЗУ, а не у реєстрах, які використовуються для тимчасового зберігання та обробки змінних. Значення змінних в реєстрах можуть бути не актуальні. Змінну необхідно оголошувати як ‘volatile’ у тих випадках, коли її значення може бути змінено чимось, що не залежить від тієї ділянки коду, в якому вона фігурує (наприклад, потоком який виконується паралельно). Що стосується Arduino, єдине місце, де подібне може статися – це ділянки коду, пов’язані з перериваннями.
void blink()
{
static unsigned long timer = 0;
if ((millis() - timer) > 50)
{
state = !state;
digitalWrite(LED_PIN, state);
timer = millis();
}
}
В самій фунгкції ‘blink‘, захист від бряскіту контактів. Якщо від останього спрацювання переривання пройшло менше 50 мілісекунд, це бряскіт контактів. Якщо більше, змінюєм стан світлодіода та записуєм значення у порт світлодіода. Якщо якісна кнопка, якісна пайка та наявність конденсатора в схемі, час можна зменшити до 3 – 5 мілісекунд.
Також переривання знаходять своє застосування у використанні з датчиком хола.