Вопрос не в сраче (потому пока и не МЯУ)...
Спорщики таки выкладывают различные варианты - а это в любом случае полезно.:
А, да? Ладно, тогда продолжаем полезный срачь
Итак, новая тема говнометания - пресловутый дребезг кнопок. И поскольку врага надо знать в лицо, обратимся к фактам. Берем распространенные тактовые кнопки, подтянутые к питанию резистором и с низким уровнем при замыкании. Начинаем тыкать в них и смотреть осциллографограмму.
Вот мы видим среднестатистическое поведение кнопки:
в среднем, длительность нажатого состояния кнопки составляет 80±30 мс при обычных тыканиях кнопок пользователем.
В момент нажатия дребезг заканчивается уже через 20 мкс, а при отпускании он гораздо дольше - порядка 6 мс. Это средние величины, бывает чуть меньше или чуть больше. Такие результаты объясняются действием тарельчатой пружины, которая под давлением пальца сначала упруго сопротивляется, а затем скачком усилие сжатой пружины уменьшается и кнопка быстро замыкается. При размыкании уже иначе ведет себя пружинка, и вначале она находится в неустойчивом состоянии и контакты "звенят", а затем пружинка быстро распрямляется.
Теперь попробуем получить наихудшие результаты по дребезгу при довольно медленном отпускании кнопки. Получается 27 мс:
Затем, узнаем наши скоростные возможности по нажатиям кнопки. Очень быстрое одиночное нажатие - 30 мс (быстрее практически никак), двойное нажатие - между ними около 150±20 мс.
Итого. У нас есть исходные данные для дальнейшей работы: дребезг прекращается менее чем за 30 мс, длительность нажатого состояния более 30 мс, двойное нажатие с длительностью отпущенного состояния более 50 мс.
Теперь, полагаясь на эти цифры, назначим период опроса кнопок 35 мс. Получаем, что моменты опроса будут попадать как раз так, чтобы перекрыть практически все неопределенности. При этом, время реакции системы на нажатую или отпущенную кнопку не превышает периода опроса 35 мс. Для человека это практически незаметно. И не потребовались никакие дополнительные таймеры организации задержек на повторные опросы.
Однако, допустим, нас не устраивает интервал 35 мс, нам почему-то кажется что это медленно. Можно уменьшить интервалы например до 20 мс. В большинстве случаев работает без ложных срабатываний. Но мы перестраховываемся и вводим программный антидребезг. Но решать мы его будем не запуском дополнительного таймера, а просто пропуском до следующего интервала в случае обнаружения изменения предыдущего и текущего считывания.
Можно применить интегрирующий счетчик, который будет увеличиваться или уменьшаться в зависимости от прочитанного состояния в каждом цикле опроса. Когда вход будет стабилен, счетчик будет идти в одну сторону и по достижению порога будет зафиксирован факт подавления дребезга.
Ну а еще один вариант - конденсатор на кнопке. И вот уже получили чистый незамаранный однозначный сигнал
а если вдруг кто скажет вам, что от этого кондера обгорают контакты, то просто скажите, что напряжения на микрокнопке недостаточно для зажигания дуги, и еще ни одна микрокнопка не обгорела.
Ну чтож, вот практические результаты на лицо. Ждем тем теперь новых волн говносрача и яростного опровержения практических результатов.