| 
		
		
			| Автор | Сообщение |  
				|  | 
					
						|  | Заголовок сообщения: | Re: Кнопка | Цитата |  |  
				| 
					
						| 
							
								| Немного подправил код, была выявлена ошибка (обнуление длинного нажатия) 
 
 Немного подправил код, была выявлена ошибка (обнуление длинного нажатия) |  |  
						| 
							
								|  |  | Добавлено: 25 июн 2018, 15:45 |  |  |  
				|  |  
				|  | 
					
						|  | Заголовок сообщения: | Re: Кнопка | Цитата |  |  
				| 
					
						| 
							
								| а) Есть кнопка… короткое нажатие включает клаксон, а длинное нажатие включает/выключает освещение салона. Клаксон не должен звучать когда производится управление освещением.б) Есть кнопка… короткое нажатие включает/отключает освещение, а длинное нажатие включает/отключает вентилятор. Свет не должен включиться или выключится при управлении вентилятором.
 в)  и т.д.
 а) Есть кнопка… короткое нажатие включает клаксон, а длинное нажатие включает/выключает освещение салона. Клаксон не должен звучать когда производится управление освещением.б) Есть кнопка… короткое нажатие включает/отключает освещение, а длинное нажатие включает/отключает вентилятор. Свет не должен включиться или выключится при управлении вентилятором.
 в)  и т.д.
 |  |  
						| 
							
								|  |  | Добавлено: 18 май 2018, 02:26 |  |  |  
				|  |  
				|  | 
					
						|  | Заголовок сообщения: | Re: Кнопка | Цитата |  |  
				| 
					
						| 
							
								| [quote="SVN"][quote="Valentinych"]Пример Вами выбран правильный… но вот сотни других примеров говорят об обратном.[/quote][/quote]Приведите хотя бы несколько примеров, где [b][i]требуется отработка короткого нажатия по отпусканию кнопки[/i][/b]. Да, так [b][i]можно[/i][/b] делать, но это не значит, что это правильно, и так следует делать всегда, или хотя бы в большинстве случаев. Сама логика короткого нажатия говорит об обратном.Впрочем, это дело каждого...
 |  |  
						| 
							
								|  |  | Добавлено: 18 май 2018, 00:53 |  |  |  
				|  |  
				|  | 
					
						|  | Заголовок сообщения: | Re: Кнопка | Цитата |  |  
				| 
					
						| 
							
								| [quote="Valentinych"]Позволю себе не согласиться с данным утверждением. [/quote]Это сколько угодно… у каждого есть своё мнение.
 [quote="Valentinych"][quote="SVN"]Вообще-то логика работы при использовании нескольких действий (по кратковременному и по длительному нажатию) от одной кнопки, делается [u]всегда[/u] по отпусканию. [/quote]Короткое нажатие кнопки должно обрабатываться именно по нажатию кнопки, а не по ее отпусканию.
 Пример - электронный секундомер.[/quote]
 Моя ошибка только лишь в слове «[u]всегда[/u]»… конечно же не всегда, а в большинстве знакомых мне случаях. В общим каждая конкретная задача определяет тот или иной алгоритм.
 
 Пример Вами выбран правильный… но вот сотни других примеров говорят об обратном.
 |  |  
						| 
							
								|  |  | Добавлено: 08 май 2018, 15:21 |  |  |  
				|  |  
				|  | 
					
						|  | Заголовок сообщения: | Re: Кнопка | Цитата |  |  
				| 
					
						| 
							
								| [quote="SVN"]Вообще-то логика работы при использовании нескольких действий (по кратковременному и по длительному нажатию) от одной кнопки, делается всегда [u]по отпусканию[/u]. [/quote]Позволю себе не согласиться с данным утверждением. Короткое нажатие кнопки должно обрабатываться именно по нажатию кнопки, а не по ее отпусканию.Пример - электронный секундомер. Если для его запуска или останова ждать [i]отпускания[/i] кнопки, то точность измерения времени будет зависеть от настроения хронометриста. В подобных девайсах нужно ловить именно момент нажатия. И для этого совершенно кошерно использовать прерывание INT0, или аналогичное.
 А вот для отработки по удержанию требуется отследить как нажатие, так и отпускание кнопки. И здесь INT0 опять будет абсолютно в помощь. Хотя можно обойтись и без него.
 Отработка по удержанию кнопки предполагает, что нажатие должно быть не менее какой-то длительности. Например - для рестарта системы требуется нажать, и удерживать кнопку 3-5 секунд.
 Как правило, алгоритм программы предполагает определенную временную последовательность коротких и длинных нажатий кнопки. Допустим, сначала система рестартится (сбрасываются данные предыдущих действий), для этого нужно удержание. Затем идут короткие нажатия, запускающие определенные действия или ветви программы. И после выполнения этих действий следует очередной рестарт. Если знать алгоритм выполнения таких действий, то разделить короткие и длинные нажатия не представляет труда.
 Библиотечный алгоритм работы с кнопками хорош своей универсальностью, но именно эта универсальность делает его не самым оптимальным с точки зрения кода программы. Так что при решении любой задачи нужно искать компромисс, который обычно лежит между универсальностью и оптимальностью.
 
 В данный момент заканчиваю разработку сложной системы, в которой связаны в сеть около десятка девайсов, каждый из которых выполняет свою роль. В том числе дистанционный запуск электронных секундомеров и фиксацию внешних событий (ошибок прохождения трассы участниками гонки). На каждом девайсе по несколько кнопок. Большинство из них - многофункциональные. По нажатию одной кнопки может генерироваться несколько разных событий или действий. И все это в реал-тайм, с заданной погрешностью не хуже 0,01 сек (фактически - не хуже 0,005 сек). Так вот обсуждаемый здесь библиотечный алгоритм "не пошел", пришлось придумывать свои решения.
 Если Ваша задача конкретизирована, пишите, возможно смогу предложить что-то нестандартное.
 |  |  
						| 
							
								|  |  | Добавлено: 07 май 2018, 19:10 |  |  |  
				|  |  
				|  | 
					
						|  | Заголовок сообщения: | Re: Кнопка | Цитата |  |  
				| 
					
						| 
							
								| Будь здоров! Будь здоров! |  |  
						| 
							
								|  |  | Добавлено: 02 май 2018, 20:38 |  |  |  
				|  |  
				|  | 
					
						|  | Заголовок сообщения: | Re: Кнопка | Цитата |  |  
				| 
					
						| 
							
								| Классный и компактный код, не то что мой. Благодарю за помощь и консультацию. Классный и компактный код, не то что мой. Благодарю за помощь и консультацию. |  |  
						| 
							
								|  |  | Добавлено: 02 май 2018, 20:12 |  |  |  
				|  |  
				|  | 
					
						|  | Заголовок сообщения: | Re: Кнопка | Цитата |  |  
				| 
					
						| 
							
								| 
 
 [quote]Обработку кнопки поместил в прерывание по таймеру, а вот как его правильно рассчитать я пока не понимаю. Подскажите что да как![/quote][attachment=1]1.png[/attachment]
 
 [attachment=0]-sergius-_Button.zip[/attachment]
 |  |  
						| 
							
								|  |  | Добавлено: 02 май 2018, 18:30 |  |  |  
				|  |  
				|  | 
					
						|  | Заголовок сообщения: | Re: Кнопка | Цитата |  |  
				| 
					
						| 
							
								| 
 
 [quote="SVN"]Закономерные ошибки начинающих:Не учтено быстродействие МК при выполнении процедур. Ты даже моргнуть не успеешь, а переменная Timer_Key переполнится несколько десятков раз.  Если предположить, что твой МК остался на заводской частоте, то это 1 МГц… то бишь твоя переменная  Timer_Key будет прибавлять 1 почти примерно каждые  10 мкс. А за секунду переменная сколько раз переполнится? Вот и я о том же…
 Подпрограмма Button в твоём варианте должна вызываться не из тела программы, а по какому либо прерыванию (к пимеру по Timer0 или Timer1.)
 И ещё… [b]порт DDRB.0[/b] должен быть сконфигурирован на вход, а не на выход… иначе при нажатии кнопки выгорит порт.
 
 PS. А вообще лучше пример свой кидать сюда полностью, а не скрин.[/quote]
 
 Вот пожалуйста пример. Обработку кнопки поместил в прерывание по таймеру, а вот как его правильно рассчитать я пока не понимаю. Подскажите что да как!
 |  |  
						| 
							
								|  |  | Добавлено: 02 май 2018, 17:21 |  |  |  
				|  |  
				|  | 
					
						|  | Заголовок сообщения: | Re: Кнопка | Цитата |  |  
				| 
					
						| 
							
								| Закономерные ошибки начинающих:Не учтено быстродействие МК при выполнении процедур. Ты даже моргнуть не успеешь, а переменная Timer_Key переполнится несколько десятков раз.  Если предположить, что твой МК остался на заводской частоте, то это 1 МГц… то бишь твоя переменная  Timer_Key будет прибавлять 1 почти примерно каждые  10 мкс. А за секунду переменная сколько раз переполнится? Вот и я о том же…
 Подпрограмма Button в твоём варианте должна вызываться не из тела программы, а по какому либо прерыванию (к пимеру по Timer0 или Timer1.)
 И ещё… порт DDRB.0 должен быть сконфигурирован на вход, а не на выход… иначе при нажатии кнопки выгорит порт.
 
 PS. А вообще лучше пример свой кидать сюда полностью, а не скрин.
 Закономерные ошибки начинающих:Не учтено быстродействие МК при выполнении процедур. Ты даже моргнуть не успеешь, а переменная Timer_Key переполнится несколько десятков раз.  Если предположить, что твой МК остался на заводской частоте, то это 1 МГц… то бишь твоя переменная  Timer_Key будет прибавлять 1 почти примерно каждые  10 мкс. А за секунду переменная сколько раз переполнится? Вот и я о том же…
 Подпрограмма Button в твоём варианте должна вызываться не из тела программы, а по какому либо прерыванию (к пимеру по Timer0 или Timer1.)
 И ещё… [b]порт DDRB.0[/b] должен быть сконфигурирован на вход, а не на выход… иначе при нажатии кнопки выгорит порт.
 
 PS. А вообще лучше пример свой кидать сюда полностью, а не скрин.
 |  |  
						| 
							
								|  |  | Добавлено: 02 май 2018, 14:54 |  |  |  
				|  |  |