arduino
Прерывания
Поиск…
Синтаксис
digitalPinToInterrupt (контактный); // преобразует идентификатор контакта в идентификатор прерывания, для использования с
attachInterrupt()
иdetachInterrupt()
.attachInterrupt (digitalPinToInterrupt (pin), ISR, режим); // рекомендуемые
attachInterrupt (прерывание, ISR, режим); // не рекомендуется
detachInterrupt (digitalPinToInterrupt (контактный));
detachInterrupt (прерывание);
noInterrupts (); // отключает прерывания
прерывания (); // повторно активировать прерывания после
noInterrupts()
.
параметры
параметр | Заметки |
---|---|
прерывание | Id прерывания. Нельзя ошибиться с количеством контактов. |
ISR | Процедура обслуживания прерываний. Это метод, который будет выполняться при возникновении прерывания. |
Режим | Что должно вызывать прерывание. Один из LOW, CHANGE, RISING или FALLING. Доски также позволяют HIGH. |
замечания
Процедуры обслуживания прерываний (ISR) должны быть как можно короче, поскольку они приостанавливают выполнение основной программы и, таким образом, могут заворачивать зависящий от времени код. Как правило, это означает, что в ISR вы устанавливаете флаг и выходите, а в цикле основной программы вы проверяете флаг и выполняете то, что должен делать этот флаг.
Вы не можете использовать delay()
или millis()
в ISR, потому что сами эти методы полагаются на прерывания.
Нажмите кнопку «Прерывание»
В этом примере используется кнопка (тактовый переключатель), подключенная к цифровому выходу 2 и GND, с использованием внутреннего подтягивающего резистора, поэтому контакт 2 является ВЫСОКО, когда кнопка не нажата.
const int LED_PIN = 13;
const int INTERRUPT_PIN = 2;
volatile bool ledState = LOW;
void setup() {
pinMode(LED_PIN, OUTPUT);
pinMode(INTERRUPT_PIN, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(INTERRUPT_PIN), myISR, FALLING); // trigger when button pressed, but not when released.
}
void loop() {
digitalWrite(LED_PIN, ledState);
}
void myISR() {
ledState = !ledState;
// note: LOW == false == 0, HIGH == true == 1, so inverting the boolean is the same as switching between LOW and HIGH.
}
Один из примеров этого простого примера состоит в том, что кнопки имеют тенденцию отскакивать, что означает, что при нажатии или отпускании схема открывается и закрывается более одного раза, прежде чем она оседает в конечное закрытое или открытое состояние. Этот пример не учитывает это. В результате иногда нажатие кнопки будет переключать светодиод несколько раз, вместо ожидаемого один раз.