Автор |
Сообщение |
|
|
Заголовок сообщения: |
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 |
|
|
 |
|