Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту

Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей...

 
Опции темы
Непрочитано 19.03.2013, 22:16  
Frensis777
Прописка
 
Аватар для Frensis777
 
Регистрация: 15.03.2009
Сообщений: 162
Сказал спасибо: 1
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
Frensis777 на пути к лучшему
По умолчанию Опрос кнопки/клавиатуры

Вопрос к знатокам форума. Какой подход наиболее грамотен с точки зрения теории при опросе кнопки/клавиатуры? Делать опрос без каких либо задержек в теле бесконечного цикла while() основной программы main(), или же выполнять проверку кнопки/клавиатуры по прерыванию от таймера, переполняющегося с заданной частотой?
Реклама:
Frensis777 вне форума  
Непрочитано 19.03.2013, 22:23  
Easyrider83
Гуру портала
 
Аватар для Easyrider83
 
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 919
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
Easyrider83 на пути к лучшему
По умолчанию Re: Опрос кнопки/клавиатуры

Правильно так - в прерывании таймера поднять флаг необходимости обработки данных с кнопок, и в теле main, опросив этот флаг, проверить не нажата ли кнопка, сравнив с предыдущим состоянием.
Easyrider83 вне форума  
Непрочитано 19.03.2013, 23:07  
metrA85
Прописка
 
Аватар для metrA85
 
Регистрация: 09.08.2007
Адрес: Харьков
Сообщений: 275
Сказал спасибо: 300
Сказали Спасибо 113 раз(а) в 56 сообщении(ях)
metrA85 на пути к лучшему
По умолчанию Re: Опрос кнопки/клавиатуры

Сообщение от Easyrider83 Посмотреть сообщение
Правильно так - в прерывании таймера поднять флаг необходимости обработки данных с кнопок, и в теле main, опросив этот флаг, проверить не нажата ли кнопка, сравнив с предыдущим состоянием.
Ну и чем это отличается от обработки в прерывании от таймера? Как можно узнать необходимость (если не учитывать что в данный момент прога сильно занята и не будет реагировать)?

ЗЫ Мое имхо - по прерыванию (если кнопок мало, то забить на кнопки и проверить только тогда, когда сработает внешнее прерывание. Хотя и для большого количества кнопок можно придумать схемотехническое решение, тем самым усложнив конструкцию).
metrA85 вне форума  
Непрочитано 19.03.2013, 23:54  
MisterDi
Почётный гражданин KAZUS.RU
 
Аватар для MisterDi
 
Регистрация: 13.02.2008
Адрес: Днепр. Украина
Сообщений: 3,294
Сказал спасибо: 442
Сказали Спасибо 1,048 раз(а) в 706 сообщении(ях)
MisterDi на пути к лучшему
По умолчанию Re: Опрос кнопки/клавиатуры

Цитата:
Ну и чем это отличается от обработки в прерывании от таймера?
В первую очередь тем, что реакция на нажатую кнопку может требовать выполнения ресурсоемких операций, например при выборе пункта меню сохранения настроек в энергонезависимой памяти, реакция на нажатие до 100мС. Кроме того стек возвратов не безразмерный и его тоже нужно экономить. Чем меньше работ выполняется в теле прерывания - тем лучше.
__________________
misterdi<@>i.ua

Последний раз редактировалось MisterDi; 19.03.2013 в 23:56.
MisterDi вне форума  
Непрочитано 20.03.2013, 00:37  
Frensis777
Прописка
 
Аватар для Frensis777
 
Регистрация: 15.03.2009
Сообщений: 162
Сказал спасибо: 1
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
Frensis777 на пути к лучшему
По умолчанию Re: Опрос кнопки/клавиатуры

Сообщение от Easyrider83 Посмотреть сообщение
Правильно так - в прерывании таймера поднять флаг необходимости обработки данных с кнопок, и в теле main, опросив этот флаг, проверить не нажата ли кнопка, сравнив с предыдущим состоянием.
Т.е., правильно ли я Вас понял, тов.Easyrider83, в обработчике прерывания по таймеру производится опрос клавиатуры с целью узнать, какая клавиша нажата, и код нажатой клавиши заносится в переменную. А в теле цикла основной программы производится считывание этой переменной и, в зависимости, от кода нажатой клавиши, уже выполнять все действия, предусмотренные при нажатии этой клавиши, дабы максимально "разгрузить" обработку прерывания? И нужно ли на время обработки прерывания по таймеру запрещать все остальные прерывания?
А зачем городить огород с таймерами/прерываниями? Нельзя ли в самой основной программе производить непосредственный опрос клавиатуры?
Frensis777 вне форума  
Непрочитано 20.03.2013, 00:43  
Easyrider83
Гуру портала
 
Аватар для Easyrider83
 
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 919
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
Easyrider83 на пути к лучшему
По умолчанию Re: Опрос кнопки/клавиатуры

Сообщение от Frensis777 Посмотреть сообщение
Т.е., правильно ли я Вас понял, тов.Easyrider83, в обработчике прерывания по таймеру производится опрос клавиатуры
Совершенно не правильно. В прерывании мы только поднимаем флаг. Больше ничего. Все остальное происходит в теле программы.
Сообщение от Frensis777 Посмотреть сообщение
А зачем городить огород с таймерами/прерываниями? Нельзя ли в самой основной программе производить непосредственный опрос клавиатуры?
Если у вас стоит задача опрашивать кнопку с частотой 10Гц, как вы это реализуете без таймера?
Easyrider83 вне форума  
Непрочитано 20.03.2013, 01:52  
omercury
Почётный гражданин KAZUS.RU
 
Аватар для omercury
 
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
omercury на пути к лучшему
По умолчанию Re: Опрос кнопки/клавиатуры

Easyrider83, а может разрешить им опрашивать кнопки прямо в прерывании?
Ведь шишки на собственном лбу действуют более эффективно, нежели на чужом...

...или фильтровать дребезг конденсаторами...

К тому же можно запускать таймаут, скажем, по PCINT, что на первый взгляд выглядит вполне уместно.
Хотя тратить ценное прерывание на всякую ерунду вроде кнопок безусловно глупо.
omercury вне форума  
Непрочитано 20.03.2013, 04:10  
Alex9797
Почётный гражданин KAZUS.RU
 
Аватар для Alex9797
 
Регистрация: 20.08.2010
Адрес: Днепр
Сообщений: 8,565
Сказал спасибо: 5,041
Сказали Спасибо 10,615 раз(а) в 3,604 сообщении(ях)
Alex9797 на пути к лучшему
По умолчанию Re: Опрос кнопки/клавиатуры

Сообщение от omercury Посмотреть сообщение
Хотя тратить ценное прерывание на всякую ерунду вроде кнопок безусловно глупо.
Не так уж и глупо. У разных кнопок могут быть разные уровни приоритетов. Одни могут и подождать, когда основная программа соизволит обнаружить взведенный флаг, и обработать кнопки. А на другие надо отреагировать мгновенно (конечно, с учетом интервалов таймера).

Кроме того, иногда намного проще отреагировать на нажатие кнопки прямо в прерывании таймера, если это не занимает много времени, чем включать в каждый цикл ожидания некоторого события еще и опрос флага нажатия кнопки. Бывают программы, в которых таких циклов полно.
Alex9797 вне форума  
Непрочитано 20.03.2013, 08:28  
baiderin
Почётный гражданин KAZUS.RU
 
Аватар для baiderin
 
Регистрация: 10.12.2007
Адрес: Екатеринбург
Сообщений: 2,727
Сказал спасибо: 2,428
Сказали Спасибо 893 раз(а) в 580 сообщении(ях)
baiderin на пути к лучшему
По умолчанию Re: Опрос кнопки/клавиатуры

Можно в теле прерывания проверять нажата ли кнопка.Если нажата,тогда устанавливать флаг для обработки прерывания в main. Компромисс.
baiderin вне форума  
Непрочитано 20.03.2013, 10:24  
ut1wpr
Почётный гражданин KAZUS.RU
 
Аватар для ut1wpr
 
Регистрация: 19.08.2006
Адрес: Львов
Сообщений: 1,616
Сказал спасибо: 65
Сказали Спасибо 315 раз(а) в 264 сообщении(ях)
ut1wpr на пути к лучшему
По умолчанию 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.
ut1wpr вне форума  
 

Закладки
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Опрос кнопки на atmega 16 2517212 Микроконтроллеры, АЦП, память и т.д 10 31.03.2012 10:22
Опрос клавиатуры ra0wbj Микроконтроллеры, АЦП, память и т.д 3 13.10.2011 21:40
Опрос матричной клавиатурки serb-radio Электроника - это просто 2 31.07.2009 16:32
Опрос удалённых датчиков. picavr Микроконтроллеры, АЦП, память и т.д 6 20.03.2009 01:09
Опрос кнопки Electric111 Микроконтроллеры, АЦП, память и т.д 15 18.12.2007 22:48


Часовой пояс GMT +4, время: 19:10.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot