Перейти к содержанию
    

Подавление дребезга контактов

Дело в том что мне необходимо контролировать не клавиатуру, а несколько датчиков.

Т.е каждый датчик нужно проверять на дребезг по отдельности,датчики могут сработать

одновременно, и.т.д. Т.е необходим одновременный контроль.

 

Конечно, в принципе я понимаю что хватит и двух устойчивых состояний для

принятия нажатия, но... мало ли что может произойти.

Я свой алгоритм как раз таки и применял для датчиков, для индуктивных датчиков оборота в счетчиках электроэнергии, дребезг с них был дай боже. В результате точность подсчёта соответствовала действительности. Вот как это можно реализовать на асме для 8 входов:

; Time slot
; Pushbuttons #00-07 status
    in        PB00_07_In,PIND
    eor        PB00_07_In_Aux,PB00_07_In
    and        PB00_07_Stat,PB00_07_In_Aux
    com        PB00_07_In_Aux
    and        PB00_07_In_Aux,PB00_07_In
    or        PB00_07_Stat,PB00_07_In_Aux
    mov        PB00_07_In_Aux,PB00_07_In

Изменено пользователем Visor

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

К сожалению АСМом не владею... :(

Как это будет выглядеть на Си?

 

Суть следующая: не могу понять

как можно обработать один датчик(клавишу, и.т.д)

на дребезг, обрабатывая порт целиком.

 

Я сразу как то предположил что обрабатывать

нужно каждый вывод по отдельности.

Изменено пользователем Axxel

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Суть следующая: не могу понять

как можно обработать один датчик(клавишу, и.т.д)

на дребезг, обрабатывая порт целиком.

Берётся новое состояние байта входов и сравнивается с предыдущим посредством "Exclusive OR", тем самым выделяются изменившиеся и неизменившиеся биты, затем с помощью простых логических операций, изменившимся битам присваиваются старые значения статуса, а неизменившимся новые значения байта входов. Алгебра логики рулит! ;)

А чтоб понять листинг, поглядите используемые команды хоть в любом даташите для AVR, хотя и так понять можно AND - И, OR - ИЛИ, ...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если опрашивать реже, чем время дребезга, никакие сложные алгоритмы не нужны вообще. Считали порт. Есть сигнал - датчик сработал, нет - значит нет. И всё.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Берётся новое состояние байта входов и сравнивается с предыдущим посредством "Exclusive OR", тем самым выделяются изменившиеся и неизменившиеся биты, затем с помощью простых логических операций, изменившимся битам присваиваются старые значения статуса, а неизменившимся новые значения байта входов. Алгебра логики рулит! ;)

Если можно покажите это на примере, (на С), пожалуйста.

 

 

Иногда делаю вот таким кустарным методом:

unsigned char SkanKlava (void)

{

if(KN_Ok==0){

delay_ms(10);// защита от дребезга

 

if(KN_Ok==0){ //проверяем еще раз

return 0x01; //нажата кнопка "Ок"

};

};

//...и т.д. (все остальные кнопки)

}

Может не совсем красиво но иногда выгодно. :huh:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Мне кажется что задержки

типа delayms() в алгоритме подавления дребезга

это не есть гут, хотя все конечно зависит от программы.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Давно и хорошо работающий код. Обслуживает несколько клавиш.

 

Очень код понравился, пред-оптимизированный ;) Но вот 8 циклов чтения на подавление дребезга - это много... А нету ли чего-нибудь похожего, но, скажем, с тремя циклами?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Нашел. Технология называется vertical counters.

Вот ссылки:

http://www.dattalo.com/technical/software/pic/debounce.html

http://www.dattalo.com/technical/software/pic/vertcnt.html

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Нашел. Технология называется vertical counters.

Вот ссылки:

http://www.dattalo.com/technical/software/pic/debounce.html

http://www.dattalo.com/technical/software/pic/vertcnt.html

 

См. моё предложение на первой странички http://electronix.ru/forum/index.php?showt...=29296&st=0

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Мне кажется что задержки

типа delayms() в алгоритме подавления дребезга

это не есть гут, хотя все конечно зависит от программы.

 

Полностью с Вами согласен. Поэтому я тут. Хочу чему-нибудь научиться у Форумчан. :)

 

С уважением, Mario.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

См. моё предложение на первой странички

Так я собственно от этого и искал ;)

 

Я-ж написал, что алгоритм очень хороший, но 8 шагов - многовато.

Кстати, вкурив в эти вертикальные счетчики я обнаружил, как "дешево" с точки зрения кода сделать еще ряд операций в моем проекте, так что спасибо за наводку ;)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...