Visor 0 3 апреля, 2007 Опубликовано 3 апреля, 2007 (изменено) · Жалоба Дело в том что мне необходимо контролировать не клавиатуру, а несколько датчиков. Т.е каждый датчик нужно проверять на дребезг по отдельности,датчики могут сработать одновременно, и.т.д. Т.е необходим одновременный контроль. Конечно, в принципе я понимаю что хватит и двух устойчивых состояний для принятия нажатия, но... мало ли что может произойти. Я свой алгоритм как раз таки и применял для датчиков, для индуктивных датчиков оборота в счетчиках электроэнергии, дребезг с них был дай боже. В результате точность подсчёта соответствовала действительности. Вот как это можно реализовать на асме для 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 Изменено 3 апреля, 2007 пользователем Visor Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Axxel 0 3 апреля, 2007 Опубликовано 3 апреля, 2007 (изменено) · Жалоба К сожалению АСМом не владею... :( Как это будет выглядеть на Си? Суть следующая: не могу понять как можно обработать один датчик(клавишу, и.т.д) на дребезг, обрабатывая порт целиком. Я сразу как то предположил что обрабатывать нужно каждый вывод по отдельности. Изменено 3 апреля, 2007 пользователем Axxel Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Visor 0 3 апреля, 2007 Опубликовано 3 апреля, 2007 · Жалоба Суть следующая: не могу понять как можно обработать один датчик(клавишу, и.т.д) на дребезг, обрабатывая порт целиком. Берётся новое состояние байта входов и сравнивается с предыдущим посредством "Exclusive OR", тем самым выделяются изменившиеся и неизменившиеся биты, затем с помощью простых логических операций, изменившимся битам присваиваются старые значения статуса, а неизменившимся новые значения байта входов. Алгебра логики рулит! ;) А чтоб понять листинг, поглядите используемые команды хоть в любом даташите для AVR, хотя и так понять можно AND - И, OR - ИЛИ, ... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
slog 0 3 апреля, 2007 Опубликовано 3 апреля, 2007 · Жалоба Если опрашивать реже, чем время дребезга, никакие сложные алгоритмы не нужны вообще. Считали порт. Есть сигнал - датчик сработал, нет - значит нет. И всё. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Mario 0 7 апреля, 2007 Опубликовано 7 апреля, 2007 · Жалоба Берётся новое состояние байта входов и сравнивается с предыдущим посредством "Exclusive OR", тем самым выделяются изменившиеся и неизменившиеся биты, затем с помощью простых логических операций, изменившимся битам присваиваются старые значения статуса, а неизменившимся новые значения байта входов. Алгебра логики рулит! ;) Если можно покажите это на примере, (на С), пожалуйста. Иногда делаю вот таким кустарным методом: unsigned char SkanKlava (void) { if(KN_Ok==0){ delay_ms(10);// защита от дребезга if(KN_Ok==0){ //проверяем еще раз return 0x01; //нажата кнопка "Ок" }; }; //...и т.д. (все остальные кнопки) } Может не совсем красиво но иногда выгодно. :huh: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Axxel 0 9 апреля, 2007 Опубликовано 9 апреля, 2007 · Жалоба Мне кажется что задержки типа delayms() в алгоритме подавления дребезга это не есть гут, хотя все конечно зависит от программы. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kitsok 0 15 мая, 2007 Опубликовано 15 мая, 2007 · Жалоба Давно и хорошо работающий код. Обслуживает несколько клавиш. Очень код понравился, пред-оптимизированный ;) Но вот 8 циклов чтения на подавление дребезга - это много... А нету ли чего-нибудь похожего, но, скажем, с тремя циклами? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kitsok 0 15 мая, 2007 Опубликовано 15 мая, 2007 · Жалоба Нашел. Технология называется vertical counters. Вот ссылки: http://www.dattalo.com/technical/software/pic/debounce.html http://www.dattalo.com/technical/software/pic/vertcnt.html Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Oleg_IT 0 15 мая, 2007 Опубликовано 15 мая, 2007 · Жалоба Нашел. Технология называется 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Mario 0 15 мая, 2007 Опубликовано 15 мая, 2007 · Жалоба Мне кажется что задержки типа delayms() в алгоритме подавления дребезга это не есть гут, хотя все конечно зависит от программы. Полностью с Вами согласен. Поэтому я тут. Хочу чему-нибудь научиться у Форумчан. :) С уважением, Mario. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kitsok 0 15 мая, 2007 Опубликовано 15 мая, 2007 · Жалоба См. моё предложение на первой странички Так я собственно от этого и искал ;) Я-ж написал, что алгоритм очень хороший, но 8 шагов - многовато. Кстати, вкурив в эти вертикальные счетчики я обнаружил, как "дешево" с точки зрения кода сделать еще ряд операций в моем проекте, так что спасибо за наводку ;) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться