Друзья, простите, сваливаю на работу на сутки. Там только кастрированный Линукс, наш сайт он не берет из-за версии браузера, а установить новую невозможно. Таймаут.
Ну и сам подумай - ты всегда будешь входить в прерывание по одному событию. А их у тебя должно быть ДВА.
Тут уж действительно проще просто в loop’e читать…
Ну так, в этом loop() отчего бы и не работать?
А если loop как простыня,. огромный , длится десятки миллисекунд, а то и сотни…
Или вообще с delay() на секунду - другую))))
Ладно если в прерывании переменную инкрементировать нужно, а если что-то по существеннее - всё равно будешь в loop обрабатывать. И получается разница не велика.
Да и loop нужно проектировать так, чтобы сильно долго один проход не задерживался. Например, можно каждый “проход” в лупе читать состояния концевиков, датчики и тд и тп, а можно это делать через интервалы и тд и тп…
Да я ведь шучу. Просто сколько видел скетчей от новичков, и , особенно для Меги, так , зачастую это что-то грандиозное, кучи датчиков, реле , с десяток
библиотек, огромный loop))
Потому что, когда крутите налево, у Вас в прерывании encA “упало“, т.е. “0”, а encB в “1”. А когда крутите направо, в прерывании encA “упало“, т.е. “0“, а encB тоже в “0“.
В результате налево clk<dt — 0<1 — true и все работает, а направо clk>dt — 0>0 — false и не работает.
Надо не сравнивать clk и dt, а в прерывании по пину A считывать состояние пина B. Или наоборот. Т.е.
void ENCODER()
{
if (digitalRead(pin_encB))
enc++;
else
enc--;
}