Функція attachInterrupt()

Документація

attachInterrupt()


Цифрові піни з перериваннями
Першим параметром функції attachInterrupt є номер переривання. Як правило, слід скористатися функцією digitalPinToInterrupt(пін), щоб перемістити фактичний цифровий пін до визначеного номера переривання. Наприклад, при підключенні піна 3 використовуйте digitalPinToInterrupt(3) як перший параметр attachInterrupt.

ПлатаЦифрові піни, що використовуються для переривань
Uno, Nano, Mini та інші 328-базовані2, 3
Mega, Mega2560, MegaADK2, 3, 18, 19, 20, 21
Micro, Leonardo та інші 32u4-базовані0, 1, 2, 3, 7
Zeroвсі цифрові піни, крім 4
MKR1000 Rev.10, 1, 4, 5, 6, 7, 8, 9, A1, A2
Dueвсі цифрові піни
101всі цифрові піни

Примітка

Всередині функції attached функція delay() не працюватиме, і значення, повернене функцією millis(), не збільшуватиметься. Послідовні дані, отримані від функції, можуть бути втрачені.Потрібно оголосити як volatile будь-які змінні, які Ви змінюєте в межах функції attached. Для деталей подивіться блок про процедуру опрацювання переривань.

Використання переривань

Переривання корисні для того, щоб змушувати речі відбуватися автоматично у програмах мікроконтролера. Вони можуть допомогти вирішити деякі проблеми з розрахунком часу. Хороший приклад застосування переривань — зчитування поворотного енкодера, відстеження даних, що вводяться користувачем.

Якщо Ви хочете переконатися, що програма завжди відловлює імпульси з поворотного енкодера (і ніколи не пропустить імпульс), буде дуже складно написати програму, яка б робила щось ще, оскільки програмі потрібно буде постійно опитувати лінії датчика для енкодера, для того, щоб ловити імпульси, коли вони відбулися. Інші датчики мають схожий динамічний інтарфейс, як-от спроби зчитати сенсор звуку, який намагається вловити клацання, або спроби інфрачервоного щілинного датчика (фото-переривача) виявити падіння монет. У всіх цих ситуаціях використання переривань може звільнити мікроконтролер, щоб він міг виконувати інші операції, не втрачаючи вхідні дані.

Про процедури опрацювання переривань (ISR)

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

Загалом процедури опрацювання переривань мають бути настільки короткі та швидкі, наскільки це можливо. Якщо Ваш скетч використовує кілька процедур опрацювання переривань, лише одна може запускатися за раз, інші переривання виконуватимуться лише після того, як перше закінчиться. Порядок виконання функцій залежить від їх пріоритетності. millis() використовує переривання для підрахунку, тому вона ніколи не буде збільшуватися всередині процедур опрацювання переривань. Оскільки delay() вимагає, щоб переривання працювали, вона не працюватиме, якщо буде всередині процедури опрацювання переривань. micros() спочатку працює, але почне поводитися хаотично після 1-2 мс. delayMicroseconds() не використовує лічильників, тому працюватиме нормально.

Зазвичай глобальні змінні використовуються для передавання даних між процедурою опрацювання переривань та головною програмою. Щоб переконатися, що змінні поділені між процедурою опрацювання переривань та головною програмою правильно, треба оголосити їх як volatile.

Синтаксис

attachInterrupt(digitalPinToInterrupt(пін), ISR, режим) — рекомендується
attachInterrupt(переривання, ISR, режим) — не рекомендується
attachInterrupt(пін, ISR, режим) — не рекомендується, лише для Arduino Due, Zero, MKR1000, 101

Параметри

переривання:    номер переривання (int)
пін:    номер піна(лише для Arduino Due, Zero, MKR1000)
ISR:    ISR викликається, коли відбувається переривання, ця функція не бере жодних параметрів та нічого не повертає. Іноді
вказується словами interrupt service routine.
режим:    визначає, коли має бути запущено переривання. Чотири константи визначені і є допустимими значеннями:
 
  • LOW — щоб запускати переривання, коли стан піна low;
 
  • CHANGE — щоб запускати переривання, коли пін змінює значення;
 
  • RISING — щоб запускати переривання, коли стан піна змінюється від low до high;
 
  • FALLING — щоб запускати переривання, коли стан піна змінюється від high до low.
 Для плати Due також є режим:
 
  • HIGH, який дозволяє запускати переривання, коли стан піна high
(лише для Arduino Due, Zero, MKR1000)

Повертає

нічого

Приклад

const byte ledPin = 13;
const byte interruptPin = 2;
volatile byte state = LOW;
 
void setup() {
  pinMode(ledPin, OUTPUT);
  pinMode(interruptPin, INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(interruptPin), blink, CHANGE);
}
 
void loop() {
  digitalWrite(ledPin, state);
}
void blink() {
  state = !state;
}


Номери переривань

Зазвичай краще використовувати digitalPinToInterrupt(pin), ніж поміщати номер піна прямо у Ваш скетч. Визначені піни з перериваннями та їхні позначення номерів переривань змінюються на кожному типі плати. Пряме використання номерів переривань видається простим, але воно може викликати проблеми з сумісністю, коли скетч запускатиметься на іншій платі.

Проте старіші скетчі часто мають прямі номери переривань. Часто використовувалися число 0 (для цифрового піна 2) або число 1 (для цифрового піна 3). Таблиця нижче показує доступні піни для переривання на різних платах.

Але на новіших платах з потужнішими процесорами (такими, як Due, Zero, MKR1000, 101) взаємне позначення між піном та номером переривання існує, тому два варіанти синтаксису, приведені нижче, рівноцінні:

  • attachInterrupt(digitalPinToInterrupt(interruptPin), blink, CHANGE);

  • attachInterrupt(interruptPin, blink, CHANGE).

 Переривання
Плата012345
Uno, Ethernet23
Mega25602321201918
32u4-базовані (наприклад, Leonardo, Micro)32017
Due, Zero, MKR1000, 101номер переривання = номер піна

Повернутись до головної

Коментарі 0

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