Вообще, тут концептуально неправильно. надо считать все 3 кнопки сразу, а потом уже производить с ними действия. А дребезг подавить - так это просто считывать надо с интервалом не менее 10мс и соответственно тогда же проводить разбор состояний.
Может не в кассу - но задержка и всего 10 ms - это "коряво" и мало. Коряво - зачем стопорить "работу" для обработки дребезга. Мало - дребезг величина не постоянная и со временем будет только увеличиваться - износ, брак, китай. Сам боролся с этой проблемой - встречал дребезги и до 250ms - на "заюзанных" кнопках - но 250 это не 10 и на четверть секунды стопорить МК не дело (хотя зависит от задач).
Нет, это как раз в самый раз. А от кнопок с дребезгом больше 10мс надо избавляться - это уже не дребезг а банально плохой контакт. Ситуация конечно разной бывает, и не от всех кнопок можно избавится но это исключения.
Alexeyslav писал(а):Нет, это как раз в самый раз. А от кнопок с дребезгом больше 10мс надо избавляться - это уже не дребезг а банально плохой контакт. Ситуация конечно разной бывает, и не от всех кнопок можно избавится но это исключения.
Я со всем согласен кроме одного. а) устройство должно работать, а не пребывать на "замене кнопок" b) даже если кнопка показывала нормальные показатели по дребезгу при сборке - никто не гарантирует что "завра" они будут такими же, особенно на "китае" (имхо 90% того что продают в массы) Вывод - вопрос надо решать кардинально - 150-250 ms это намного меньше чем частота нажатий на кнопку среднестатистического девайса, но значительно для выполняемых контролером задач - значит можно организовывать "антидребезг" исходя из этих параметров, но по другому алгоритму - в результате больше устойчивость к износу и меньше зависимость от качества "китая". В идеале надо к программному "антидребезгу" добавить еще и "хардварный"
хардварный - это просто лишние детали. 200мс на реакцию на нажатие? Выбросить и больше никогда не брать эти кнопки. Откуда берутся такие кнопки? Всё очень просто - ИХ ПОКУПАЮТ. Не надо покупать плохие кнопки, и китай перестанет их делать.
Alexeyslav писал(а):хардварный - это просто лишние детали. 200мс на реакцию на нажатие? Выбросить и больше никогда не брать эти кнопки. Откуда берутся такие кнопки? Всё очень просто - ИХ ПОКУПАЮТ. Не надо покупать плохие кнопки, и китай перестанет их делать.
Легко сказать не покупать , только тяжело сделать - когда собирал одно устройство - подходящие мне кнопки нашел только в "китае" по почте и у дилера Швецаркой компании - первом случаи стоимость кнопки получалась $2 во втором случаи $43 - качество тоже было пропорционально цене - только в устройстве 24 кнопки - 24*$43=$1032 как то многовато для "ручной поделки" что бы не покупать "китайских кнопок" и не "заморачивать" с антидребезгом для них - Вам не кажется
kobaltd писал(а): стоимость кнопки получалась $2 во втором случаи $43 - качество тоже было пропорционально цене
Они что - золотые с бриллиантовыми толкателями? А если "пропорционально цене", то та, что за $43, не только замыкает цепь, но еще и варит кофе и поет "Алеет восток" ? Вполне нормальные кнопки - на $1 горсть.
Это мы тут представляем себе кнопочки 5x5мм, а на самом деле кнопки есть довольно громоздкие, например для пульта от подъемника, аварийного отключения, вандалоустойчивые и т.д. такая запросто может стоить 40$ только непонятно нафига такие кнопки напрямую к МК подключать.
Alexeyslav писал(а):Это мы тут представляем себе кнопочки 5x5мм, а на самом деле кнопки есть довольно громоздкие, например для пульта от подъемника, аварийного отключения, вандалоустойчивые и т.д. такая запросто может стоить 40$ только непонятно нафига такие кнопки напрямую к МК подключать.
Есть и еще дороже - допустим кнопки с Led дисплеем - они вообще заоблачные. но вкратце человек прав это не 6*6/12*12 и из этой серии - это кнопки с "большим ходом" - в одном корпусе сама кнопка, "колпачок", направляющая хода, светодиод, защита для вставки, размеры кнопки 20*20*40 мм. (нужны были такие для пульта - типа как у телевизионщиков) - так вот 1 нормальная такая кнопка у допустим OAE (просьба не считать за рекламу) компании начинается от $15, а дальше зависит от того что в нее напихаешь (по типу конструктора) - китайский аналог в полном сборе 2-3$. У фирменной (взял для пробы) на 100 нажатий 2-3 дребезга с интервалом 5-15 микросекунд, у "китая" от 50 микро до 150 мили и в среднем на 100 нажатий 500-600 колебаний - это я имел в виду когда говорил про качество и цену.
Как на счёт такой идеи опроса кнопок. По таймеру раз в эн миллисекунд опрашиваем кнопки. Если кнопка нажата, то инкрементируем соответствующую переменную, если отпущена, то сбрасываем её в ноль. Когда переменная дотикивает до порогового значения, считаем, что кнопка нажата. Можно сделать флаг нажатости кнопки и аналогичную процедуру провести для переключения из нажатого состояния в отпущенное. Какие могут быть проблемы у этого алгоритма?
Только избыточность. Инкрементировать ничего не нужно, сам опрос каждые N милисекунд избавляет от дребезга контактов. Главное в самой процедуре обработки не считывать значение несколько раз иначе будут проблемы. Дополнительная защита в виде описанного алгоритма нужна только если кнопки совсем ненадёжны и у них уже не дребезг а наблюдается ненадежный контакт.
Alexeyslav писал(а):Только избыточность. Инкрементировать ничего не нужно, сам опрос каждые N милисекунд избавляет от дребезга контактов. Главное в самой процедуре обработки не считывать значение несколько раз иначе будут проблемы. Дополнительная защита в виде описанного алгоритма нужна только если кнопки совсем ненадёжны и у них уже не дребезг а наблюдается ненадежный контакт.
1) если уж делаете "задержку" то ее надо делать и на "отпускание" - при этом тоже есть дребезг, а за частую он даже сильнее - не сделав рано или поздно получите "ложное нажатие" без нажатия. 2) алгоритм с delay() перепишите на millis(), на 2 переменных больше, но не стопориться работа контроллера хотя бы и позволяет обрабатывать "разболтанные кнопки" без ущерба для работы основного алгоритма прошивки.
А при отпускании счетчик не досчитает до надежного срабатывания и срабатывание не будет засчитано. А если обойтись простым считыванием через интервал(кстати где там было упоминание про delay?) то такой антидребезг одинаково работает как на нажатие так и отпускание.
Jack_A писал(а):Почти точная цитата из моего ответа
Jack_A писал(а):Ну если прерывание - сложно, то м. быть сделать аппаратный антидребезг ? Цена вопроса - 1 корпус триггеров Шмитта.
Кстати, триггеры Шмитта по цифровым входам есть в самом AVR, так что достаточно двух резисторов и конденсатора. А если использовать внутренний подтягивающий резистор, то можно аппаратный антидребезг сделать на двух внешних деталях: резисторе и конденсаторе. Только на подтягивающие резисторы допуск большой: 20...50 kΩ. Но с учётом того, что дребезг тоже не особо то нормирован, не думаю, что это страшно.
Жаль в даташите не написали пороги срабатывания внутреннего триггера Шмитта.
Эта схема не спасает от дребезга. может быть, уменьшает количество импульсов но до конца не спасает от дребезга. И в таком варианте кнопка подгорает несколько быстрее чем обычно.
В даташите на ATmega8A в разделе 28.8 Pin Thresholds and Hysteresis на страницах 253, 254 нашёл графики зависимостей напряжений срабатываний и гистерезиса от напряжения питания при различных температурах. Для питания 5 вольт напряжение срабатывания ≈2,6 вольт, а гистерезис всего 0,44 мВ. Как-то очень мало для гистерезиса. Без нормального триггера действительно не взлетит.
Вообще, длительность дребезга гарантированно блокируемого RC-цепочкой можно посчитать так:
Δt = τ ln [ (Vcc - V1) / (Vcc - V2) ]
где т — постоянная времени RC-цепочки, Vcc — напряжение питания, а V1 и V2 — нижнее и верхнее напряжения срабатывания триггера Шмитта. Эта формула для наихудшего случая, когда первое срабатывание кнопки не успело разрядить конденсатор полностью.
Для sn74hc14 этот логарифм в худшем и в обычном случаях равен соответственно: