Опрос кнопок микроконтроллером

Дисплеи, датчики и прочие функциональные узлы, управляемые МК.
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Re: Помогите опросить кнопку

Сообщение Gudd-Head »

shads писал(а):Подключение через INT0 или INT1
О, у меня так: 2 кнопки повесил на внешние прерывания. Но вопрос не об этом.

А что если для различения одиночного/длинного нажатия использовать постоянно крутящийся таймер со временем переполнения ≈256 мс? И считать сколько раз он перпеполнился пока нажата кнопка.
Плюс в том, что он будет настроен всего 1 раз в начале проги.
Минус — погрешность 256 мс если его не обнулять.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Alexeyslav
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич
Контактная информация:

Re: Помогите опросить кнопку

Сообщение Alexeyslav »

Конечно. для 2 сек "длинного" нажатия этого хватит.
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Re: Помогите опросить кнопку

Сообщение Gudd-Head »

Вот только как понять что кнопку не отпустили на долю секунды? А что её именно постоянно держали?
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Alexeyslav
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич
Контактная информация:

Re: Помогите опросить кнопку

Сообщение Alexeyslav »

Сработает прерывание же. сбрасываешь счетчик и признак ожидания длинного нажатия.
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Re: Помогите опросить кнопку

Сообщение Gudd-Head »

В том-то и дело, не хотел я выходить из обработчика прерывания пока таймер крутится (не переполнился).
Нехорошо, конечно, висеть в прерывании. Но мне и спешить-то некуда :)
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Alexeyslav
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич
Контактная информация:

Re: Помогите опросить кнопку

Сообщение Alexeyslav »

Если не выходишь из прерывания, то можно и обычные задержки использовать, по милисекундам накручивать в цикле и как насчитаешь 2000мс - выполнять функцию. Один фиг работа программы будет остановлена.
Аватара пользователя
zero648
Вымогатель припоя
Сообщения: 650
Зарегистрирован: Пн июн 18, 2012 12:01:04
Откуда: Челябинская область, Копейск

Re: Помогите опросить кнопку

Сообщение zero648 »

Gudd-Head писал(а):В том-то и дело, не хотел я выходить из обработчика прерывания пока таймер крутится (не переполнился).
Нехорошо, конечно, висеть в прерывании. Но мне и спешить-то некуда :)

В теле обработчика сбрасываем флаг переполнения нужного таймера, далее организовать бесконечный цикл проверки флага переполнения таймера и при установке флага увеличивать счетчик переполнений, проверяем количество переполнений и если мало, то сбросываем флаг и возвращаемся в цикл проверки флага переполнения, если переполнений хватает, то выходим из прерывания, глушим этот канал INT до тех пор пока кнопка еще в нажатом состоянии, ну или что-то типа того, выполняем нужный код этого события.
Alexeyslav
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич
Контактная информация:

Re: Помогите опросить кнопку

Сообщение Alexeyslav »

Как-то это совсем неправильно и расточительно. Зачем в прерывании задерживаться? По нажатию сбрасываем счетчик, а по отпусканию проверяем сколько насчитал переполнений таймер и выполняем нужную функцию. Но... все это хорошо, а в реальности получим облом из-за дребезга контактов. Если уж гоняем таймер впустую, то пусть там же и опрашивается кнопка. Кнопка нажата? +1 в счетчик, кнопка только что отпущена? проверяем счетчик выполняем нужную функцию и сбрасываем счетчик.
Прерывания на копку нужно использовать только тогда когда нужна мгновенная реакция, например защита в станке.
Аватара пользователя
zero648
Вымогатель припоя
Сообщения: 650
Зарегистрирован: Пн июн 18, 2012 12:01:04
Откуда: Челябинская область, Копейск

Re: Помогите опросить кнопку

Сообщение zero648 »

... а по отпусканию проверяем сколько насчитал переполнений таймер и выполняем нужную функцию
Кстати, вот это тоже не правильно, считать нужно во время удержания кнопки, а иначе не понятно, сколько уже продержали, передержали или недодержали, узнаем когда отпустим получается.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Помогите опросить кнопку

Сообщение ARV »

Alexeyslav писал(а):Прерывания на копку нужно использовать только тогда когда нужна мгновенная реакция, например защита в станке.
когда-то я уже писал... видимо, пора повторять :)

прерывания для кнопок - это вообще в подавляющем большинстве случаев глупость. и даже для защиты станка мгновенная реакция (напомню: для скромненького AVR с тактовой частотой 1 МГц время реакции на внешний запрос прерывания составит порядка 16 микросекунд) совершнеео не требуется!

мышечная реакция специально тренированного человека редко превышает 50 миллисекунд, у большинства обычных людей она около 100 миллисекунд и более. время срабатывания реле в станке примерно того же порядка. остановка шпинделя или там еще какой-то движущейся части займет уже секунды...

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

Мой уютный бложик... заходите!
Аватара пользователя
shads
Опытный кот
Сообщения: 882
Зарегистрирован: Ср фев 22, 2012 01:25:21

Re: Помогите опросить кнопку

Сообщение shads »

Gudd-Head писал(а):Вот только как понять что кнопку не отпустили на долю секунды? А что её именно постоянно держали?

Я уже лет 10 пользуюсь первым вариантом отсюда http://asis-kbr.ru/forum/viewtopic.php?f=13&t=173
И защита от дребезга есть и длинные\короткие нажатия отличает...
Alexeyslav
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич
Контактная информация:

Re: Помогите опросить кнопку

Сообщение Alexeyslav »

Ну, тогда смотреть на счетчик он будет расти только если кнопка удерживается, иначе он находится в нуле.

А насчет защиты, когда-то показывали по телевизору изобретение некой защиты - не то что шпиндель, а пила останавливается после подачи сигнала настолько быстро что зубья проходят не больше милиметра. Это именно счет идет на микросекунды. Хотя тут конечно микроконтроллеру уже не место, если он вдруг будет находится в обработке другого прерывания за это время пила может оттяпать палец...
.Lexx.
Родился
Сообщения: 12
Зарегистрирован: Пт май 10, 2013 19:31:50

Re: Помогите опросить кнопку

Сообщение .Lexx. »

Создал вначале крупную (по-моему) программку с 16 светодиодами не запахало. В итоге дошёл до 2 светиков и 2 кнопок. Не понимаю почему при нажатии и последующем отжатии светодиоды продолжают мигать. Действие ПИНД.1 также не помогло.
Вложения
Project.rar
(12.96 КБ) 295 скачиваний
Аватара пользователя
Halex
Грызет канифоль
Сообщения: 281
Зарегистрирован: Пт ноя 15, 2013 20:58:23

Re: Помогите опросить кнопку

Сообщение Halex »

.Lexx. писал(а):Не понимаю почему при нажатии и последующем отжатии светодиоды продолжают мигать. Действие ПИНД.1 также не помогло.

А мне вот непонятно назначение резисторов в вашей схеме (фрагмент). Догадываюсь, что наступил "летний сезон", отопление отрубили, а на улице хоть и май, но не подарок. Видимо Вы решили этими резисторами квартиру погреть. Ну, так они же нарисованные!!! В натуре греть будут, а на экране - нет. Да, для сугрева надо бы и уменьшить номинал на несколько порядков...
Для незнакомых с Протеусом поясню, что те стрелки вверх без обозначений - шина питания VCC=+5V. Приятного просмотра...
Изображение
.Lexx.
Родился
Сообщения: 12
Зарегистрирован: Пт май 10, 2013 19:31:50

Re: Помогите опросить кнопку

Сообщение .Lexx. »

Ошибся в схеме, действительно.
Сначала дорогой друг хотел послать вас нах_*Й... За ваш прекраснейший ответ. Ибо по существу, ответа как такового не было.
В итоге сам нашёл ошибку.
Ошибка элементарная, и очень обидная. Неправильно расставил подтягивающие резисторы, ибо в моей схеме выводы ATMEG висят в воздухе при не нажатой кнопке.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Помогите опросить кнопку

Сообщение Аlex »

.Lexx. писал(а):Ибо по существу, ответа как такового не было.
Ответ, как раз и был по существу, если Вы до сих пор не поняли этого. Отсюда Halex и говорил про нагрев, ибо они тупо на питании висят, а не делают подтяжку портов.

ЗЫ: Вовремя Вы свой пост снесли, ещё бы пару минут и ушли бы в БАНьку за оскорбления ...
Аватара пользователя
Halex
Грызет канифоль
Сообщения: 281
Зарегистрирован: Пт ноя 15, 2013 20:58:23

Re: Помогите опросить кнопку

Сообщение Halex »

.Lexx. писал(а):В итоге сам нашёл ошибку.

Только не повторите ее "натюрлих", в смысле - в железе. Если намерены разместить кнопки со стороны + питания - поставьте последовательно токоограничивающие резисторы, а то попалите порты, а я опять виноватым буду, что на это Вам не указал.
Аlex писал(а):Ответ, как раз и был по существу...

Спасибо за понимание. Ибо, ибо ... (ну как там у Бендера в "12-ти стульях" ... не смог закончить мысль). А если серьёзно, то смысл своих подсказок как раз и вижу не в тупом "тыканье носом", а чтобы спрашивающий сам увидел косяк - это лучше и на дольше запоминается. Вроде получилось...
Ну, и, в конце то концов, с праздником нас, РадиоКотов!!! Выше антенны (ИМХО - хвосты) - дальше радиосвязь (ИМХО - "пометим" территорию)!!!
Аватара пользователя
B@R5uk
Собутыльник Кота
Сообщения: 2896
Зарегистрирован: Сб ноя 13, 2010 12:53:25
Откуда: приходит весна?

Re: Помогите опросить кнопку

Сообщение B@R5uk »

Какое обычно время надо выждать, чтобы гарантировать, что дребезг кнопки закончился?

У меня идея опрашивать миниклавиатуру по прерыванию от таймера. При этом не хочется сильно заморачиваться. Если я поставлю достаточно редкое время опроса (допустим 0,016 с), то не вылезут ли какие-нибудь бяки у этого алгоритма?

То есть может ли длительность дребезга оказаться длиннее 0,016 с?
Alexeyslav
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич
Контактная информация:

Re: Помогите опросить кнопку

Сообщение Alexeyslav »

Смотря какие кнопки, 16мс - это нормальный период для нормальных неразболтаных кнопок а для разболтаных дребезг может не закончится никогда.
Аватара пользователя
B@R5uk
Собутыльник Кота
Сообщения: 2896
Зарегистрирован: Сб ноя 13, 2010 12:53:25
Откуда: приходит весна?

Re: Помогите опросить кнопку

Сообщение B@R5uk »

Спасибо. У меня пока герконовые кнопки от какой-то старой советской вычислительной машины (или станка). Время дребезга вообще как-то нормируется? А то я пробовал измерять количество импульсов, возникающих во время включения и выключения этих герконов, их там попадалось чуть ли не до десяти.
Ответить

Вернуться в «Периферия»