6.2 Устранение дребезга контактов . Изначально контакт разомкнут. Когда мы начинаем замыкать контакт (нажимаем на кнопку), то замыкание происходит не сразу. Это нам кажется, что мы нажали на кнопку мгновенно. Однако на самом деле, если растянуть время достаточно сильно, по получится, что мы нажимаем кнопку постепенно. На механическом контакте надо обеспечить достаточное усилие, чтобы он окончательно замкнулся, а контакты, как правило, пружинят, и поэтому какое-то время контакт находится в переходном процессе. То есть быстро-быстро замыкаетсяразмыкается. Представьте, что наши кнопки - это клавиатура телефона. Мы нажимаем цифру 8, подразумевая, что эта цифра будет набрана телефоном один раз. Но телефон вместо этого набирает 5 или 10 восьмёрок, потому что разработчики телефона не удосужились предусмотреть защиту от дребезга контактов. Ну и напоследок надо сказать, что время дребезга контактов зависит от качества контактов, и обычно составляет от 10 до 100 мс. Если уж мы используем микроконтроллер, то в подавляющем большинстве случаев нет смысла усложнять схему устройства и встраивать в неё элементы устранения дребезга. Потому что проще и дешевле организовать программное подавление дребезга. Использовать аппаратное подавление дребезга в устройствах на микроконтроллерах имеет смысл только в очень редких случаях. Например, если микроконтроллер маломощный и даже малейшее расходование его ресурсов не на основную задачу нежелательно. Самое простое и самое распространённое программное решение для борьбы с дребезгом - это временная задержка. Алгоритм простой: 1. При изменении уровня сигнала на входе на противоположный включаем таймер (например, на 100 миллисекунд). 2. После истечения задержки проверяем сигнал. Если он остался изменённым, то считаем, что кнопка нажата (или отпущена - в зависимости от того, какое изменение сигнала обнаружено). Если же он вернулся в исходное состояние, то считаем это помехой и не реагируем на сигнал. Бывают особые случаи, когда быстрое переключение контактов - это обычное состояние системы. Ну например, если есть какой-то датчик, который по логике работы не может принимать фиксированное значение на длительное время. То есть идёт как бы непрерывный дребезг контактов. И в этом бесконечном потоке нам надо как-то определить, какой же всё-таки сигнал на входе. В этом случае можно применить следующий алгоритм: 1. Посчитать количество и/или продолжительность замкнутого и разомкнутого состояния контакта в единицу времени (например, в секунду). 2. По наибольшему количеству (или времени) определить конечное состояние сигнала. Например, если за секунду на входе у нас 50 раз была логическая 1, и 20 раз - логический 0, то можно считать, что на входе единица. Разумеется, здесь нужен индивидуальный подход в зависимости от задачи.