0 / 0 / 0
Регистрация: 04.07.2014
Сообщений: 46
1

Подсчет "дребезжаний" кнопки

09.11.2014, 09:15. Показов 21365. Ответов 25
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте всем!

Задумал я такое дело, мне стало интересно подсчитать сколько раз будет дребезжать кнопка при замыкании. И то ли мне сферическая кнопка в вакууме попалась, то ли я что-то не так делаю... В итоге у меня считается, почему-то, количество НАЖАТИЙ на кнопку. Задумка такая. У меня собран эдакий франкенштейн на макетке из трех сдвиговых регистров 74HC595, соединенных последовательно, к ним подключены три отдельных семисегментника. Рулит ими ATTiny13A, путем велосипеда из костылей (я изучал как оно все работает и набросал свое видение работы с регистрами) можно проталкивать в регистры и тем самым выводить на индикаторы цифры в виде строки из трех ascii-символов. Эта часть работает и отлажена. Идем далее. На прерывание INT0 повешена кнопка, срабатывает на нисходящий фронт. Так же используется таймер для ограничения по времени подсчета дрыгов кнопочных контактов. Код я постарался прокомментировать по максимуму, там должно быть все понятно что и куда и откуда. Ножка с прерыванием я подтянул резистором 4.7кОм на питание, а кнопка замыкает пин на землю тем самым вызывая прерывание.

Как оно должно работать. При первом замыкании пина на землю срабатывает прерывание и запускает таймер, который тикает ровно секунду, а дребезг тем временем наматывает счетчик в прерывании INT0. В главном цикле идет проверка таймера и как только он оттикал положенную ему секунду останавливает счетчик и выводит на индикаторы подсчитанное количество дребезжаний контактов кнопки.

Но вот незадача... Выводится не дребезжания, а количество нажатий кнопки сделанных за секунду. Неужели кнопка у меня попалась идеальная?... Был бы осциллограф было бы легче. А так приходится теряться в догадках что же там происходит :)

Код: http://pastebin.som/WH5qNKDa

upd: Забыл сказать, ножку с прерыванием настраивал и как вход со внутренней подтяжкой, и как вход Hi-Z. Результат все тот же.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.11.2014, 09:15
Ответы с готовыми решениями:

Подсчет нажатий кнопки
Пищю код который считает нажатия и записывает в лябел.Но 1 пощитало и дальше нет во код Dim a as...

Подсчет нажатий кнопки мыши
Помогите с программой.. Программа считает количество нажатий ЛКМ, нужно сделать, чтобы по нажатию...

Подсчёт нажатия кнопки. Где ошибки?
Здравствуйте! Я студент технического ВУЗа. Мы проходим intel 8080/8085 и работаем с интерфейсом под...

Подсчет выбраных чекбоксов при нажатии кнопки
В одном хтмл файле(form.html) рисуется форма с checkbox'ами, которая вызывается в php...

25
0 / 0 / 0
Регистрация: 19.11.2010
Сообщений: 790
15.05.2015, 11:27 21
Author24 — интернет-сервис помощи студентам
Какое в жопу инт? Зачем его в неё? Без него в ней никак не обойтись, да?

1. зафиксировали нажатие переход кнопки из состояния "отжато" в состояние "нажато"
2. начали отсчёт длительности нахождения непрерывного нахождения в нажатом состоянии
3. по досчёту до заданного значения отработали факт "кнопка нажата уже давно"

И дальше одни погромисты делятся на любителей прозрачности-читаемости-отлаживаемости в лоб, а другие на кульхацкеров из любви к искусству выебнуться оригинальностью.
0
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 1,818
15.05.2015, 11:31 22
мне их солить что ли эти инт? если есть - почему бы не воспользоваться?
и потом, как правильно второй пункт реализовать?
0
0 / 0 / 0
Регистрация: 21.08.2011
Сообщений: 1,057
15.05.2015, 12:48 23
Тема обглодана уже очень и очень давно. В первую очередь стоит навесить RC-цепочку на кнопку. Во-вторых неясно какие ресурсы доступны и что в приоритете: скорость, простота или минимум кода.
Если есть системный глобальный таймер и прерывание от него, можно ним замерять прошедшее время.
Озвученное решение с таймером и запретом прерываний тоже годится.

Цитата Сообщение от _moysi
Какое в жопу инт? Зачем его в неё? Без него в ней никак не обойтись, да?
1. зафиксировали переход кнопки из состояния "отжато" в состояние "нажато"
А как Вы предлагаете детектить нажатие? Циклическим опросом?
Цитата Сообщение от _moysi
2. начали отсчёт длительности непрерывного нахождения в нажатом состоянии
А как определить непрерывное нахождение?
Эти советы напоминают анекдот про сову-стратега и мышек.
0
0 / 0 / 0
Регистрация: 15.06.2012
Сообщений: 3,097
15.05.2015, 13:28 24
Цитата Сообщение от koriprokrommyst
мне их солить что ли эти инт? если есть - почему бы не воспользоваться?
Если это имеет практический смысл (например надо будить камень) , то пользуйся на здоровье. А пользовать прерывания без реальной надобности это моветон.
0
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 1,818
16.05.2015, 04:32 25
ох. сижу(лежу), сочиняю. думается, слишком много у меня логики - ветвлений всяких - для внешнего прерывания ( вложенных ветвей if аж по три штуки)

хз как это сделать правильно. мне нужен программный антидребезг. + нужно менять глобальный признак config_mode, если нажатие было долгим. и сбрасывать некий глобальный счетчик - если нажатие было коротким. а если короткое нажатие было при активном config_mode, то либо сохранять байт в eeprom, либо не сохранять, в зависимости от значения другого счетчика.

думаю, что писать eeprom из прерывания наверное вообще плохо (хотя в тестовом коде вроде бы писал без всяких проблем)

с другой стороны, если делать все эти опросы из основного кода - не хотелось бы его подвешивать
с третьей стороны, у меня тут есть функция micros(), которая считает количество микросекунд с запуска контроллера.

как тут правильнее поступить?

по второму прерыванию смотрю импульсы до 10 мс - для него вроде бы некритично?
плюс в micros() используется таймер0 по полной - вот для него наверное лучше бы не занимать ресурсы…

или правильнее все же написать этот обработчик, и потом уже смотреть, сколько тактов оно выполняет?
0
0 / 0 / 0
Регистрация: 22.06.2012
Сообщений: 320
16.05.2015, 08:02 26
А в чем проблема? по прерыванию устанавливать флаг, в самой программе его опрашивать, запускать таймер по этому флагу, по прерыванию таймера устанавливать флаг длительного нажатия. По завершении всех действий опрашивать порт, если уровень изменился, сбрасывать оба флага и останавливать таймер. Если используется динамическая индикация, времени на всё хватит с головой (зажигание цепочки светодиодов займёт больше времени, чем дребезг кнопки )
0
16.05.2015, 08:02
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.05.2015, 08:02
Помогаю со студенческими работами здесь

Подсчет суммы двух чисел при нажатии кнопки
Добрый день! новичок, стараюсь как могу, учу. Но сам дизайнер и мозгу сложно с графики на код...

Подсчёт количества «кликов» левой, правой и средней кнопки мыши
Написать приложение, в котором ведётся подсчёт количества «кликов» левой, правой и средней кнопки...

Написать приложение, в котором ведётся подсчёт количества «кликов» левой и правой кнопки мыши
Пробовала по книжкам писать и сайтах, но никак не могу понять как правильно написать. Выбивает одну...

Подсчет количества "кликов" левой, правой и средней кнопки мыши
Написать приложение в котором ведется подсчет количества "кликов" левой, правой и средней кнопки...

Подсчет суммы столбцов в базе данных и вывод суммы в edit по нажатию кнопки
подсчет суммы столбцов в базе данных и вывод суммы в edit по нажатию кнопки в delphi

Выполнить подсчет в массиве количества чисел, кратных 2,3,5 создав для этого три кнопки и три метки вывода
Помогите плиз, подруге задали задачу, она попросила меня решить ее, не охота выглядеть лохом. Но я...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
26
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru