А чем if/else не if/else?Каждая проверка вызывает свою функцию и что то делает. Switch case больше для оценки того что пришло а Порт/USART.Или каждое нажатие вызывает своё прерывание тобишь функцию.Но так можно на "настоящем"Си в Ардуино это невозможно.
Это кто? Я то подумал, что в твоём коде какой-то параллельный внализ ведётся (антидребезг меня не интересует, только состояние кнопок), а получается все так же последовательно. Не обижайся, ежели че))) Мне не понятен следующий посыл - для чего копировать регистр порта в другой регистр, если регистр порта - это такой же регистр, в который мы скопировали его значение?
То есть, один раз проверяем через 50 мс, и если состояние такое-же то принимаем решение??? Как-то не правильно это, а если в течении этих 50 мс или позже оно изменилось??? То, что я скинул, проверяет состояние входа четыре раза подряд, (период выбирайте сами) и если оно остается стабильным все четыре проверки - принимается решение. Есть разница???
if/else даёт скорость выполнения, а case компактность, если я ничего не попуточки))) Если с кнопкой работать в прерывании, то привет функция антидребезга приведённая выше. Если кнопок больше двух, то для организации прерывания получится чуть больше кода.
Я этот вариант использую и на "smart" выключателе 220В. Схема здесь. Анализируется каждый полупериод. Если, больше двух третьих полупериода не было напряжения - тогда состояние 0. Если было - состояние - единица. Если 4 раза подряд состояние 0 - выключатель - выключен. Если 4 раза подряд состояние 1 - выключатель - включен. Пока не сделал так - были, правда редко, но были, подщелкивания реле. Как добавил - все стало работать стабильно, без всяких аппаратных решений. Скорости ESP с запасом хватает, даже излишне...
Принимаем решение с первого раза. Все. Кнопка либо успокоилась, либо вот-вот успокоится. Я не знаю человека, который способен удержать кнопку в течении 20 мс. Это значение ползёт к 100 мс.
Там может быть и не человек, а просто сухой контакт, счетчик, наводка, да что угодно ... Как Вам угодно, а я привык проверять состояние несколько раз! И буду проверять! ИБО, так учили, и военная приемка по другому не принимала!
При чем здесь наводки, если говорим про антидребезг? Наводки ВСЕГДА устраняются грамотной схемотехникой. Ни кнопка, ни выключатель сами по себе включаться не должны. Если это происходит, значит они неисправны.
Наши телеки были сделаны по всем, казалось бы, правилам схемотехники - все провода в экране, платы в куче экранов, но сцука соня, у которой экран только на блоке тюнера, показывала В РАЗЫ ЛУЧШЕ.
Кто мешает сделать антидребезг внутри прерывания?Маленький delay эдак на 100 мс спасет Отца русской демократии
Не всегда.Точнее никогда.Ибо законы физики никому не удалось нае@атьА дребезг контактов это данная нам реальность
Так все же сделано, работает, без делей, паралельно по всем входам в прерывании, не тормозит ничего, ... КРАСИВО ЖЕ!!! НО не понимают же... ОБИДНО блин..
Может не в тему, вчитываться лень, но я делаю антидребезг так: опрашиваю пин раз в 20мс (ну или реже) не важно прерыванием ли или в цикле, сохраняю цепочку состояний (в массиве или в байте битами, если места жалко) и когда последовательность получается 10 (или 01, смотря как подключено) - вот оно и есть. То есть цепочки из двух звеньев хватает почти всегда. Для перфекционистов можно сделать три звена и отслеживать последовательность 110 (001), тогда заодно и антипомеха будет. Можно опрашивать хоть по одному пину, весь порт разом, результат всегда правильный.
Так ведь никто ж не запрещает вводить счётчик. Тем более в варианте, когда нам нужны длинные и короткие нажатия. А при удержании кнопки более положеннооо периода можно и оповестить юзера, что кнопочку пора бы и отжать. При опросе 50 раз в секунду и емкости счетчика в байт, эта величина может доходить до 2.5 секунд)))
Ну вот как ты будешь программно устранять наводку по цепи питания? Вот как? А что дребезг? Кнопка побренчит и через 5-10 мс успокоится.