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

Индикация нажатой кнопки

1 3 5

Digital: У меня прерывание по переполнению уже используется, не хотелось бы его еще больше затягивать.
Десяток лишних микросекунд, думаю, не затянет.
А кнопки всегда оптимальнее обрабатывать в прерывании по таймеру. Именно так и освобождается время. В противном случае, в главной функции придется делать циклы опроса кнопок, главную программу встраивать в эти циклы (бр-р-р), искусственные задержки на обработку антидребезга и пр.

 

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

ЗЫ я когда начинал осваивать МК только, тоже старался в него все запихнуть) потом почему то стал отказываться от этого, не знаю почему. Стал внешние дешифраторы и пр. хрень вешать...

 

Digital: на протеус у меня антивирь ругается
Не только у вас он ругается. У всех так. Хоть и глючный этот протеус и нервы портит постоянно, но альтернативы ему по наглядности симуляции пока нет.

 

А что, прерывания от изменения состояния на ногах не подходят? Pin_Change кажется называется. Может не у всех есть, но на мегах точно должно быть. На ATMega48 есть, я его регулярно использую. И решение простое - вешаем с плюса светодиоды через резисторы на ноги, сконфигурированные как вход, но с нулем на выход. Исходное состояние - 1 с плюса через светодиоды. При нажатии кнопки на минус с этих же ног обрабатываем прерывание на ногах, переводим ногу на выход, 0 там уже есть, светодиод продолжает гореть. Никакого дребезга быть не может, нога уже в нуле, кнопкой ниже не опустим. При нажатии на другую кнопку обрабатываем прерывание, старую ногу - на вход (можно сразу все старые ноги), новую - на выход, и там опять 0. Новый светодиод горит, старый погас.

 

Krug: Никакого дребезга быть не может, нога уже в нуле
Может тут вы и правы, дребезг кнопки тут не приведет к повторному срабатыванию. Но тут есть одно НО. "Антидребезг" защищает не только от дребезга, но и от срабатывания по наводке, коротким случайным иголкам и пр. У меня есть печальный опыт. Когда-то давно, когда еще и МК то не было, классикой антидребезговой схемы была схема на RS триггере с двумя кнопками на R и S входах. Сделал такую схему для включения - выключения питания, причем заложил в серию. Дык потом сильно жалел. Помехоустойчивость была очень плохая. Ус-во было в пластмассовом корпусе. Достаточно было просто взять его в руку и коснуться регулировочных металлических ручек, как нет-нет, да и происходило самопроизвольное включение - выключение. Не помогали даже блокировочные конденсаторы, которые я впоследствии пытался навесить на кнопки.
Дык вот... прерывания по изменению состояния портов, на которые навешаны кнопки, и мгновенное принятие решения о нажатой кнопке думается мне, из той же оперы, что и кнопки на RS входах триггера.

 

Digital

Работай со светодиодами в динамическом режиме, сважность 1/8 ( работает и 1/18 нормально) .
Кнопки через диоды замыкать на отдельный вывод а не + или землю.
Этот вывод опрашивать . Выдаем строб засветки на вывод - и опрашивать вход....

 

Zandy: Дык вот... прерывания по изменению состояния портов, на которые навешаны кнопки, и мгновенное принятие решения о нажатой кнопке думается мне, из той же оперы, что и кнопки на RS входах триггера.

Для более ответственных задач я вешаю кондер на ногу и плюсом в обработке прерывания отслеживаю, что состояние ноги остается неизменным в течение какого-то разумного времени (напр. 10-20 мс для частоты сети). После этого считается, что нога нажата.

 

Krug: А что, прерывания от изменения состояния на ногах не подходят? Pin_Change кажется называется. Посмотрел ДШ на мегу16 - стр.45 Interrupts. Не нашел указания на присутствие такой возможности.

 

dosikus: Работай со светодиодами в динамическом режиме... Это пока заморочно для меня. Увы, не дорос ещё. Осваиваю операции попроще сначала.

 

Ещё хотел спросить, почему нижеприведенный код может не работать, ну вернее он работает, но только в порядке убывания (кнопка 3-кнопка 2-кнопка 1). И всё, 1-2-3, например, и в любом другом порядке уже не работает, где тут ошибка, не могу понять, вроде всё просто и должно работать? Так вот сначала и хотел сделать (ну кроме размещения в функции прерывания).

void main(void)
{
oldkey=PINB;
while(1)
{
newkey=PINB;
if(newkey!=oldkey)
{
oldkey=newkey;
if((newkey&0x02)==0) {DDRB=0x02;PORTB=0b11111101;}
else
if((newkey&0x04)==0) {DDRB=0x04;PORTB=0b11111011;}
else
if((newkey&0x08)==0) {DDRB=0x08;PORTB=0b11110111;}
}
}
}