| AVR Раздел по микроконтроллерам компании Atmel - AVR / ATtiny / ATmega / ATMega128 / ATxmega, вопросы по программированию в AVR studio и все, относящееся к AVR... |
Несколько функций на одной кнопке
09.01.2014, 14:00
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 24.09.2007
Адрес: Полтава, UA
Сообщений: 2,440
Сказал спасибо: 375
Сказали Спасибо 1,052 раз(а) в 621 сообщении(ях)
|
Re: Несколько функций на одной кнопке
Делайте на счетчике, как я написал, там нечему "не работать".
Алгоритм таков, что можно делать несколько задержек на одной кнопке.
ps
Если вы не можете за две c лишним недели осмыслить написанное (этот примитив) - может вам вообще не стоит этим заниматься?
__________________
Мелочи не решают главного. Они решают всё!
|
|
|
|
10.01.2014, 14:16
|
|
|
Временная регистрация
Регистрация: 04.02.2013
Сообщений: 78
Сказал спасибо: 2
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Несколько функций на одной кнопке
Сообщение от gary2007
|
|
Если вы не можете за две c лишним недели осмыслить написанное (этот примитив) - может вам вообще не стоит этим заниматься?
|
Я этим не занимался. Наверное еще течении еще 1-2 недель не смогу поработать над моей программой. Да к тому же датчики еще не прислали.
|
|
|
|
10.01.2014, 14:52
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,487
Сказал спасибо: 30
Сказали Спасибо 3,070 раз(а) в 2,011 сообщении(ях)
|
Re: Несколько функций на одной кнопке
|
|
|
|
11.01.2014, 05:56
|
|
|
Временная регистрация
Регистрация: 08.02.2011
Сообщений: 74
Сказал спасибо: 8
Сказали Спасибо 11 раз(а) в 11 сообщении(ях)
|
Re: Несколько функций на одной кнопке
Сообщение от Easyrider83
|
Антидребезг у вас мощный, andrey9806!
Я делаю иначе. По перепаду фронта по кнопке запускается прерывание, которое запускает таймер. Таймер вызывает прерывание и инкременирует счетчик. Прерывание смотрит, нажата ли кнопка и инкременирует второй счетчик, если нажата и третий, если не нажата. Если третий переполнился - кнопка отпущена. Тормозим таймер. Измеряем второй счетчик. Сколько в нем значений, столько долго держали кнопку нажатой. И не важно, было ли случайное срабатывание или нет.
|
как ни странно все работает 
так как вся у меня прошивка написана на прерываниях усложнять нет
смысла только морока
да и таймеры не лишние 2 счетчика на кнопку 
кроме этого при обработке нажатия дребезг можно легко отсеять как слишком короткое нажатие
попробуй сделать 3 кнопки
а еще аналоговый фильтр на оу и мелкий мк поставить для устранения..
Последний раз редактировалось andrey9806; 11.01.2014 в 05:58.
|
|
|
|
12.01.2014, 11:20
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 29.10.2006
Сообщений: 1,449
Сказал спасибо: 99
Сказали Спасибо 318 раз(а) в 234 сообщении(ях)
|
Re: Несколько функций на одной кнопке
Сообщение от andrey9806
|
|
а еще аналоговый фильтр на оу и мелкий мк поставить для устранения..
|
Видел я такое.
Примитивная установка. Кнопка пуск, стоп и концевик.
Кнопка пуск запускает мотор, на валу (после редуктора) стоит концевик.
МК отсчитывает 15 оборотов и останавливает мотор.
Так там - да. На каждой кнопке и концевике стояло по ОУ, фильтр второго порядка и ещё по два диода. Два импульсных преобразователя для питания как МК, так и реле. Ну всё это от сетевого миниатюрного трансформатора питалось.
Насоветуете щас, потом плоды таких горе-разработчиков будут по всей стране вспоминать.
|
|
|
|
13.01.2014, 11:26
|
|
|
Гражданин KAZUS.RUN
Регистрация: 06.04.2010
Адрес: Санкт-Петербург - Волжский
Сообщений: 528
Сказал спасибо: 73
Сказали Спасибо 56 раз(а) в 45 сообщении(ях)
|
Re: Несколько функций на одной кнопке
Наверное самый простой и эффективный алгоритм (имхо) реализующий , как мною описано выше , функцию антидребезга + фиксация короткого и длинного нажатия (t› 3 сек). Период опроса кнопки сделал = 0,1сек. Проверено на двух устройствах с кнопками одинакового типа, лишних или ошибочных срабатываний не было обнаруженно.
Фрагмент кода:
|
Код:
|
/*-----------------------------------------------------------------------------------------*/
/* Обьявление ПЕРЕМЕННЫХ и КОНСТАНТ : */
volatile u16 StatPin,StatKey;
#define MskKey1 0x0003
#define MskGreen 0x01
#define MskBlue 0x02
/*================================================= ==========================================*/
void TIM2_IRQHandler(void)
{
static u8 cntTK;
u16 temp;
TIM2-›SR &=~(TIM_SR_UIF);// reset flag interrupt!
// 0bxxxxxx00 - no action
// 0bxxxxxx10 - key pressed
// 0bxxxxxx01 - key clicking on time ‹ 3 sec
// 0bxxxxxx11 - key clicking on time › 3 sec
temp=StatKey&MskKey1;
if (temp==0x0002)// key pressed
{
cntTK++; if (cntTK==255) cntTK=254;
if (!(CHECK_PIN(Pa0)))// key pressed off
{
if(cntTK‹30)
{ StatKey=0x0001; // code key of time‹3sec
}
else StatKey=0x0003; // code key of time›3sec
cntTK=0;
}
}
else if(!temp) // key no pressed
{
if (CHECK_PIN(Pa0))
{StatKey=0x0002;// State key pressed
}
}
}
/*================================================= ==========================================*/
int main(void)
{
//u8 btMsk=0x80;//0b10000000;
Init();
RCC-›APB1ENR|=(RCC_APB1ENR_TIM2EN);
/* Настройка таймера TIM2 на событие: Прерывание при совпадении с р-ром TIM2_ARR */
TIM2-›PSC=10000-1;// предделитель CK_CNT=24 000 000/10000=2400 Hz
TIM2-›ARR=240; // загрузка рег-ра для сравнения CNT=2400/240=10 Hz
TIM2-›DIER|=(TIM_DIER_UIE); // Вкл.разрешения прерывания на совпадение сч.
NVIC_EnableIRQ(TIM2_IRQn);
TIM2-›CR1|=(TIM_CR1_CEN); // Запуск Таймера!
StatPin=0;
StatKey=0;
do
{
if (StatKey==0x0001) // t‹3sec
{
StatKey=0;
if(StatPin&MskGreen)
{OFF_PIN(Green);}
else ON_PIN(Green);
StatPin^=MskGreen;
}
if (StatKey==0x0003) // t›3sec
{
StatKey=0;
if(StatPin&MskBlue)
{OFF_PIN(Blue);}
else ON_PIN(Blue);
StatPin^=MskBlue;
}
}
while (1); // зависаем
} |
Последний раз редактировалось MaxiMuz79; 13.01.2014 в 11:35.
|
|
|
|
13.01.2014, 11:30
|
|
|
Гражданин KAZUS.RUN
Регистрация: 06.04.2010
Адрес: Санкт-Петербург - Волжский
Сообщений: 528
Сказал спасибо: 73
Сказали Спасибо 56 раз(а) в 45 сообщении(ях)
|
Re: Несколько функций на одной кнопке
Сообщение от omercury
|
|
Только недоношенный - при отпускании нет фильтрации дребезга. Будут проскакивать короткие "нажатия".
|
при отпускании такая же отстройка от дребезга , вследствии определенного периода опроса кнопки
|
|
|
|
13.01.2014, 23:07
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 29.10.2006
Сообщений: 1,449
Сказал спасибо: 99
Сказали Спасибо 318 раз(а) в 234 сообщении(ях)
|
Re: Несколько функций на одной кнопке
Сообщение от MaxiMuz79
|
|
Наверное самый простой и эффективный алгоритм (имхо) реализующий , как мною описано выше , функцию антидребезга + фиксация короткого и длинного нажатия (t› 3 сек).
|
Я делал так:
|
PHP код:
|
unsigned char cnt0;
begin:
if(!PINA.0) {
if((cnt0==0) || (cnt0==20)) Press();
if(cnt0‹20) cnt0++;
}
else cnt0=0;
delay_ms(100);
goto begin;
|
Это для быстрого повторения действия при удерживании.
Можно аналогично переделать под короткое и длинное нажатие:
|
PHP код:
|
unsigned char cnt0;
begin:
if (!PINA.0) {
if(cnt0‹30) cnt0++;
}
else {
if((cnt0›0) && (cnt0‹30)) Press_short();
if((cnt0==30) Press_long();
cnt0=0;
}
delay_ms(100);
goto begin;
|
Лично мне не нравится, когда действие выполняется после отпускания кнопки. Вроде нажал, а ничего не происходит. Инстинктиквно жмёшь сильнее - ничего. Отпускаешь - произошло. Нехорошо как-то.
|
|
|
|
14.01.2014, 09:43
|
|
|
Гражданин KAZUS.RUN
Регистрация: 06.04.2010
Адрес: Санкт-Петербург - Волжский
Сообщений: 528
Сказал спасибо: 73
Сказали Спасибо 56 раз(а) в 45 сообщении(ях)
|
Re: Несколько функций на одной кнопке
Godzilla82, вы показали частный вариант алгоритма в общем потоке, а если кроме опроса кнопок требуется еще какие то действия ?
Сообщение от Godzilla82
|
|
Лично мне не нравится, когда действие выполняется после отпускания кнопки. Вроде нажал, а ничего не происходит. Инстинктиквно жмёшь сильнее - ничего. Отпускаешь - произошло. Нехорошо как-то.
|
.. ну в случае когда на одну кнопку вешается несколько действий , непредставляю как будет выглядеть многократное срабатывание при нажатие и что им можно выполнять
|
|
|
|
14.01.2014, 13:05
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 29.10.2006
Сообщений: 1,449
Сказал спасибо: 99
Сказали Спасибо 318 раз(а) в 234 сообщении(ях)
|
Re: Несколько функций на одной кнопке
Сообщение от MaxiMuz79
|
|
Godzilla82, вы показали частный вариант алгоритма в общем потоке, а если кроме опроса кнопок требуется еще какие то действия ?
|
Ну всё, конечно, зависит от алгоритма.
В этом варианте у меня так: нажал кнопку - выполняется какое-то действие (запустили процесс, увеличили какой-то параметр, перешли на какой-то пункт меню и т.п.).
Сообщение от MaxiMuz79
|
|
.. ну в случае когда на одну кнопку вешается несколько действий , непредставляю как будет выглядеть многократное срабатывание при нажатие и что им можно выполнять
|
Поэтому я стараюсь не использовать длинное нажатие.
В единичных случаях (когда это действительно нужно, например, чтобы прервать длительный процесс) - кнопка опрашивается отдельно в самом процессе.
А так - применений масса. Задаётся число с клавиатуры. Например, 50. Нажал кнопку + и значения быстренько увеличились до 50.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 16:15.
|
|