Прерывание срабатывает дважды при установке на ПАДЕНИЕ

У меня есть простой скетч с кнопкой, которая запускает прерывание, когда контакт кнопки переходит из положения HIGH в положение LOW. Он имеет функцию устранения дребезга, поэтому при нажатии кнопки повторений не происходит, но иногда при отпускании кнопки прерывание также срабатывает. Почему бы и нет? Разве функция устранения дребезга не должна устранять любые микроподъёмы во время отпускания кнопки?

volatile int contador = 0;
int n = contador;

long t = 0;
void setup() {    

    pinMode(2, INPUT_PULLUP);
    attachInterrupt( 0, incrementaContador, FALLING);
} 

void loop() {   
    if (n != contador) {
        n = contador;
    }
}

void incrementaContador() {

    if ( millis() > (t + 50) ) {
        contador++ ;
        t = millis();
    }
}

Этот же код работает правильно, если установить значение LOW вместо FALLING.

, 👍2

Обсуждение

Разве антидребезг не должен устранять микроподъёмы при отпускании кнопки? - Это зависит от антидребезга. Схему, пожалуйста?, @Majenko

Кроме того, если вы думаете, что «if» в вашем ISR — это хорошее устранение дребезга, вы глубоко ошибаетесь., @Majenko

Подумайте о том, что происходит. Вы нажимаете кнопку, и ISR срабатывает при каждом отскоке. Он считается один раз, потому что все отскоки происходят в течение 50 мс. Затем, скажем, через 100 мс, вы отпускаете кнопку. Снова происходит отскок, и ISR срабатывает при каждом отскоке, и один из них в течение окна 50 мс подсчитывается. У вас нет различия между восходящим отскоком и нисходящим отскоком. Все вверх-вниз-вверх-вниз-вверх. На самом деле, что вам следует искать, это *конечное положение, которое не менялось некоторое время*., @Majenko

Спасибо за ответ @Majenko. Схема представляет собой просто кнопку, подключенную к контакту 2 и земле. Я забыл упомянуть, что этот код отлично работает, когда прерывание настроено на срабатывание при НИЗКОМ уровне вместо ПАДЕНИЯ. Я проверил, поможет ли увеличение задержки в ISR, и при 500 мс он также устраняет дребезг при отпускании кнопки. Но почему такая разница между двумя режимами. Срабатывает ли ПАДЕНИЕ также, когда 0 В не достигнуто?, @romanoma

Этот вопрос, похоже, был оставлен без внимания., @Nick Gammon


1 ответ


2

но иногда при отпускании кнопки прерывание тоже срабатывает

Да, ну, когда вы отпускаете кнопку, она также может подпрыгнуть. Другими словами, ВЫКЛ/ВКЛ/ВЫКЛ, так что это будет считаться нажатием. Конденсатор над переключателем может быть лучше.

Пример:

Аппаратное устранение дребезга

,