Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
21.03.2013, 11:04
|
|
Почётный гражданин KAZUS.RU
Регистрация: 08.10.2007
Сообщений: 2,760
Сказал спасибо: 1,105
Сказали Спасибо 1,037 раз(а) в 569 сообщении(ях)
|
Re: Опрос кнопки/клавиатуры
Сообщение от whoim
|
расскажите, как работаете со счетчиком в полубайте?
|
Счётчик в старших 5 битах. Счётчик++ это байт+8, очень просто.
Сообщение от Yurkin2007
|
А зачем эти флаги нужны?
|
Эти флаги нужны, чтобы опрашивать состояние кнопки в любом месте программы. Флаг ON соответствует состоянию (status) кнопки. Флаги UP и DOWN - события (event), обычно анализируются сразу после опроса кнопки.
Стандартно так:
__считываем состояние порта с кнопками (pin) в регистр, ну пусть его звать Р1
__ вызываем описанный мной анализатор состояния с аргументами: адрес байта (Y) и битовая маска с одной единичкой в бите, где кнопка. Это пусть регистр М1. Возвращается Y+1, М1=обновлённые счётчик кнопки+флаги, Р1 не изменяется.
__Анализируем флаги (Y и Р1 не трогаем)
Байты кнопок расположены последовательно, поэтому для следующей кнопки задаём её маску и вызываем анализатор, Y уже указывает на её байт, Р1 помнит её состояние.
Такой участок алгоритма для кнопок.
Последний раз редактировалось makakus; 21.03.2013 в 11:08.
|
|
|
Сказали "Спасибо" makakus
|
|
|
21.03.2013, 12:31
|
|
Почётный гражданин KAZUS.RU
Регистрация: 26.11.2011
Адрес: Анапа
Сообщений: 1,620
Сказал спасибо: 284
Сказали Спасибо 129 раз(а) в 111 сообщении(ях)
|
Re: Опрос кнопки/клавиатуры
Сообщение от makakus
|
Счётчик в старших 5 битах
|
00011111 - максимум?
Сообщение от makakus
|
Счётчик++ это байт+8
|
uint8_t cnt = cnt + 8; ?
минус -- так же?
как проще "вытащить" значение, для проверки скажем?
спасибо!
Последний раз редактировалось whoim; 21.03.2013 в 12:34.
|
|
|
|
21.03.2013, 12:35
|
|
Гуру портала
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 919
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
|
Re: Опрос кнопки/клавиатуры
Кстати, на всех демобордах, что я видел, любая кнопка всегда подключена через интегральную цепочку. В общем, лишний конденсатор погоды не сделает, но сколько нервов спасет разработчику. Так что лично я этим способом тоже не брезгую. Там только при переходе через половину питания дребезг может возникнуть. Но этот дребезг совершенно точно определен по длительности постоянной времени. Поэтому и фильтровать его программно на много проще.
|
|
|
|
21.03.2013, 13:26
|
|
Почётный гражданин KAZUS.RU
Регистрация: 08.10.2007
Сообщений: 2,760
Сказал спасибо: 1,105
Сказали Спасибо 1,037 раз(а) в 569 сообщении(ях)
|
Re: Опрос кнопки/клавиатуры
Сообщение от whoim
|
00011111 - максимум?
|
В СТАРШИХ битах, максимум это 11111000. Сделано, чтобы не париться с переполнениями: 00000000-00001000 = 11111000, 11111000+1000 = 00000000. Хотя переполнений там быть не должно, счётчик работает "с упорами".
Думаете, 5 разрядов мало? Нет, результат будет минимум через 160 мс после нажатия если опрос через 10 мс - это нормально или даже многовато, если взять микрик и с бешеной скоростью его щёлкать, то программа не всегда успевает. Делал опрос через 20 мс, когда нужна была "тупая" кнопка для запуска большого мотора. Там так и надо: нажал, держишь - мотор начал раскручиваться. Получается, пока не увидишь реакцию мотора, держишь кнопку, секунду наверное . А если быстренько ткнул, он не обращает внимания. Солидный, уважения требует
Сообщение от whoim
|
как проще "вытащить" значение, для проверки скажем?
|
Что значит "вытащить"? Значение счётчика вам не нужно, это, как говорят в ООП, приватный член класса. Флаг вытащить? #define BON 1; if(cnt & BON) {}, не?
|
|
|
|
21.03.2013, 14:16
|
|
Почётный гражданин KAZUS.RU
Регистрация: 08.06.2008
Сообщений: 1,394
Сказал спасибо: 4
Сказали Спасибо 183 раз(а) в 167 сообщении(ях)
|
Re: Опрос кнопки/клавиатуры
Обычно с кнопками поступаю примерно так;
PHP код:
|
#define Td 16 // время дребезга
#define Tp 128 // время непрерывного нажатия до повтора
#define Tr 64 // время между автоповтором
unsigned char kb;
// == вызывается раз в 10 мс
// == sos - состояение битика кнопки
char GetKB( unsigned char *k, char sos)
{
if( sos == 0 )
{
*k = 0;
return 0;
}
*k++;
if( *k == Td ) return 1; // время выдержки кнопки в 1 без дребезга;
if( *k == Tp ) // срабатываниу кнопки
{
*k = ( tp - Tr) ; // автоповтор
return 1;
}
return 0;
}
|
А в остальном "вариации на заданную тему", зависящие конкретно от задачи, количества и функций кнопок.
|
|
|
|
21.03.2013, 15:18
|
|
Почётный гражданин KAZUS.RU
Регистрация: 26.11.2011
Адрес: Анапа
Сообщений: 1,620
Сказал спасибо: 284
Сказали Спасибо 129 раз(а) в 111 сообщении(ях)
|
Re: Опрос кнопки/клавиатуры
Сообщение от makakus
|
В СТАРШИХ битах
|
тьфу, считал что старшие - это от 0 и выше) А нумерация принята вроде как справа-налево
Сообщение от makakus
|
не?
|
да я не для проверки кнопок, хочется для других целей засунуть в один байт и счетчик и флаги))
Передавать в байте с компа на МК а там читать
|
|
|
|
21.03.2013, 15:21
|
|
Почётный гражданин KAZUS.RU
Регистрация: 26.11.2011
Адрес: Анапа
Сообщений: 1,620
Сказал спасибо: 284
Сказали Спасибо 129 раз(а) в 111 сообщении(ях)
|
Re: Опрос кнопки/клавиатуры
по кнопка - делал так, вродь работает
Код:
|
//опрашиваем кнопки
if(!(PINB&(1‹‹BUT_MODE))) { //BUT_MODE
last_press_time = millis;
while(!(PINB&(1‹‹BUT_MODE))) pause(1);
//определим долгое нажатие
if ((millis - last_press_time) › KEYPRESS_DELAY_SETUP) { //больше пяти секунд
.....
}
else { //если короткое нажатие
....
}
} //BUT_MODE |
|
|
|
|
21.03.2013, 15:36
|
|
Почётный гражданин KAZUS.RU
Регистрация: 08.10.2007
Сообщений: 2,760
Сказал спасибо: 1,105
Сказали Спасибо 1,037 раз(а) в 569 сообщении(ях)
|
Re: Опрос кнопки/клавиатуры
Сообщение от whoim
|
для других целей засунуть в один байт и счетчик и флаги))
|
Я не против... вроде показал уже, как счётчик работает мимо флагов.
|
|
|
|
21.03.2013, 21:57
|
|
Почётный гражданин KAZUS.RU
Регистрация: 26.11.2011
Адрес: Анапа
Сообщений: 1,620
Сказал спасибо: 284
Сказали Спасибо 129 раз(а) в 111 сообщении(ях)
|
Re: Опрос кнопки/клавиатуры
makakus, непонятно как сравнить его значение с десятичным представлением, например
|
|
|
|
21.03.2013, 22:23
|
|
Почётный гражданин KAZUS.RU
Регистрация: 10.01.2007
Сообщений: 3,412
Сказал спасибо: 65
Сказали Спасибо 664 раз(а) в 443 сообщении(ях)
|
Re: Опрос кнопки/клавиатуры
Сообщение от whoim
|
как сравнить его значение
|
Ну как - сдвинуть его на место, на котором он был бы, если бы не было флагов:
Код:
|
if ( (counter››3) › 16 )
printf("Дождались!\r"); |
![Рот до ушей](images/smilies/icon_doushei.gif)
Хотя, быстрее так:
Код:
|
if ( counter&0xF8 › 16‹‹3 )
printf("Дождались!\r"); |
__________________
There's always more than one way to skin a cat.
Последний раз редактировалось tempora; 21.03.2013 в 22:26.
|
|
|
Сказали "Спасибо" tempora
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 21:25.
|
|