Посоветуйте методику программного подавления дребезга клавы (Можно в блок-схемах. Матрица - 8 х 16 кнопок.)

Все, что не подходит под определение "старого софта и железа", обсуждается здесь
Ответить
MM
Advanced Member
Сообщения: 5894
Зарегистрирован: 02.08.2013,22:13
Откуда: Павловский Посад Мск.обл.
Контактная информация:

Вклад в сообщество

Посоветуйте методику программного подавления дребезга клавы

Сообщение MM » 31.07.2017,00:15

Можно в блок-схемах. Матрица - 8 х 16 кнопок.

Прошу уважаемых кодеров посоветовать методику ( или алгоритм ) программного подавления дребезга клавы, матрица - 8 х 16 кнопок ( 128 шт.). Допускаются одновременные нажатия нескольких кнопок .

Девайс - внешняя клава для компа.

Кнопки могут быть не очень надежными.

Быстродействие проца клавы - 1 млн рег-рег.
Коллекционирование радиодеталей : http://collectingrd.kxk.ru/

Anonymous1
Advanced Member
Сообщения: 2727
Зарегистрирован: 22.11.2011,09:41
Откуда: Москва(Россия)

Вклад в сообщество

Сообщение Anonymous1 » 31.07.2017,04:30

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

Sergei Frolov
Advanced Member
Сообщения: 2820
Зарегистрирован: 05.07.2003,15:30
Откуда: Питер
Контактная информация:

Конкурсы

Вклад в сообщество

Сообщение Sergei Frolov » 31.07.2017,08:19

Три (например) ячейки для хранения трех одновременно нажимаемых кнопок.
В каждой ячейке два байта - код кнопки и счетчик.

При периодическом опросе происходит определение нажатой кнопки и скан среди этих трех ячеек. Если нажатая кнопка в одной из ячеек уже нажималась, то увеличить ей счетчик. Если счетчик дошел до значения X, то выработать признак нажатой кнопки. Если кнопка не нажималась, то уменьшить ей счетчик, пока не дойдет до нуля. Как дойдет до нуля, то очистить код кнопки (освободить ячейку).

Как-то так
Собираю в коллекцию советские калькуляторы и компьютеры.
Мой сайт: http://www.leningrad.su/museum/ ICQ=12370106 https://t.me/retrocomps

Аватара пользователя
F0lken
Advanced Member
Сообщения: 1259
Зарегистрирован: 07.11.2006,10:48
Контактная информация:

Конкурсы

Вклад в сообщество

Сообщение F0lken » 31.07.2017,09:44

Вот тут с картинками https://github.com/thomasfredericks/Bounce2/wiki
Использовал либу не раз, и тоже на матричной клавиатуре.

Вот еще проще http://wikihandbk.com/wiki/Arduino:%D0% ... B/Debounce


Mildi
Advanced Member
Сообщения: 981
Зарегистрирован: 03.09.2016,21:03
Откуда: Мончегорск

Сообщение Mildi » 13.08.2017,13:02

Я делал подпрограмму которая опрашивая клавиатуру сравнивает 3-4 (подбирается по скорости опроса) результата опроса подряд если они одинаковые то считается клавиша нажата, если меньше то дребезг и игнорирует результат и сравнение идет сначала с обнулением промежуточного результата. Если следующие 3-4 опроса повторяют результат первых опросов то считается длительное нажатие (или повторное, смотря что требуется по логике работы девайса). Для сравнения хранилось только байт - предыдущее значение и байт - счетчик числа совпадений, Цикл сканирования заканчивался проверкой количества совпадений когда оно достигало нужного значения в моем случае 3-4 то происхоила выдача результатат и цикл запускался по новой.
Для нескольких линий опроса по такому алгоритму надо опрашивать каждую линию, а потом вычислять по результату опроса какие клавиши на каких линиях считать нажатыми.
попутно шунтирование выхода клавиатуры небольшими емкостями на землю.
Ищу SRAM 16кб х 4бит DIP-24 например 7C166-15(20) и подобные.

MM
Advanced Member
Сообщения: 5894
Зарегистрирован: 02.08.2013,22:13
Откуда: Павловский Посад Мск.обл.
Контактная информация:

Вклад в сообщество

Сообщение MM » 13.08.2017,15:25

Mildi писал(а):Я делал...
Спасибо за совет !

Предполагаю реализовать матрицу на 128 слов ( по 2 байта ) , т.к. кнопок всего 128 ( 8 х 16 ) , где старший байт - маркер "нажата/отжата", а младший байт - счетчик попыток/сканов. Необходимо получение сигнала как нажатой кнопки, так и отжатой.
Например, при первом проходе ( сканировании ) нажатой кнопки просто добавляется единица в счетчик проходов ( младший байт слова состояния кнопки ), а при достижении значения, например, "5", выставляется флаг "нажата" в старшем байте и идет передача данных. Дальше, соответственно, при сканировании этой кнопки, если она нажата - ничего не делается, а при отжатии - начинается декремент байта значения, и при достижении значения "1" в старшем байте слова состояния кнопки ставится маркер "отжата", и идет передача сигнала "отжата кнопка N".
Т.к. клава предполагается с полным функционалом, необходимо отслеживать несколько одновременно нажатых кнопок.
Быстродействие 1806ВМ2 - 1 млн рег-рег., сканирвание будет основной задачей ( не подпрограммой ). По мере испытаний выставлю время ожидания дребезга в 0.05 сек примерно.
Коллекционирование радиодеталей : http://collectingrd.kxk.ru/

Аватара пользователя
Кай
Почётный пользователь
Сообщения: 19738
Зарегистрирован: 08.08.2010,21:44
Откуда: СПб, Ульянка-Лигово
Контактная информация:

Вклад в сообщество

Сообщение Кай » 13.08.2017,15:33

...аппаратно дребезг кнопок ведь решался включением КМ-ок?
- Студент, принесите из вивария живую мышь и подготовьте её к опыту.
Полученную кашицу...

Anonymous1
Advanced Member
Сообщения: 2727
Зарегистрирован: 22.11.2011,09:41
Откуда: Москва(Россия)

Вклад в сообщество

Сообщение Anonymous1 » 13.08.2017,15:58

Аппаратно он решался установкой н1806хм1-<какая_прошивка_не_помню>, по крайней мере в самолётных пультах 1990х годов.

Mildi
Advanced Member
Сообщения: 981
Зарегистрирован: 03.09.2016,21:03
Откуда: Мончегорск

Сообщение Mildi » 13.08.2017,19:16

Кай писал(а):...аппаратно дребезг кнопок ведь решался включением КМ-ок?
Не обязательно КМ, любые емкости которые с резисторами подтяжки образуют RC цепочку. постоянная времени которой больше времени дребезга.
в идеале конечно еще и тригеры шмидта в цепь включить, но не обязательно.
Ищу SRAM 16кб х 4бит DIP-24 например 7C166-15(20) и подобные.

MM
Advanced Member
Сообщения: 5894
Зарегистрирован: 02.08.2013,22:13
Откуда: Павловский Посад Мск.обл.
Контактная информация:

Вклад в сообщество

Сообщение MM » 13.08.2017,19:49

Mildi писал(а):...тригеры шмидта в цепь включить...
Лет 20 назад делали экспериментальный мод клавы-скрипучки для БК0010 - от кнопок ПКН111 отсоединялось всё, на плату скрипучки навешивались макетные тонкие длинные платочки с 564ТЛ1В и 564КТ3В, некотрое к-во резисторов НР1-4-9 , ИК светики АЛ107 ( ??? ) и фотодиоды. К подвижным элементам ПКН-111 приделывались булавки швейные, которые через отверстия в ДПП скрипучки перекрывали свет между оптопарами.
Вся конструкция работала, но со скрипом ( т.к. кнопки остались те же ;) )
И в корпус БКшки, конечно, потребовалось ставить дополнительные 2 комплекта рамочек.
Зато никакого дребезга !
Коллекционирование радиодеталей : http://collectingrd.kxk.ru/

Ответить