Некорректная работа кнопки во время выполнения стороннего кода в loop()
ValeraDanger opened this issue · 1 comments
Использовал пример callbackISR и tickISR. С пустым loop все работает нормально, но если в нем присутствует сторонний код (в данном случае delay) некоторые нажатия кнопки не регистрируются. Не могу разобраться, в чем смысл использования прерываний, если они все равно не помогают обновлять кнопку во время выполнения кода? Использую ESP32
`// Пример с обработчиками в прерывании
#include <EncButton.h>
EncButton<EB_CALLBACK, 12> enc; // энкодер с кнопкой <A, B, KEY>
void setup() {
Serial.begin(9600);
enc.attach(CLICK_HANDLER, myClick); // подключим поворот
// прерывание обеих фаз энкодера на функцию isr
attachInterrupt(12, isr, CHANGE);
}
void myClick() {
Serial.println("CLICK_HANDLER");
}
void isr() {
enc.tickISR(); // тикер в прерывании
// Не вызывает подключенные коллбэки внутри прерывания!!!
}
void loop() {
enc.tick(); // дополнительный опрос таймаутов и коллбэков в loop
// вызов подключенных функций будет здесь,
// чтобы не грузить прерывание
delay(5000);
}
`
- Неправильно объявлено прерывание, читаем документацию на ESP32 https://lastminuteengineers.com/handling-esp32-gpio-interrupts-tutorial/
- Читаем документацию EncButton - "все подключенные функции вызываются из tick(), то есть не из обработчика прерывания, а из основного цикла программы!". Если обработчик с тяжёлым кодом будет вызываться из прерывания - это может привести к зависанию и перезагрузке МК, поэтому реализовано именно так
- Тикер в прерывании нужен для того, чтобы зарегистрировать начало нажатия кнопки, пока программа была занята другими делами
- Если в программе в основном цикле присутствует задержка 5 секунд - программа написана неправильно