Переривання на Arduino (interrupt)

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

На Arduino Uno переривання підтримуються на 2 та 3 входах.

Події на вході для спрацювання переривання

  • LOW переривання спрацьовує щоразу коли на вході низький рівень
  • HIGH переривання спрацьовує щоразу коли на вході високий рівень
  • CHANGE переривання спрацьовує щоразу коли на вході рівень змінюється з високого на низький, та з низького на високий
  • FALLING переривання спрацьовує щоразу коли на вході рівень змінюється з високого на низький
  • RISING переривання спрацьовує щоразу коли на вході рівень змінюється з низького на високий

Схема підключення

button-cheme-1

Код програми

#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 мілісекунд.

Також переривання знаходять своє застосування у використанні з датчиком хола.

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *