Прерывание срабатывает дважды при установке на ПАДЕНИЕ
У меня есть простой скетч с кнопкой, которая запускает прерывание, когда контакт кнопки переходит из положения 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.
@romanoma, 👍2
Обсуждение1 ответ
▲ 2
но иногда при отпускании кнопки прерывание тоже срабатывает
Да, ну, когда вы отпускаете кнопку, она также может подпрыгнуть. Другими словами, ВЫКЛ/ВКЛ/ВЫКЛ, так что это будет считаться нажатием. Конденсатор над переключателем может быть лучше.
Пример:
,
@Nick Gammon
Смотрите также:
- Устранение дребезга кнопки с помощью прерывания
- Прерывание при нажатии кнопки + устранение дребезга
- 24/14 секундный таймер обратного отсчета или часы для кнопки запуска/остановки баскетбольного мяча плохо реагируют
- Разборка прерывания с помощью конденсатора
- Неожиданное увеличение/уменьшение кнопки. Я использую attachInterrupt
- Программное обеспечение, устраняющее дребезг кнопки при отпускании
- Использование millis() и micros() внутри процедуры прерывания
- Подсчет импульсов с прерыванием
Разве антидребезг не должен устранять микроподъёмы при отпускании кнопки?
- Это зависит от антидребезга. Схему, пожалуйста?, @MajenkoКроме того, если вы думаете, что «if» в вашем ISR — это хорошее устранение дребезга, вы глубоко ошибаетесь., @Majenko
Подумайте о том, что происходит. Вы нажимаете кнопку, и ISR срабатывает при каждом отскоке. Он считается один раз, потому что все отскоки происходят в течение 50 мс. Затем, скажем, через 100 мс, вы отпускаете кнопку. Снова происходит отскок, и ISR срабатывает при каждом отскоке, и один из них в течение окна 50 мс подсчитывается. У вас нет различия между восходящим отскоком и нисходящим отскоком. Все вверх-вниз-вверх-вниз-вверх. На самом деле, что вам следует искать, это *конечное положение, которое не менялось некоторое время*., @Majenko
Спасибо за ответ @Majenko. Схема представляет собой просто кнопку, подключенную к контакту 2 и земле. Я забыл упомянуть, что этот код отлично работает, когда прерывание настроено на срабатывание при НИЗКОМ уровне вместо ПАДЕНИЯ. Я проверил, поможет ли увеличение задержки в ISR, и при 500 мс он также устраняет дребезг при отпускании кнопки. Но почему такая разница между двумя режимами. Срабатывает ли ПАДЕНИЕ также, когда 0 В не достигнуто?, @romanoma
Этот вопрос, похоже, был оставлен без внимания., @Nick Gammon