Кнопки,Прерывания.
- Войдите на сайт для отправки комментариев
Пт, 26/12/2014 - 00:05
Возможно ли к одному прерыванию подключить несколько кнопок, например 5 штук. И в прерывании определять какая из них была нажата?
Возможно ли к одному прерыванию подключить несколько кнопок, например 5 штук. И в прерывании определять какая из них была нажата?
Можно. Для этого нужно использовать логический элемент ИЛИ, который при упрощении можно свести к кучке диодов. Сигнал с каждой кнопки идет на вывод ардуины и через диод на вывод прерывания. А в прерывании мы проверяем выводы и находим активные.
аналоговую кнопку сделайте. Каждой кнопке на ножке будет соответстоввать свое напряжение. АЦП снимаете уровень. Хватит 1 ножки арудины
аналоговую кнопку сделайте. Каждой кнопке на ножке будет соответстоввать свое напряжение. АЦП снимаете уровень. Хватит 1 ножки арудины
А прерывания куда?
Можно. Для этого нужно использовать логический элемент ИЛИ, который при упрощении можно свести к кучке диодов. Сигнал с каждой кнопки идет на вывод ардуины и через диод на вывод прерывания. А в прерывании мы проверяем выводы и находим активные.
Эту микросхему получится прикрутить?
74HC597
1)Аналоговую клаву делал, только как к прерыванию ее "прикрепить"?
2)
на каждую кнопку по выходу=расточительство
С дребезгом тригером Шмидта можно бороться.
Все равно иногда бывает лишнее нажатие. Что я делаю не так)? Может как-то программно бороться можно?
Это просто пример, по которому я определяю был дребезг или нет.
frielender, можно сделать прерывание по таймеру скажем раз в секунду, и в прерывании опрашивать кнопки. Тогда проблемы дребезга скорее всего не будет. Если с таймерами не очень дружите, то можно взять готовую библу типа timerOne.
Спасибо за ответы, решил проблему с дребезгом. Но появилась другая проблемка...
Программа не выходит из прерывания(Это понятно по светодиоду, который должен менять свое состояние в основной программе)
Я выяснил что это из-за части вывода меню на экран, если выводить что то в Serial, то все работает. В чем может быть проблема? И как мне выводить на экран через прерывание?
Возможно ли к одному прерыванию подключить несколько кнопок, например 5 штук. И в прерывании определять какая из них была нажата?
PCINT
Может как-то программно бороться можно?
Не только можно, а нужно.
И как мне выводить на экран через прерывание?
Получается,если у меня в loop программа выполняется 20 сек, то мне придется ждать эти 20 секунд перед обновлением информации выводимой на экран?
Просто не нужно блокировать основной цикл на 20 секунд.
Да и вообще ну сделали вы вывод на дисплей в фоновом режиме, и что дальше? Вот вы изменили скорость чего то там, ну и когда эти измения вступят в силу, если у вас основной цикл длится 20 секунд?
Через 20 секунд вступят в силу мои изменения. Но ведь не раз в 20 секунд экран обновляться будет. Тогда моджно "целый час " что-то настраивать, перемещаясь по меню. Я вероятно что-то не понимаю, но мне казалось что обновление экрана должно быть в момент нажатия на кнопку, а не после выполнения основного цикла. Иначе экран теряет свою актуальность вообще.
Через 20 секунд вступят в силу мои изменения. Но ведь не раз в 20 секунд экран обновляться будет. Тогда моджно "целый час " что-то настраивать, перемещаясь по меню. Я вероятно что-то не понимаю, но мне казалось что обновление экрана должно быть в момент нажатия на кнопку, а не после выполнения основного цикла. Иначе экран теряет свою актуальность вообще.
А это уже зависит от алгоритма, который вы накодите. Здесь, каждый сам кузнец своего счастья.
Накодил) только не работает вывод на экран через прерывание.
Накодил) только не работает вывод на экран через прерывание.
А вывод на экран через прерывание, это знаете ли моветонс. В прерываниях делаются минимально необходимые операции, а уже обсчет, экран и прочие действия в loop()/
В целом это у вас и сделано, только если loop()20 секунд, то как выведет дисплей?
Ошибся, сделано не у вас, у maksim.
Делать по этому же принципу, только дисплей должен выводить информацию регулярно с минимально допустимым интервалом.
и еще, вы упомянули "меню". Конкретизируйте, на каком этапе для вас становится критичной частота вывода на экран?
Как вообще делается меню на устройстве, мб я координально что то делаю не так?
Сейчас вот так, но если программа в loop() будет длинной, и долгой в исполнении , то общение с экраном будет через большие промежутки времени,что не есть хорошо.
Честно говоря, вы там начали делать жуткие вещи, мало что загнали в цикл, так еще и печатать оттуда пытаетесь. Пример правильного прерывания вам дал maksim, там необходимый минимум.
По уму, вам надо в прерывании определять сработку кнопки, а все остальное вне его.
Да , я могу наделать ужасных вещей) только начал разбираться в этом.
Да вроде нету у меня цикла в прерывании...
Так тоже не правильно?
Для наглядности, по такому принципу организовано перемещение по меню.
А что у вас делает строка 33?
033
int
i=0;
while
(i <70) {i++; }
В целом лучше, но if-ы тоже не есть хорошо.
И еще, вы с кнопками на прерываниях заморочились для тренировки или есть некий сакральный смысл?
*33 строчка, это я нашел на этом форуме, так советовали с дребезгом бороться, но так как у меня уже стоит тригер шмитта, это уже не нужно.
*А как же без ифов определить какая из кнопок нажата?
*И как возможно без прерывания? Если у меня в loop( ) будут выполняться какие-то действия, то нажатия на кнопки контроллер не "увидит".
*33 строчка, это я нашел на этом форуме, так советовали с дребезгом бороться, но так как у меня уже стоит тригер шмитта, это уже не нужно.
*А как же без ифов определить какая из кнопок нажата?
*А как возможно без прерывания? Если у меня в loop( ) будут выполняться какие-то действия, то нажатия на кнопки контроллер не "увидит".
При нормальном loop() кнопки будут определятся без проблем. Прерывания обычно используют для быстротекущих процессов, нажатие кнопки к ним не относится. Не используйте delay(), входите в функции обработки по мере надобности (тайминги) и цикл будет проходить быстро.
Сейчас по вашей логике получается, что при каждом проходе loop() вы запрыгиваете в меню. Зачем? Меню это отдельная функция и должна вызыватся по какому то действию (пара кнопок нажато, длинное нажатие и т.д.). Если кнопки будут использоватся только для меню, то и исходите из этого. loop() отдельно, меню отдельно. Когда работаете с меню, loop() все равно стоит. Многозадачность это конечно круто, но вряд ли реализуемо.