Свежие обсуждения
Микроконтроллеры

Ликбез по С для микроконтроллеров PIC

1 34 64

DWD: придётся делать программную защиту от дребезга?
Скорее не защиту, а задержку на обработку кнопок...
Всё зависит от времени работы подпрограммы обработки прерывания, другими
словами Вы нажали кнопку, ушли в прерывание (допустим обработчик прерывания
работает 100 мкс, а минимальное время нажатия кнопки 10 мс), выйдя из обработчика
прерывания программа тут же вернётся обратно и за один тычок насчитает 100 нажатий...
Кстати где-то на форуме всплывала тема: минимальное время нажатия кнопки, и никто
не мог понять зачем

 

Ну, задержку перед считыванием, наверно, придётся делать, приняв, что повторное нажатие не должно быть ранее, чем через 100мс, например.
Посмотрю, сколько времени займёт обработка прерывания. Собираюсь работать на частоте 37кГц.
К тому же, будет проверка - "А отпускалась ли кнопка после нажатия?"

Один такт получается 0,108мс, а антидребезг делается, обычно, на 20мс. Значит, если программа обработки будет иметь не меньше 20мс/0,108мс=185 строк, то после отработки нажатия можно будет сразу разрешать прерывания по уровню, ожидая следующего нажатия.

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

Кто нибудь использовал это в своих прогах?

 

DWD: но сейчас меня интересует именно дребезг. Нужно ли от него защищаться при использовании прерывания по уровню?
Я ничего не применяю, а как раз задержку в обработчике делаю, на 4 МГц у меня 200 мс,
это время как раз позволяет нажав один раз получить допустим +1, а удерживая кнопку
быстрое листание...

 

DWD: Нужно ли от него защищаться при использовании прерывания по уровню?

Если не включать это прерывание сразу после его срабатываения - то не нужно. Но перед следующим включнием - очистите его флаг !

 

poruchik: ...задержку в обработчике делаю...

В двух словах можете описать логику работы?

Fargus: Если не включать это прерывание сразу после его срабатываения - то не нужно.

Что значит "не включать это прерывание"?
Расшифруйте, пожалуйста.

 

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

 

Я в своих программах поступал иначе. В прерывании считывал состояния кнопок и заносил его в регистр "КНОПКИ". Если какая-либо кнопка нажата, выставлял флаг "НАЖАТА КНОПКА".
В самой программе, когда появлялась возможность, проверял флаг "НАЖАТА КНОПКА". Если результат "положительный", то сбрасывал этот флаг и делал задержку на 20 мс и после этого повторно проверял состояние флага. Если он остался положительным, то уходил на функцию реакции на нажатие. В завершении функции ждал, пока отпустят кнопку и не будут ее нажимать в течении следующих 20 мс.
Правда у меня были только "однократные" нажатия, длительное нажатие у меня не приводило к "быстрому листанию", хотя это добавить не сложно.

 

Немного поздновато, но выскажусь
Ув DWD, если от кнопок требуются только нажатия, можно их обрабатывать по сигналам прерываний. Если - что-то более "умное" (типа длительного нажатия, двойного щелчка и т.д.) - лучше делайте опрос по тикам таймера. Причин две:
1. кнопок может быть больше, чем линий с прерываниями (как правило, так оно и оказывается)
2. некоторые "особо одаренные" кнопки могут Вам вывалить под сотню прерываний при одном нажатии. Проверено. На собственной шкуре.

 

Fargus, Вас понял. Это само собой разумеется, иначе будет, наоборот, приём дребезга.

Сергей К: В самой программе, когда появлялась возможность, проверял флаг "НАЖАТА КНОПКА".

У меня, похоже, будет всё наоборот, и основное занятие МК - проверка состояния кнопок. По комбинации нажатий будет выставляться определённый код на другом порту.

chav1961: 1. кнопок может быть больше, чем линий с прерываниями...

Да, кнопок больше - матрица 3х4, плюс одна кнопка отдельно. Итого 13 кнопок.
Задействую весь порт В. Линии RB0-RB3 - на вход матрицы кнопок, а RB4-RB6 - на выход матрицы. RB7 - на отдельную кнопку. Таким образом, нажатие на любую кнопку генерирует прерывание.
Кстати, матрицу думаю не кнопочную, а сенсорную, касанием...

В режиме ожидания нажатия, МК работает на частоте 37КГц, при прерывании переключается на 4МГц, быстро отрабатывает нажатие и уходит в ожидание.
Только пока не решил - ожидание делать со "спячкой" или и так сойдёт?.. На частоте 37КГц МК и так будет потреблять копейки.

chav1961: 2. некоторые "особо одаренные" кнопки могут Вам вывалить под сотню прерываний при одном нажатии.

На здоровье...
Зафиксировав перепад уровня аппаратными средствами МК, я, всё равно, раньше, чем через 100мс не "пойду" смотреть кнопку. А после этого, думаю, любая кнопка "успокоится" и либо останется нажатой, либо отпущеной.

Или я чего-то не понимаю?

 

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