|
Дребезг контактов..., Или ошибка в программе??? |
|
|
|
Dec 25 2006, 21:40
|
Местный
  
Группа: Свой
Сообщений: 413
Регистрация: 15-12-06
Пользователь №: 23 563

|
Господа, подскажите, как написать программу обработки клавиш устойчивую к дребезгу? Смысл в чем - есть переменная mode=0; при однократном нажатии на клавишу (подаче сигнала на PB5) значение mode должно увеличиваться на единицу. ВОт фрагмент моего кода Код // Проверяем режим
char ButtonPressed;
............................
ButtonPressed=0;
while (1)
{
DisplayLCD(Mode);
if (bit_is_set(PINB,5)) { PORTA |=_BV(PA3); ButtonPressed=1; }
else { PORTA &=~_BV(PA3); if (ButtonPressed==1) { Mode++; ButtonPressed=0; } }
} Ну... помимо всего программа зажигает диод (PA3). В начале цикла отображает на LCD значение mode. ВОт только при нажатии клавиши у меня получается не числовоя ряд, а постоянная последовательность -1..3..7.. Дребезг? Как решить проблему? Спасибо!
|
|
|
|
|
 |
Ответов
|
Dec 26 2006, 07:24
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
Есть два широкораспространенных метода устранения дребезга. 1. Выбирается интервал времени, заведомо превышающий дребезг данного типа контактов. Опрос контакта производится через промежуток времени равный или больший, чем этот интервал. Если состояние контакта в двух "соседних" опросах одинаково, то оно считается устойчивым. 2. По выбранному уровню сигнала от контакта (спад/фронт/сработал/разомкнут) запускается цикл опроса контакта. Цикл с заранее определенным интервалом времени. В цикле опрашивается состояние контакта на заданный уровень и ведется счетчик совпадений. Пока состояния одинаковы, то счетчик увеличивается (или уменьшается) до порогового значения. При любом несовпадении счетчик сбрасывается (или устанавливается) и счет состояний возобновляется в пределах выделенного интервала времени. Состояние считается устойчивым, если счетчик достиг порогового значения (опять же за выделенный интервал времени). Если за выделенный интервал счетчик состояний порога не достиг, то состояние считается неопределенным.
Первый способ применяется чаще всего при наличии в программе "системного" прерывания с периодом 0,01-0,3с. Чаще 100Гц опрашивать состояние клавитуры не имеет смысла, т.к. дребезг многих типов кнопок составляет до 10 мс. Реже 3Гц тоже не стоит, т.к. реакция на нажатие клавиши будет неудобна для пользователя.
Второй способ можно применять совместно с прерыванием от к.-либо пина МК, к которому подключен контакт. Только не забывайте очищать флаги прерываний перед выходом из обработчика прерывания.
|
|
|
|
|
Dec 26 2006, 15:48
|
Частый гость
 
Группа: Свой
Сообщений: 151
Регистрация: 21-02-06
Пользователь №: 14 561

|
Цитата(rezident @ Dec 26 2006, 07:24)  Есть два широкораспространенных метода устранения дребезга. 1. Выбирается интервал времени, заведомо превышающий дребезг данного типа контактов. Опрос контакта производится через промежуток времени равный или больший, чем этот интервал. Если состояние контакта в двух "соседних" опросах одинаково, то оно считается устойчивым. 2. По выбранному уровню сигнала от контакта (спад/фронт/сработал/разомкнут) запускается цикл опроса контакта. Цикл с заранее определенным интервалом времени. В цикле опрашивается состояние контакта на заданный уровень и ведется счетчик совпадений. Пока состояния одинаковы, то счетчик увеличивается (или уменьшается) до порогового значения. При любом несовпадении счетчик сбрасывается (или устанавливается) и счет состояний возобновляется в пределах выделенного интервала времени. Состояние считается устойчивым, если счетчик достиг порогового значения (опять же за выделенный интервал времени). Если за выделенный интервал счетчик состояний порога не достиг, то состояние считается неопределенным.
Первый способ применяется чаще всего при наличии в программе "системного" прерывания с периодом 0,01-0,3с. Чаще 100Гц опрашивать состояние клавитуры не имеет смысла, т.к. дребезг многих типов кнопок составляет до 10 мс. Реже 3Гц тоже не стоит, т.к. реакция на нажатие клавиши будет неудобна для пользователя.
Второй способ можно применять совместно с прерыванием от к.-либо пина МК, к которому подключен контакт. Только не забывайте очищать флаги прерываний перед выходом из обработчика прерывания. ...на самом деле второй способ не всегда применим, потому что приходится останавливать все процессы для проверки на дребезг. А первый очень даже универсален, я обычно по системному таймеру делаю выборки с периодом меньшим чем время дребезга и сохраняю эти выборки в массиве каждый раз контролируя совпадение выборок. Если все выборки совпали - значит дребезг исчез. Этот метод действенен еще когда существует множество датчиков типа "сухой контакт" или "провод-команда" и они существенно удалены от контроллера, он исключает влияние переходных процессов в проводах.
|
|
|
|
|
Dec 26 2006, 16:41
|
Частый гость
 
Группа: Свой
Сообщений: 165
Регистрация: 11-01-05
Из: Украина, г. Одесса
Пользователь №: 1 896

|
Цитата(tag @ Dec 26 2006, 16:48)  ...на самом деле второй способ не всегда применим, потому что приходится останавливать все процессы для проверки на дребезг. А первый очень даже универсален, я обычно по системному таймеру делаю выборки с периодом меньшим чем время дребезга и сохраняю эти выборки в массиве каждый раз контролируя совпадение выборок. Если все выборки совпали - значит дребезг исчез. Этот метод действенен еще когда существует множество датчиков типа "сухой контакт" или "провод-команда" и они существенно удалены от контроллера, он исключает влияние переходных процессов в проводах. Запуск цикла опроса также может быть запущен дискретно в процедуре прерывания таймера с достаточно высокой частотой (инкремент/сброс счетчика времени нажатия), тем самым без ущерба остальным процессам.
|
|
|
|
Сообщений в этой теме
Зверюга Дребезг контактов... Dec 25 2006, 21:40 prottoss Цитата(Зверюга @ Dec 26 2006, 01:40) Госп... Dec 25 2006, 21:45 Screw Самый простой вариант - я делаю вот так:
if (PINA.... Dec 25 2006, 22:36 arttab если нажата - к inc к максимуму,
иначе dec к минум... Dec 26 2006, 06:54   prottoss НЕ клавиатуру я опрашиваю так:
Код/**************... Dec 26 2006, 17:03    defunct prottoss
Просто организуете задержку, без подтверж... Dec 26 2006, 17:50     prottoss Цитата(defunct @ Dec 26 2006, 21:50) prot... Dec 26 2006, 18:01  defunct Цитата(tag @ Dec 26 2006, 15:48) ...на са... Dec 26 2006, 16:54  rezident Цитата(tag @ Dec 26 2006, 17:48) ...на са... Dec 26 2006, 20:59 fantasy гляньте http://electronix.ru/forum/index.php?showt... Dec 26 2006, 11:26
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|