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

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

1 35 64

Да ничего там сложного, если прерывания только кнопками и занимаются, то так даже проще, чем через таймер.

 

chav1961, так мне казалось, что используя прерывания по изменению уровня я, наоборот, упрощу её за счёт исключения программы опроса клавиатуры.

МК либо "спит", либо занимается чем-то полезным, а по прерыванию, возникшему при нажатии кнопки, просто читает состояние порта. Останется только посмотреть принятый байт для определения, какая именно кнопка (или комбинация оных) была нажата.

P.S.
Ну вот, и Vladikas говорит, что так проще...

 

DWD: Ну вот, и Vladikas говорит
Тоже мне авторитет

Если МК всё время спит, то зачем он в полудрёме на килогерцах? Ведь он может спать глухо и будиться от того же прерывания (если я ничего не путаю, давно этим не занимался...).

 

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

 

Vladikas: Если МК всё время спит, то зачем он в полудрёме на килогерцах?

Это я, просто, ещё не определился - дать МК заснуть или заставить его выполнять какую-то "не пыльную" работу.

chav1961: ...если работа с кнопками подразумевает нечто большее, чем просто клик, с прерываниями лучше не связываться.

А можете привести конкретный пример этих "граблей" - как Вы на них "наступили"? На что расчитывали и что получили?

 

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

 

Можно так, мк спит, нажата кнопка, мк проснулся, зашел в прерывание, прерывания запретились, выполняется работа, работа закончена, таймер (если время работы маленькое), разрешены прерывания, мк заснул.

 

Можно. А зачем? То же самое - опросили клавиатуру, обнаружили изменившиеся клавиши, обработали. Если для экономии питания - может быть, стоит, а в остальных-то случаях?
PS. Кстати говоря, речь в первоначальном вопросе шла о матрице клавиш. Для того, чтобы матрица работала, на нее надо время от времени подавать сигнал опроса строк (или столбцов)

 

Не обязательно, для режима прерывания по изменению уровня.
Все входы будут подтянуты (ещё не решил, к чему), по этому изменение уровня на любом входе разбудит МК.

 

chav1961: речь в первоначальном вопросе шла о матрице клавиш.

Вот пример с исходником для матрицы клавишь 4x4 keypad . Есть пример и в PROTEUS.

151889.rar