|
Подавление дребезга контактов, Алгоритм подавления,реализация |
|
|
|
Mar 28 2007, 08:12
|

Частый гость
 
Группа: Новичок
Сообщений: 140
Регистрация: 31-01-07
Из: Челябинск
Пользователь №: 24 896

|
Привет всем! Написал небольшой кусочек кода для подавления дребезга контактов, IMHO данный код должен "фильтровать" ложные срабатывания менее заданного периода. Но почему-то не покидает ощущение того, что в коде могут оказаться грабли Какие еще есть правильные методы, либо можно это сделать проще или красивее? Пример для одного бита порта ввода: #define BOUNCE_CANCELLATION_PERIOD 20 unsigned char BITcounter=0; //счетчик состояний бита bit BITstate=0; //используемое (устойчивое) состояние бита (более 20 мсек) bit BITmemory=0; // промежуточная переменная, запоминающаяя предыдущее состояние бита bit toggled=0; //флаг,указывающий на изменение состояния бита interrupt Timer0() //возникает 1 раз в мсек { if(BITmemory^BITn){if(toggled){BITcounter=0;} toggled=1;} if(toggled ){BITcounter++;} if(BITcounter==BOUNCE_CANCELLATION_PERIOD){BITstate=BITn;BITcounter=0;toggled=0; } BITmemory=BITn; //чтение с порта } Вот, примерно так...
Сообщение отредактировал Axxel - Mar 28 2007, 08:34
--------------------
Если боишься - не говори. если сказал - не бойся. ©
|
|
|
|
|
 |
Ответов
|
Mar 29 2007, 19:19
|

Местный
  
Группа: Свой
Сообщений: 319
Регистрация: 2-08-05
Из: Одесса
Пользователь №: 7 287

|
Цитата(Visor @ Mar 28 2007, 20:56)  На самом деле достаточно ловить первый фронт изменения состояния и через таймаут проверить сохранилось ли состояние. И не надо ждать когда сигнал перестанет дребезжать, и только потом включать выдержку времени, это бессмысленно. Подумайте.  Если неждать то кто даст гарантию что после принятия решения о нажатой кнопке не происходит дребезга А с дребезгом при отжатии как быть ?? По моему мнению самый верный способ - запускать програмный таимер по нажатию Делать +1 если нажата и -1 если отжата Ограничить нулем и числом А снизу и сверху И принимать решение о точ что нажата кнопка когда таимер достигнет А Заодно можно и блительное нажатие обрабатывать
|
|
|
|
|
Apr 2 2007, 05:12
|

Частый гость
 
Группа: Новичок
Сообщений: 140
Регистрация: 31-01-07
Из: Челябинск
Пользователь №: 24 896

|
А если произойдет такое?
Эскизы прикрепленных изображений
--------------------
Если боишься - не говори. если сказал - не бойся. ©
|
|
|
|
|
Apr 2 2007, 07:28
|

Частый гость
 
Группа: Новичок
Сообщений: 140
Регистрация: 31-01-07
Из: Челябинск
Пользователь №: 24 896

|
Цитата(Visor @ Apr 2 2007, 09:09)  Объясните пожалуйста, как такое возможно? Помехи например, ложные срабатывания от датчиков, ведь такое IMHO может быть Цитата(=AK= @ Apr 2 2007, 09:25)  Я проще делаю. В 8-битный сдвиговый регистр каждые 10 мс вдвигаю текущее состояние кнопки. Если в сдвиговом регистре все '1', то кнопка нажата, выходной сигнал устанавливаю в '1'. Если все '0', то кнопка отжата, выходной сигнал устанавливаю в '0'. Все другие комбинации игнорируются и не меняют состояние вых. сигнала.
При опроcе каждые 10 мс и 8-ми битах время получается 80 мс, это отлично работает со всеми обычными кнопками, в т.ч. с мембранными клавами. Для массивных контактов, которые могут дребезжать с малой частотой (контактор какой-нибудь, например), время опроса можно увеличить до 20..30 мс. Можно кусочек кода? И еще вопрос: используя прерывания от аппаратного таймера для подавления дребезга, с какой частотой целесообразнее всего устраивать эти прерывания? И каков риск что пользовательская функция-обработчик не успеет обработаться до возникновения следующего прерывания?
--------------------
Если боишься - не говори. если сказал - не бойся. ©
|
|
|
|
Сообщений в этой теме
Axxel Подавление дребезга контактов Mar 28 2007, 08:12 Oleg_IT Давно и хорошо работающий код. Обслуживает несколь... Mar 28 2007, 08:50 Kitsok Цитата(Oleg_IT @ Mar 28 2007, 12:50) Давн... May 15 2007, 03:32 NVade а я просто опрашиваю клавиатуру с интервалом больш... Mar 28 2007, 09:54 IEC Контролировать один раз нажатие клавиши (совет NVa... Mar 28 2007, 10:08 Axxel По хорошему необходимо контролировать время первог... Mar 28 2007, 10:36  SergCom07 Думаю лучший вариант реализуется при помощи прерыв... Mar 28 2007, 12:07 Visor На самом деле достаточно ловить первый фронт измен... Mar 28 2007, 19:56     rezident Цитата(Axxel @ Apr 2 2007, 10:28) И еще в... Apr 2 2007, 07:50      Axxel Цитата(Visor @ Apr 2 2007, 10:55) Сигналы... Apr 2 2007, 08:00     Visor Цитата(Axxel @ Apr 2 2007, 12:28) И еще в... Apr 2 2007, 08:07      Axxel Универсальность - враг оптимальности.
[/quote]
Т... Apr 2 2007, 10:56       Dog Pawlowa Цитата(Axxel @ Apr 2 2007, 10:56) ...Так ... Apr 2 2007, 12:12       Visor Цитата(Axxel @ Apr 2 2007, 15:56) Так как... Apr 2 2007, 15:29 rezident На всех форумах одни и те же вопросы задаются
htt... Mar 29 2007, 19:32 Axxel У меня примерно так: Mar 30 2007, 04:58 =AK= Я проще делаю. В 8-битный сдвиговый регистр каждые... Apr 2 2007, 06:25 Axxel Да,действительно не такая уж и тривиальная это зад... Apr 2 2007, 12:20 vaivai На Kazus.ru было несколько примеров на асемблере (... Apr 2 2007, 21:13 birden Я очень часто использую следующий принцип:
Кодunsi... Apr 3 2007, 05:41 Axxel Остановился пока на таком методе:
unsigned char a... Apr 3 2007, 08:57 slog Ну вы и нагородили, на пустом месте. Достаточно 20... Apr 3 2007, 09:20 Axxel Цитата(slog @ Apr 3 2007, 12:20) Достаточ... Apr 3 2007, 10:34  =AK= Цитата(Axxel @ Apr 3 2007, 17:04) To =AK=... Apr 3 2007, 10:40   Axxel Цитата(=AK= @ Apr 3 2007, 13:40) Ну так в... Apr 3 2007, 10:43  Visor Цитата(Axxel @ Apr 3 2007, 15:34) Дело в ... Apr 3 2007, 12:52   Axxel К сожалению АСМом не владею...
Как это будет выг... Apr 3 2007, 13:24    Visor Цитата(Axxel @ Apr 3 2007, 18:24) Суть сл... Apr 3 2007, 14:21     Mario Цитата(Visor @ Apr 3 2007, 14:21) Берётся... Apr 7 2007, 22:24 slog Если опрашивать реже, чем время дребезга, никакие ... Apr 3 2007, 20:21 Axxel Мне кажется что задержки
типа delayms() в алгоритм... Apr 9 2007, 05:00 Mario Цитата(Axxel @ Apr 9 2007, 08:00) Мне каж... May 15 2007, 10:15 Kitsok Нашел. Технология называется vertical counters.
Во... May 15 2007, 09:24 Oleg_IT Цитата(Kitsok @ May 15 2007, 13:24) Нашел... May 15 2007, 09:58  Kitsok Цитата(Oleg_IT @ May 15 2007, 13:58) См. ... May 15 2007, 12:47
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|