Не срабатывает прерывание на Меге2560

Друзья, простите, сваливаю на работу на сутки. Там только кастрированный Линукс, наш сайт он не берет из-за версии браузера, а установить новую невозможно. Таймаут.

Однозначно не скажу, но есть предположение, что это что-то типа фильтра получается..
Для более надёжного подавления дребезга.
Но это 100% моё ИМХО!

Гм.. Значит тут враньё?

Или я где-то банально заблудился?

У нас уже была тема про энкодер, прерывания и со срачем на 200 сообщений…

ХА! А у ТС уже была тема с энкодером и такой обработкой! И там ему помогло как раз поменять местами выводы :grinning_face:

ага, проблема была что оно только увеличивалось. Когда выводы поменял - стало только уменьшаться.
Наверное, именно это ему и было нужно :slight_smile:

Не, ребяты, я пас.
Опять два дня разбираться, почему клиенту неудобно спать стоя…

1 лайк

Ну и сам подумай - ты всегда будешь входить в прерывание по одному событию. А их у тебя должно быть ДВА.
Тут уж действительно проще просто в loop’e читать…

Ну так, в этом loop() отчего бы и не работать?
А если loop как простыня,. огромный , длится десятки миллисекунд, а то и сотни…
Или вообще с delay() на секунду - другую))))

За такое надо розги применять к скетчеписателю)

3 лайка

Ладно если в прерывании переменную инкрементировать нужно, а если что-то по существеннее - всё равно будешь в loop обрабатывать. И получается разница не велика.
Да и loop нужно проектировать так, чтобы сильно долго один проход не задерживался. Например, можно каждый “проход” в лупе читать состояния концевиков, датчики и тд и тп, а можно это делать через интервалы и тд и тп…

1 лайк

)))

Да я ведь шучу. Просто сколько видел скетчей от новичков, и , особенно для Меги, так , зачастую это что-то грандиозное, кучи датчиков, реле , с десяток
библиотек, огромный 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--;
}
1 лайк

Спасибо, логику уловил! Попробую!

А ещё надо было учитывать какой у вас энкодедер и как подключен. Потому прошлый раз перемена мест и сработала :grinning_face:

Corp, гигантское спасибо! Запахало!

В том и проблема. Экономлю, покупаю ноуноймы… А они разные, падлы. Плюнул, взял десяток одной партии, теперь только с ними и вожусь.