Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
19.03.2013, 22:16
|
|
Прописка
Регистрация: 15.03.2009
Сообщений: 162
Сказал спасибо: 1
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
|
Опрос кнопки/клавиатуры
Вопрос к знатокам форума. Какой подход наиболее грамотен с точки зрения теории при опросе кнопки/клавиатуры? Делать опрос без каких либо задержек в теле бесконечного цикла while() основной программы main(), или же выполнять проверку кнопки/клавиатуры по прерыванию от таймера, переполняющегося с заданной частотой?
|
|
|
|
19.03.2013, 22:23
|
|
Гуру портала
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 919
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
|
Re: Опрос кнопки/клавиатуры
Правильно так - в прерывании таймера поднять флаг необходимости обработки данных с кнопок, и в теле main, опросив этот флаг, проверить не нажата ли кнопка, сравнив с предыдущим состоянием.
|
|
|
|
19.03.2013, 23:07
|
|
Прописка
Регистрация: 09.08.2007
Адрес: Харьков
Сообщений: 275
Сказал спасибо: 300
Сказали Спасибо 113 раз(а) в 56 сообщении(ях)
|
Re: Опрос кнопки/клавиатуры
Сообщение от Easyrider83
|
Правильно так - в прерывании таймера поднять флаг необходимости обработки данных с кнопок, и в теле main, опросив этот флаг, проверить не нажата ли кнопка, сравнив с предыдущим состоянием.
|
Ну и чем это отличается от обработки в прерывании от таймера? Как можно узнать необходимость (если не учитывать что в данный момент прога сильно занята и не будет реагировать)?
ЗЫ Мое имхо - по прерыванию (если кнопок мало, то забить на кнопки и проверить только тогда, когда сработает внешнее прерывание. Хотя и для большого количества кнопок можно придумать схемотехническое решение, тем самым усложнив конструкцию).
|
|
|
|
19.03.2013, 23:54
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.02.2008
Адрес: Днепр. Украина
Сообщений: 3,294
Сказал спасибо: 442
Сказали Спасибо 1,048 раз(а) в 706 сообщении(ях)
|
Re: Опрос кнопки/клавиатуры
Цитата:
|
Ну и чем это отличается от обработки в прерывании от таймера?
|
В первую очередь тем, что реакция на нажатую кнопку может требовать выполнения ресурсоемких операций, например при выборе пункта меню сохранения настроек в энергонезависимой памяти, реакция на нажатие до 100мС. Кроме того стек возвратов не безразмерный и его тоже нужно экономить. Чем меньше работ выполняется в теле прерывания - тем лучше.
__________________
misterdi<@>i.ua
Последний раз редактировалось MisterDi; 19.03.2013 в 23:56.
|
|
|
|
20.03.2013, 00:37
|
|
Прописка
Регистрация: 15.03.2009
Сообщений: 162
Сказал спасибо: 1
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
|
Re: Опрос кнопки/клавиатуры
Сообщение от Easyrider83
|
Правильно так - в прерывании таймера поднять флаг необходимости обработки данных с кнопок, и в теле main, опросив этот флаг, проверить не нажата ли кнопка, сравнив с предыдущим состоянием.
|
Т.е., правильно ли я Вас понял, тов.Easyrider83, в обработчике прерывания по таймеру производится опрос клавиатуры с целью узнать, какая клавиша нажата, и код нажатой клавиши заносится в переменную. А в теле цикла основной программы производится считывание этой переменной и, в зависимости, от кода нажатой клавиши, уже выполнять все действия, предусмотренные при нажатии этой клавиши, дабы максимально "разгрузить" обработку прерывания? И нужно ли на время обработки прерывания по таймеру запрещать все остальные прерывания?
А зачем городить огород с таймерами/прерываниями? Нельзя ли в самой основной программе производить непосредственный опрос клавиатуры?
|
|
|
|
20.03.2013, 00:43
|
|
Гуру портала
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 919
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
|
Re: Опрос кнопки/клавиатуры
Сообщение от Frensis777
|
Т.е., правильно ли я Вас понял, тов.Easyrider83, в обработчике прерывания по таймеру производится опрос клавиатуры
|
Совершенно не правильно. В прерывании мы только поднимаем флаг. Больше ничего. Все остальное происходит в теле программы.
Сообщение от Frensis777
|
А зачем городить огород с таймерами/прерываниями? Нельзя ли в самой основной программе производить непосредственный опрос клавиатуры?
|
Если у вас стоит задача опрашивать кнопку с частотой 10Гц, как вы это реализуете без таймера?
|
|
|
|
20.03.2013, 01:52
|
|
Почётный гражданин KAZUS.RU
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
|
Re: Опрос кнопки/клавиатуры
Easyrider83, а может разрешить им опрашивать кнопки прямо в прерывании?
Ведь шишки на собственном лбу действуют более эффективно, нежели на чужом...
...или фильтровать дребезг конденсаторами...
К тому же можно запускать таймаут, скажем, по PCINT, что на первый взгляд выглядит вполне уместно.
Хотя тратить ценное прерывание на всякую ерунду вроде кнопок безусловно глупо.
|
|
|
|
20.03.2013, 04:10
|
|
Почётный гражданин KAZUS.RU
Регистрация: 20.08.2010
Адрес: Днепр
Сообщений: 8,565
Сказал спасибо: 5,041
Сказали Спасибо 10,615 раз(а) в 3,604 сообщении(ях)
|
Re: Опрос кнопки/клавиатуры
Сообщение от omercury
|
Хотя тратить ценное прерывание на всякую ерунду вроде кнопок безусловно глупо.
|
Не так уж и глупо. У разных кнопок могут быть разные уровни приоритетов. Одни могут и подождать, когда основная программа соизволит обнаружить взведенный флаг, и обработать кнопки. А на другие надо отреагировать мгновенно (конечно, с учетом интервалов таймера).
Кроме того, иногда намного проще отреагировать на нажатие кнопки прямо в прерывании таймера, если это не занимает много времени, чем включать в каждый цикл ожидания некоторого события еще и опрос флага нажатия кнопки. Бывают программы, в которых таких циклов полно.
|
|
|
|
20.03.2013, 08:28
|
|
Почётный гражданин KAZUS.RU
Регистрация: 10.12.2007
Адрес: Екатеринбург
Сообщений: 2,731
Сказал спасибо: 2,439
Сказали Спасибо 893 раз(а) в 580 сообщении(ях)
|
Re: Опрос кнопки/клавиатуры
Можно в теле прерывания проверять нажата ли кнопка.Если нажата,тогда устанавливать флаг для обработки прерывания в main. Компромисс.
|
|
|
|
20.03.2013, 10:24
|
|
Почётный гражданин KAZUS.RU
Регистрация: 19.08.2006
Адрес: Львов
Сообщений: 1,616
Сказал спасибо: 65
Сказали Спасибо 315 раз(а) в 264 сообщении(ях)
|
Re: Опрос кнопки/клавиатуры
Сообщение от baiderin
|
Можно в теле прерывания проверять нажата ли кнопка.Если нажата,тогда устанавливать флаг для обработки прерывания в main. Компромисс.
|
Для работы с кнопками (не с переключателями) давно ипользую простой и надежный алгоритм.
Использую прерывания в 1 мсек.
Для каждой кнопки создаю 8 бит переменную-накопитель, счетчик антидребезга. Обязательно volatile. Тест кнопки - стадартный для данного МК макрос. Сами знаете как.
В обработчике прерывания приблизительно так:
Код:
|
#define delay_time 25
..................
if( BTN1_ON ) cnt1 = 0; else if( cnt1 ‹ delay_time ) cnt1++;
if( BTN2_ON ) cnt2 = 0; else if( cnt2 ‹ delay_time ) cnt2++;
if( BTN3_ON ) cnt3 = 0; else if( cnt3 ‹ delay_time ) cnt3++; |
Отдельно создаю функцию опроса счетчиков. К этой функции и обращаюсь из основной программы, когда нужно получить состояние кнопок.
В этой функции:
Код:
|
if( cnt1 == delay_time ){ cnt1 = 255; return 1;}
if( cnt2 == delay_time ){ cnt2 = 255; return 2;}
if( cnt3 == delay_time ){ cnt3 = 255; return 3;}
..........
return 0; |
Функция возвращает номер нажатой кнопки или 0, если ни одна не нажата. Есть защита от повтора
Недостаток: в явном виде не отслеживаются одновременно нажатые кнопки.
По большому счету, обращение к volatile потребует помещение части кода в критическую секцию, но в простых задачах этим можно пренебречь.
Модифицируя функцию, можно и сдвоенные отслеживать и переключатели. Код слегка усложнится.
А вообще, мне кажется, что каждый давно отработал подобные процедуры "под себя" и не заморачивается. Потому как разные программные алгоритмы потянут за собой разные подходы к опросу кнопок-датчиков. Не совсем корректно настаивать на каком-то одном варианте. Абсолютной истины не существует.
__________________
С уважением,
Vic / ut1wpr
Последний раз редактировалось ut1wpr; 20.03.2013 в 10:26.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 00:11.
|
|