Портал для радиолюбителей и разработчиков электроники · с 2003 годаРеклама на сайте
Найти компонент, схему или даташит

Даташиты, справочник отечественных приборов, схемы с разбором и живой форум

AVR Раздел по микроконтроллерам компании Atmel - AVR / ATtiny / ATmega / ATMega128 / ATxmega, вопросы по программированию в AVR studio и все, относящееся к AVR...

 
Опции темы

Несколько функций на одной кнопке

Непрочитано 09.01.2014, 14:00  
gary2007
Почётный гражданин KAZUS.RUN
 
Аватар для gary2007
 
Регистрация: 24.09.2007
Адрес: Полтава, UA
Сообщений: 2,440
Сказал спасибо: 375
Сказали Спасибо 1,052 раз(а) в 621 сообщении(ях)
gary2007 на пути к лучшему
По умолчанию Re: Несколько функций на одной кнопке

Делайте на счетчике, как я написал, там нечему "не работать".
Алгоритм таков, что можно делать несколько задержек на одной кнопке.

ps
Если вы не можете за две c лишним недели осмыслить написанное (этот примитив) - может вам вообще не стоит этим заниматься?
Реклама:
__________________
Мелочи не решают главного. Они решают всё!
gary2007 вне форума  
Непрочитано 10.01.2014, 14:16  
ua3rad
Временная регистрация
 
Регистрация: 04.02.2013
Сообщений: 78
Сказал спасибо: 2
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
ua3rad на пути к лучшему
По умолчанию Re: Несколько функций на одной кнопке

Сообщение от gary2007 Посмотреть сообщение
Если вы не можете за две c лишним недели осмыслить написанное (этот примитив) - может вам вообще не стоит этим заниматься?
Я этим не занимался. Наверное еще течении еще 1-2 недель не смогу поработать над моей программой. Да к тому же датчики еще не прислали.
ua3rad вне форума  
Непрочитано 10.01.2014, 14:52  
omercury
Почётный гражданин KAZUS.RUN
 
Аватар для omercury
 
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,487
Сказал спасибо: 30
Сказали Спасибо 3,070 раз(а) в 2,011 сообщении(ях)
omercury на пути к лучшему
По умолчанию Re: Несколько функций на одной кнопке

https://kazus.run/forums/showthread....E8%ED%ED%EE%E5
omercury вне форума  
Непрочитано 11.01.2014, 05:56  
andrey9806
Временная регистрация
 
Регистрация: 08.02.2011
Сообщений: 74
Сказал спасибо: 8
Сказали Спасибо 11 раз(а) в 11 сообщении(ях)
andrey9806 на пути к лучшему
По умолчанию Re: Несколько функций на одной кнопке

Сообщение от Easyrider83 Посмотреть сообщение
Антидребезг у вас мощный, andrey9806!
Я делаю иначе. По перепаду фронта по кнопке запускается прерывание, которое запускает таймер. Таймер вызывает прерывание и инкременирует счетчик. Прерывание смотрит, нажата ли кнопка и инкременирует второй счетчик, если нажата и третий, если не нажата. Если третий переполнился - кнопка отпущена. Тормозим таймер. Измеряем второй счетчик. Сколько в нем значений, столько долго держали кнопку нажатой. И не важно, было ли случайное срабатывание или нет.
как ни странно все работает
так как вся у меня прошивка написана на прерываниях усложнять нет
смысла только морока

да и таймеры не лишние 2 счетчика на кнопку
кроме этого при обработке нажатия дребезг можно легко отсеять как слишком короткое нажатие

попробуй сделать 3 кнопки

а еще аналоговый фильтр на оу и мелкий мк поставить для устранения..

Последний раз редактировалось andrey9806; 11.01.2014 в 05:58.
andrey9806 вне форума  
Непрочитано 12.01.2014, 11:20  
Godzilla82
Почётный гражданин KAZUS.RUN
 
Регистрация: 29.10.2006
Сообщений: 1,449
Сказал спасибо: 99
Сказали Спасибо 318 раз(а) в 234 сообщении(ях)
Godzilla82 на пути к лучшему
Сообщение Re: Несколько функций на одной кнопке

Сообщение от andrey9806 Посмотреть сообщение
а еще аналоговый фильтр на оу и мелкий мк поставить для устранения..
Видел я такое.

Примитивная установка. Кнопка пуск, стоп и концевик.
Кнопка пуск запускает мотор, на валу (после редуктора) стоит концевик.
МК отсчитывает 15 оборотов и останавливает мотор.

Так там - да. На каждой кнопке и концевике стояло по ОУ, фильтр второго порядка и ещё по два диода. Два импульсных преобразователя для питания как МК, так и реле. Ну всё это от сетевого миниатюрного трансформатора питалось.

Насоветуете щас, потом плоды таких горе-разработчиков будут по всей стране вспоминать.
Godzilla82 вне форума  
Непрочитано 13.01.2014, 11:26  
MaxiMuz79
Гражданин KAZUS.RUN
 
Аватар для MaxiMuz79
 
Регистрация: 06.04.2010
Адрес: Санкт-Петербург - Волжский
Сообщений: 528
Сказал спасибо: 73
Сказали Спасибо 56 раз(а) в 45 сообщении(ях)
MaxiMuz79 на пути к лучшему
По умолчанию 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.
MaxiMuz79 вне форума  
Непрочитано 13.01.2014, 11:30  
MaxiMuz79
Гражданин KAZUS.RUN
 
Аватар для MaxiMuz79
 
Регистрация: 06.04.2010
Адрес: Санкт-Петербург - Волжский
Сообщений: 528
Сказал спасибо: 73
Сказали Спасибо 56 раз(а) в 45 сообщении(ях)
MaxiMuz79 на пути к лучшему
По умолчанию Re: Несколько функций на одной кнопке

Сообщение от omercury Посмотреть сообщение
Только недоношенный - при отпускании нет фильтрации дребезга. Будут проскакивать короткие "нажатия".
при отпускании такая же отстройка от дребезга , вследствии определенного периода опроса кнопки
MaxiMuz79 вне форума  
Непрочитано 13.01.2014, 23:07  
Godzilla82
Почётный гражданин KAZUS.RUN
 
Регистрация: 29.10.2006
Сообщений: 1,449
Сказал спасибо: 99
Сказали Спасибо 318 раз(а) в 234 сообщении(ях)
Godzilla82 на пути к лучшему
Сообщение 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; 
Лично мне не нравится, когда действие выполняется после отпускания кнопки. Вроде нажал, а ничего не происходит. Инстинктиквно жмёшь сильнее - ничего. Отпускаешь - произошло. Нехорошо как-то.
Godzilla82 вне форума  
Непрочитано 14.01.2014, 09:43  
MaxiMuz79
Гражданин KAZUS.RUN
 
Аватар для MaxiMuz79
 
Регистрация: 06.04.2010
Адрес: Санкт-Петербург - Волжский
Сообщений: 528
Сказал спасибо: 73
Сказали Спасибо 56 раз(а) в 45 сообщении(ях)
MaxiMuz79 на пути к лучшему
По умолчанию Re: Несколько функций на одной кнопке

Godzilla82, вы показали частный вариант алгоритма в общем потоке, а если кроме опроса кнопок требуется еще какие то действия ?
Сообщение от Godzilla82 Посмотреть сообщение
Лично мне не нравится, когда действие выполняется после отпускания кнопки. Вроде нажал, а ничего не происходит. Инстинктиквно жмёшь сильнее - ничего. Отпускаешь - произошло. Нехорошо как-то.
.. ну в случае когда на одну кнопку вешается несколько действий , непредставляю как будет выглядеть многократное срабатывание при нажатие и что им можно выполнять
MaxiMuz79 вне форума  
Непрочитано 14.01.2014, 13:05  
Godzilla82
Почётный гражданин KAZUS.RUN
 
Регистрация: 29.10.2006
Сообщений: 1,449
Сказал спасибо: 99
Сказали Спасибо 318 раз(а) в 234 сообщении(ях)
Godzilla82 на пути к лучшему
Сообщение Re: Несколько функций на одной кнопке

Сообщение от MaxiMuz79 Посмотреть сообщение
Godzilla82, вы показали частный вариант алгоритма в общем потоке, а если кроме опроса кнопок требуется еще какие то действия ?
Ну всё, конечно, зависит от алгоритма.
В этом варианте у меня так: нажал кнопку - выполняется какое-то действие (запустили процесс, увеличили какой-то параметр, перешли на какой-то пункт меню и т.п.).

Сообщение от MaxiMuz79 Посмотреть сообщение
.. ну в случае когда на одну кнопку вешается несколько действий , непредставляю как будет выглядеть многократное срабатывание при нажатие и что им можно выполнять
Поэтому я стараюсь не использовать длинное нажатие.

В единичных случаях (когда это действительно нужно, например, чтобы прервать длительный процесс) - кнопка опрашивается отдельно в самом процессе.

А так - применений масса. Задаётся число с клавиатуры. Например, 50. Нажал кнопку + и значения быстренько увеличились до 50.
Godzilla82 вне форума  
 
Опции темы

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

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

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

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
FAQ (ЧаВО) по PROTEUS для начинающих и не только dosikus Proteus 221 07.03.2024 22:45
Книги dosikus Электронная библиотека 11242 29.12.2015 23:45
Интересный вопрос - два усилителя к одной нагрузке eCAH Аудиотехника 45 14.10.2010 01:23
Триггер на несколько секунд rewacom Электроника средств транспорта 9 30.06.2009 11:47
Несколько мобильных операторов на одной SIM карте Angelus Автоматика и аппаратура связи 7 05.03.2007 11:26


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


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.