У меня возникли проблемы с полным отключением кнопки, связанной с прерыванием.Цель состоит в том, чтобы оператор в void loop()
выполнялся ровно один раз при нажатии / отпускании кнопки.
То, что обычно заканчивается тем, что происходит, это одна из двух вещей
- ISRФлаг устанавливается один раз при нажатии кнопки.Отпускание кнопки ничего не делает, как и предполагалось.
- Флаг ISR устанавливается один раз при нажатии кнопки и еще раз при отпускании кнопки.
Вот точный кодУ меня есть:
#define interruptPin 2
#define DBOUNCE 100
volatile byte state = LOW; //ISR flag, triggers code in main loop
volatile unsigned long difference;
void setup() {
pinMode(interruptPin, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(interruptPin), ISR_0, CHANGE);
Serial.begin(115200);
}
void loop() {
if(state){ //If we have a valid interrupt
Serial.println(difference); //Print the time since the last ISR call
state = LOW; //Reset the flag
}
}
void ISR_0() {
static unsigned long last_interrupt = 0;
if(millis()-last_interrupt > DBOUNCE && digitalRead(interruptPin)){
difference=millis()-last_interrupt;
state = HIGH;
}
last_interrupt = millis(); //note the last time the ISR was called
}
Кажется, это популярный способ отменить прерывание, но по какой-то причине оно не работает для меня.
Я надеялся на первый спадот отпускания кнопки, что digitalRead(interruptPin)
будет читать low
, поэтому флаг state
не будет установлен.
Поскольку ISR обновляет время last_interrupt
, последовательные отскоки после первого падающего фронта по-прежнему успешно игнорируются.Это заставляет меня поверить, что дебагинг не является проблемой, но digitalRead(interruptPin)
- это.
Дискуссирование, кажется, заботится обо всех, кроме одного государства.Когда кнопка отпущена, код все еще время от времени устанавливает флаг state
на HIGH
.
Вот пример вывода:
3643
(после ожидания ~ 3,6 секунды после загрузки,Я нажимаю кнопку, отпуская ее ~ 1 секунду спустя)
В том же сценарии, что и выше, иногда вывод выглядит так:
3643
1018
Это показывает, что я нажимаю кнопку, но такжеОтпустите кнопку.
Я использую UNO R3 и кратковременную тактильную кнопку с понижающим резистором 1 кОм.
Я не уверен, что происходит на этом этапе.Я надеюсь, что это достаточно просто, чтобы любой мог легко проверить это на своем Arduino, если он чувствует себя таким склонным.