Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
20.03.2013, 10:26
|
|
Почётный гражданин KAZUS.RU
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
|
Re: Опрос кнопки/клавиатуры
Сообщение от Alex9797
|
А на другие надо отреагировать мгновенно (конечно, с учетом интервалов таймера).
|
Если Вы про концевики, оптоограждения, коврики и аварийные кнопки, то и без учёта. Но такие вещи обрубают всё не только на программном, но и на физическом уровне, да и приоритет у них наивысший. Не кнопки это.
|
|
|
|
20.03.2013, 10:44
|
|
Временная регистрация
Регистрация: 17.07.2006
Сообщений: 70
Сказал спасибо: 20
Сказали Спасибо 8 раз(а) в 6 сообщении(ях)
|
Re: Опрос кнопки/клавиатуры
Сообщение от ut1wpr
|
А вообще, мне кажется, что каждый давно отработал подобные процедуры "под себя" и не заморачивается. Потому как разные программные алгоритмы потянут за собой разные подходы к опросу кнопок-датчиков. Не совсем корректно настаивать на каком-то одном варианте. Абсолютной истины не существует.
|
Поддерживаю.
Гораздо эффективнее будет, ув. Frensis777, если Вы опишите свою конкретную задачу и все вместее её разберем. Сколько ситуаций - столько и конкретных решений. А всё универсальное, ИМХО, слишком тормозное и громоздкое, даже если корректно работает.
|
|
|
|
20.03.2013, 11:40
|
|
Прописка
Регистрация: 15.03.2009
Сообщений: 162
Сказал спасибо: 1
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
|
Re: Опрос кнопки/клавиатуры
Сообщение от Easyrider83
|
В прерывании мы только поднимаем флаг. Больше ничего.
|
Так-сс, а можно поподробнее про флаг. И пример приведите, пожалуйста, тов.Easyrider83.
|
|
|
|
20.03.2013, 12:02
|
|
Гуру портала
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 919
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
|
Re: Опрос кнопки/клавиатуры
Сообщение от Frensis777
|
Так-сс, а можно поподробнее про флаг. И пример приведите, пожалуйста, тов.Easyrider83.
|
Это была шутка?
Флаг - любая байтовая переменная с пометкой volatile.
Ноль = флаг снят. Не ноль = установлен.
Если камень 32 бита, переменная типа long.
|
|
|
|
20.03.2013, 12:30
|
|
Почётный гражданин KAZUS.RU
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
|
Re: Опрос кнопки/клавиатуры
Сообщение от Easyrider83
|
Флаг - любая байтовая переменная
|
Оба-на!
битовая...
|
|
|
|
20.03.2013, 12:32
|
|
Почётный гражданин KAZUS.RU
Регистрация: 19.08.2006
Адрес: Львов
Сообщений: 1,616
Сказал спасибо: 65
Сказали Спасибо 315 раз(а) в 264 сообщении(ях)
|
Re: Опрос кнопки/клавиатуры
Сообщение от omercury
|
Оба-на!
битовая...
|
Мой флаг! Какую хочу переменную, такую под него и выделю! И вапче!...
__________________
С уважением,
Vic / ut1wpr
|
|
|
|
20.03.2013, 12:44
|
|
Прописка
Регистрация: 09.08.2007
Адрес: Харьков
Сообщений: 275
Сказал спасибо: 300
Сказали Спасибо 113 раз(а) в 56 сообщении(ях)
|
Re: Опрос кнопки/клавиатуры
Сообщение от Easyrider83
|
Это была шутка?
Флаг - любая байтовая переменная с пометкой volatile.
Ноль = флаг снят. Не ноль = установлен.
Если камень 32 бита, переменная типа long.
|
Эдак можно столько байт под флаги нарубить... куда экономичнее будет юзать отдельные биты для флага (на то он и флаг - емеет два состояния 0 и 1)
|
|
|
|
20.03.2013, 12:45
|
|
Прописка
Регистрация: 15.03.2009
Сообщений: 162
Сказал спасибо: 1
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
|
Re: Опрос кнопки/клавиатуры
Сообщение от Easyrider83
|
Это была шутка?
Флаг - любая байтовая переменная с пометкой volatile.
Ноль = флаг снят. Не ноль = установлен.
Если камень 32 бита, переменная типа long.
|
Ну понятно, ясно. Теперь два момента:
1) Что такое метка Volatile, где она ставится, или где можно о ней прочитать?
2) Интересует, де-факто, по умолчанию мировой сложившийся стандарт на опрос клавиатуры. Что это за документ, МЭК и т.д., где можно почитать? А именно интересует через какое время должна быть опрошена клавиатура из N клавиш с одинаковым приоритетом, если делать опрос по прерыванию от таймера/счетчика?
|
|
|
|
20.03.2013, 12:55
|
|
Гуру портала
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 919
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
|
Re: Опрос кнопки/клавиатуры
Сообщение от omercury
|
Оба-на!
битовая...
|
Именно байтовая. Ибо на проверку установки бита уходит еще несколько циклов. К битам стоит прибегать, если пытаетесь впихнуть невпихуемое. Тут да, жесткая экономия на всех этапах.
Сообщение от Frensis777
|
Ну понятно, ясно. Теперь два момента:
1) Что такое метка Volatile, где она ставится, или где можно о ней прочитать?
|
Ответ легко гуглится. Скажем так - переменная, используемая в теле программы и в прерывании должна быть помечена, как volatile.
Сообщение от Frensis777
|
2) Интересует, де-факто, по умолчанию мировой сложившийся стандарт на опрос клавиатуры. Что это за документ, МЭК и т.д., где можно почитать? А именно интересует через какое время должна быть опрошена клавиатура из N клавиш с одинаковым приоритетом, если делать опрос по прерыванию от таймера/счетчика?
|
Да, мировой стандарт от 1966 года ISO 18290 или ГОСТ 20081983 от 1971 года.
зы шютка
|
|
|
|
20.03.2013, 12:56
|
|
Почётный гражданин KAZUS.RU
Регистрация: 10.01.2007
Сообщений: 3,412
Сказал спасибо: 65
Сказали Спасибо 664 раз(а) в 443 сообщении(ях)
|
Re: Опрос кнопки/клавиатуры
Сообщение от ut1wpr
|
Для работы с кнопками ... Использую прерывания в 1 мсек.
Для каждой кнопки создаю 8 бит переменную-накопитель, счетчик антидребезга.
Код:
|
#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-els'у с одним инкрементом - тоже.
Как известно, человек - самое медленное периферийное устройство, поэтому, нажатие кнопок, в масштабе времени м/к, можно рассматривать как одну ситуацию для всех кнопок. При таком подходе можно:
- всю коллекцию кнопок упрятать в одну переменную,
- отрабатывать антидребезг одним счетчиком,
- проверять окончание дребезга одним на все кнопки набором операторов if-else.
Код:
|
/********** Keyboard data */
#define READKEYB_ ((~PINx) & _KEYS_MASK_)
#define DEBOUNCE_MIN 5
enum {ksReady=0, ksInProc} eKeyState;
unsigned char ucDebounceCounter,
ucOldKeys = 0, ucNewKeys,
/********** Common data */
unsigned char ucAppFlags;
void pin_change_isr(void) // keyboard ISR
{
ucNewKeys = READKEYB;
if (ksReady == eKeyState){
ucOldKeys = ucNewKeys;
eKeyState = ksInProc;
}
}
void timer0_ovf_isr(void) // timer ISR
{
unsigned char i;
if (ksInProc == eKeyState){
ucNewKeys = READKEYB;
if (ucNewKeys == ucOldKeys){// if KBRD's stable - inc bebounce timeout
if (++ucDebounceCounter ›= DEBOUNCE_MIN){
ucAppFlags |= AF_KEYB;
eKeyState = ksReady;
ucDebounceCounter = 0;
}
}
}
void DoKeyPressed(unsigned char ucKeys)
{
switch (ucKeys){
case _KEY1_:
break;
...
}
}
void main(void)
{
...
while ( true )
{
...
if ( ucAppFlags & AF_KEYB )
{
ucAppFlags &= ~(AF_KEYB);
DoKeyPressed(ucOldKeys);
}
...
}
} |
Разумеется, факт нажатия кнопки можно обнаруживать и по таймеру, здесь просто вариант с прерыванием PIN_CHANGE от кнопок.
Возможно пригодится, как вариант.
__________________
There's always more than one way to skin a cat.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 03:42.
|
|