- Библиотеки
- Операторы
- Sketch
- Управляющие операторы
- Синтаксис
- Арифметические операторы
- Операторы сравнения
- Логические операторы
- Указатели доступа
- Битовые операторы
- Составные операторы
- Данные
- Типы данных
- Преобразование типов данных
- Область видимости переменных и квалификаторы
- Утилиты
- Функции
- Цифровой ввод/вывод
- Аналоговый вход/выход
- Расширенный ввод/вывод
- Время
- Математические функции
- Тригонометрические функции
- Символы
- Случайные числа
- Биты и байты
- Внешние Прерывания
- attachInterrupt()
- Прерывания
- Функции передачи данных
- Функции
attachInterrupt()
Описание
Первый параметр attachInterrupt() - это номер прерывания. Обычно вы должны использовать digitalPinToInterrupt(pin), чтобы преобразовать фактический цифровой вывод в конкретный номер прерывания. Например, если вы подключаетесь к выводу 3, используйте digitalPinToInterrupt(3) в качестве первого параметра для attachInterrupt().
Board | Цифровые выводы, используемые для прерываний |
---|---|
Uno, Nano, Mini, и другие на базе 328 | 2, 3 |
Uno WiFi Rev.2 | все цифровые выводы |
Mega, Mega2560, MegaADK | 2, 3, 18, 19, 20, 21 |
Micro, Leonardo, и другие на базе 32u4 | 0, 1, 2, 3, 7 |
Zero | все цифровые выводы, кроме 4 |
Семейство плат MKR | 0, 1, 4, 5, 6, 7, 8, 9, A1, A2 |
Due | все цифровые выводы |
101 | все цифровые выводы (только выводы 2, 5, 7, 8, 10, 11, 12, 13 работают с CHANGE) |
Примечания
Внутри этой функции не будет работать delay() и значение, возвращаемое функцией millis(), не будет увеличиваться. Последовательные данные, полученные во время использования функции, могут быть потеряны. Вы должны объявить как volatile любые переменные, которые вы изменяете в присоединенной функции.
Использование прерываний
Прерывания полезны для автоматического выполнения задач в программах микроконтроллеров и могут помочь решить проблемы синхронизации. Хорошие задачи для использования прерывания могут включать в себя чтение поворотного датчика или мониторинг ввода пользователя.
Если вы хотите убедиться, что программа всегда улавливает импульсы от вращающегося энкодера, чтобы она никогда не пропускала импульс, было бы очень сложно написать программу для выполнения чего-либо еще, потому что программе нужно было бы постоянно опрашивать выход энкодера, чтобы уловить импульсы при их появлении. Другие датчики также имеют похожую динамику интерфейса, например, пытаются прочитать звуковой датчик, который пытается поймать щелчок. Во всех этих ситуациях использование прерывания может освободить микроконтроллер для выполнения некоторой другой работы, не пропуская ввод.
Синтаксис
attachInterrupt(digitalPinToInterrupt(pin), ISR, mode); (рекомендуемый)
attachInterrupt(interrupt, ISR, mode); (не рекомендуемый)
attachInterrupt(pin, ISR, mode); (не рекомендуемый. Этот синтаксис работает только на Arduino SAMD Boards, Uno WiFi Rev2, Due, и 101.)
Параметры
interrupt — номер прерывания (int)
pin — номер контакта (только для Due, Zero)
ISR — ISR, которая будет вызываться при возникновении прерывания; у этой функции не должно быть параметров и, к тому же, она не должна ничего возвращать; кроме того, иногда эту функцию также называют «обработчиком прерываний»
mode — определяет, когда должно сработать прерывание; работает, как правило, с четырьмя константами:
LOW — прерывание срабатывает, когда контакт переключается в значение LOW
CHANGE — прерывание срабатывает, когда значение контакта меняется
RISING — прерывание срабатывает, когда контакт переключается из LOW в HIGH
FALLING — прерывание срабатывает, когда контакт переключается из HIGH в LOW
HIGH (только для Due, Zero) — прерывание срабатывает, когда контакт переключается в HIGH
Возвращаемые значения
Нет
Пример
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). В таблице ниже показаны доступные контакты прерываний на различных платах.
Обратите внимание, что в приведенной ниже таблице номера прерываний относятся к номеру, передаваемому в attachInterrupt (). По историческим причинам эта нумерация не всегда напрямую соответствует нумерации прерываний на чипе ATmega (например, int.0 соответствует INT4 на чипе ATmega2560).
Плата | int.0 | int.1 | int.2 | int.3 | int.4 | int.5 |
---|---|---|---|---|---|---|
Uno, Ethernet | 2 | 3 | ||||
Mega2560 | 2 | 3 | 21 | 20 | 19 | 18 |
32u4 (Leonardo, Micro) | 3 | 2 | 0 | 1 | 7 |
Для плат Uno WiFiRev.2, Due, Zero, MKR Family и 101 номер прерывания = номер контакта.
Плата Arduino Due предоставляет больше возможностей по работе с прерываниями, поскольку позволяют ассоциировать функцию-обработчик прерывания с любым из доступных выводов. При этом в функции attachInterrupt() можно непосредственно указывать номер вывода.