Кнопки и кнопочный интерфейс

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
Ivanoff-iv
Друг Кота
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

Кнопки и кнопочный интерфейс

Сообщение Ivanoff-iv »

Скажу сразу, многие начинающие осваивать МК (что греха таить, и сам таким был, а местами и до сих пор есть) не умеют правильно работать с кнопками и довольно часто в поделках (причем не только любительских) наблюдается специфическая реакция на нажатие кнопки (то кнопка сразу сработает, то с задержкой, а то, бывает, и вообще не сработает :)) в зависимости от того, в какой момент нажата). Также новички часто забывают про дребезг.
Вот я и решил собрать "коллекцию" приемов взаимодействия (и подключения кнопок), описать преимущества и недостатки того или иного метода...
В общем здесь будем добиваться четких нажатий, быстрой реакции и взаимопонимания с МК. :beer:

Добавлено after 26 minutes 57 seconds:
для начала подключение кнопки и настройка порта:
устройство небольшое, кнопка рядом, помехи невелики, кнопка подсоединяется с Y выход порта X на "минусовую" шину:

Код: Выделить всё

DDRX&=~(1<<Y); //DDRX.Y=0; устанавливаем ногу на вход. 
PORTX|=(1<<Y);  //PORTX.Y=1; включаем подтягивающий резистор (внутри МК).
...
//теперь PINX&(1<<Y)   //PINX.Y отражает состояние входа (и кнопки) 0-нажата, не 0 - не нажата
//(тут важно - "не 0" это не обязательно 1, конструкция PINX&(1<<Y) при отпущенной кнопке принимает значение 2^Y)
кстати тут и у меня вопрос: в чем принципиальные отличия при обращении к биту в регистре порта DDRX&=~(1<<Y); или DDRX.Y=0;?

самый простой пример антидребезга:

Код: Выделить всё

if ((PINX&(1<<Y))==0)
{
delay_us(100); //задержка перед повторной проверкой кнопки
if ((PINX&(1<<Y))==0) {действия при нажатой кнопке};
};
вся эта конструкция должна постоянно повторяться (выполняется в цикле или запускается в прерывании по таймеру).

Добавлено after 9 minutes 12 seconds:
если требуется величить стабильность (ослабить помехи) можно добавить внешний резистор от "ноги" к плюсу питания МК (R около 10кОм).
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

Re: Кнопки и кнопочный интерфейс

Сообщение pyzhman »

[uquote="Ivanoff-iv",url="/forum/viewtopic.php?p=3278963#p3278963"]...в чем принципиальные отличия при обращении к биту в регистре порта DDRX&=~(1<<Y); или DDRX.Y=0;?...[/uquote]
Попробуйте писать в AtmelStudio и в CodeVision. Посмотрите результаты компиляции в обеих программах.
самый простой пример антидребезга:

Вот так вот, с места в карьер. Неплохо бы для начала обозначить суть проблемы - что такое дребезг. Далее - методы его подавления.
я ... решил ...описать преимущества и недостатки того или иного метода...

Где оные для "самого простого примера"?
довольно часто в поделках (причем не только любительских)

Примеры в студию. Особенно того, что в скобках.
Docendo discimus
Аватара пользователя
Ivanoff-iv
Друг Кота
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

Re: Кнопки и кнопочный интерфейс

Сообщение Ivanoff-iv »

[uquote="pyzhman",url="/forum/viewtopic.php?p=3278984#p3278984"]Примеры в студию. Особенно того, что в скобках.[/uquote] вот как привести? сфоткать устройство и подписать - у него кнопки отрабатывают хреново? :)) счетчики вроде такие попадались, попадутся опять - сфоткаю. ПС. китайские поделки к какой группе относить?
pyzhman писал(а):Попробуйте писать в AtmelStudio и в CodeVision. Посмотрите результаты компиляции в обеих программах.
студии под рукой нет, КВАВР отрабатывает обе, результат одинаковый: CBI 0x12,1 , но, если написать типа PORTA&=~(1<<0|1<<1); (изменяем несколько бит) то тут обработка будет через регистр (чтение всего порта, правка регистра, запись в порт).
pyzhman писал(а):Вот так вот, с места в карьер...что такое дребезг?
дельное замечание...надо хоть ссылочкой подкрепить
pyzhman писал(а):Где оные для "самого простого примера"?
самый большой недостаток - применение программной задержки Delay_us(); - "благодаря" ей приостанавливается выполнение вычислений, ещё из недостатков - слежение за кнопкой происходит программно, и если контроллер занят чем-то другим (возможно отрабатывает чью-то задержку :)) ) нажатие кнопки может быть пропущено...
pyzhman спасибо за правки, а как считаете, вообще тема нужная или я это зря затеял?
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Кнопки и кнопочный интерфейс

Сообщение ARV »

Ivanoff-iv писал(а):как считаете, вообще тема нужная или я это зря затеял?
зря
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
Jack_A
Друг Кота
Сообщения: 6307
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Re: Кнопки и кнопочный интерфейс

Сообщение Jack_A »

Как уже пришли к консенсусу в другом топике - тупо delay - зло абсолютное и должно быть игнорируемо. А антидребезг легко делается в таймерном прерывании: получили >=3 совпадений подряд (при 10мс-ном прерывании) - состояние зафиксировано, не совпадает с текущим - отрабатываем изменение состояния.
Насчет go to мнения разделились :)
Изображение
Пока_без_кота
Потрогал лапой паяльник
Сообщения: 359
Зарегистрирован: Чт авг 08, 2013 01:06:54

Re: Кнопки и кнопочный интерфейс

Сообщение Пока_без_кота »

Даже с учетом того, что подход с задержками неправильный, задержки в 100 микросекунд будет недостаточно. При дребезге кнопок нужны задержки порядка единиц миллисекунд.
Попутно, кто-то может подсказать алгоритм обработки коротких/длинных нажатий кнопок. Можно кодом на АСМ/Си, можно псевдокодом, можно вообще словами описАть.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Кнопки и кнопочный интерфейс

Сообщение ARV »

Jack_A писал(а):Насчет go to мнения разделились
ну и на счет delay() они тоже моими стараниями не так однозначны.
не вижу абсолютно ничего плохого в delay(), в том числе и при подавлении дребезга. как и в случае с goto просто есть разумные ограничения на эффективность применения, только и всего. никакого абсолютного зла, не наводите напраслину на задержку :)))

да, кстати, о каком топике вы говорили? что-то пропустил я холиварчик ...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

Re: Кнопки и кнопочный интерфейс

Сообщение pyzhman »

[uquote="Ivanoff-iv",url="/forum/viewtopic.php?p=3279026#p3279026"]...тема нужная или я это зря затеял?[/uquote]
У вас нет системного подхода, сумбур. Составьте план, обязательно отрецензируйте и только потом, если не пропадёт запал, выкладывайте в сеть.
Пока_без_кота писал(а):...подход с задержками неправильный...

Я бы не был так категоричен. В ногодрыгалках (бегущие огонёчки, гирлянды, таймерочки, моторчики) вполне себе работает делэй_мс(10) в майне.
Docendo discimus
Аватара пользователя
Ivanoff-iv
Друг Кота
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

Re: Кнопки и кнопочный интерфейс

Сообщение Ivanoff-iv »

[uquote="Пока_без_кота",url="/forum/viewtopic.php?p=3279109#p3279109"]кто-то может подсказать алгоритм обработки коротких/длинных нажатий кнопок.[/uquote]И это планирую, есть обкатанный алгоритм: понадобятся 1) регулярный запуск подпрограммы опроса кнопок и переменная - накопитель.
//отступление: считаем запаркованный счетчик == 0, сброшенный ==1.
в подпрограмме проверили кнопку: нажата
{счетчик не запаркован? //>0
{прирастили счетчик, сверили его с уставкой длинного нажатия: дошла
{паркуем счетчик; действие длинного нажатия;};};}
иначе (не нажата){
проверяем счетчик: ((больше минимума) и (незапаркован)) {действие короткого нажатия;};
/*запаркованный счетчик итак меньше минимума => это условие можно не проверять.*/
сброс счетчика;};
----------
Последний раз редактировалось Ivanoff-iv Чт янв 11, 2018 06:09:53, всего редактировалось 2 раза.
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Аватара пользователя
Jack_A
Друг Кота
Сообщения: 6307
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Re: Кнопки и кнопочный интерфейс

Сообщение Jack_A »

ARV писал(а):да, кстати, о каком топике вы говорили? что-то пропустил я холиварчик ...

Дык это наша с вами дискуссия и была, viewtopic.php?f=57&t=150874&p=3261138#p3261138
А мне показалось, что консексус :)
Изображение
Аватара пользователя
philosoraptor
Прорезались зубы
Сообщения: 225
Зарегистрирован: Сб янв 14, 2012 22:53:50

Re: Кнопки и кнопочный интерфейс

Сообщение philosoraptor »

_delay_ms() в обработке кнопок, если речь не идет о примитивном радиобрелке с одной функцией, это, наверно, самый четкий признак профнепригодности. В адекватном же коде опрос вызывается по переполнению таймера каждые ~200 ms из основного цикла. Если отслеживаем длинные нажатия, то первый раз поднимаем флажок, тогда второе срабатывание будет означать долгое нажатие, если же пин вернулся в начальное состояние, то нажатие было короткое.
Это, собственно, одна из простейших реализаций т.н. State Machine.
Аватара пользователя
Flasher
Мудрый кот
Сообщения: 1802
Зарегистрирован: Ср сен 07, 2011 21:40:30

Re: Кнопки и кнопочный интерфейс

Сообщение Flasher »

Самый четкий признак профнепригодности- категоричный бред.
Для начала смотрим на дребезг
http://radio-hobby.org/modules/news/art ... toryid=797
Потом вспоминаем про возможные помехи.
Затем вспоминаем про постепенное окисление дешевых тактовых кнопок.
Пытаемся все эти вещи учесть в обработчике.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Кнопки и кнопочный интерфейс

Сообщение Аlex »

вообще тема нужная или я это зря затеял?

Вообще, такая тема уже существует. Причём она прикрепленная. viewtopic.php?f=61&t=79801
Аватара пользователя
Ivanoff-iv
Друг Кота
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

Re: Кнопки и кнопочный интерфейс

Сообщение Ivanoff-iv »

[uquote="philosoraptor",url="/forum/viewtopic.php?p=3279889#p3279889"]Если отслеживаем длинные нажатия, то первый раз поднимаем флажок, тогда второе срабатывание будет означать долгое нажатие, если же пин вернулся в начальное состояние, то нажатие было короткое.
Это, собственно, одна из простейших реализаций т.н. State Machine.[/uquote] Вот против этого я и хотел выступить - 1) ты сделал 2 коротких нажатия, а получил одно длинное, т.к. второе нажатие совпало с вторым опросом, 2) даже если надо одно короткое, но выверенное по времени, то это будет сложно сделать т.к. система будет ожидать 2го замера, чтобы убедиться, что нажатие было коротким, и вообще система будет казаться тормознутой (по той же причине).

Добавлено after 24 minutes 39 seconds:
[uquote="Аlex",url="/forum/viewtopic.php?p=3279980#p3279980"]Вообще, такая тема уже существует.[/uquote] Вот я лоханулся, там эта тема, наверно, действительно уместней...
П.С.: я просматриваю 5 тем на форуме, на большее интернета не хватает (открывает > 40сек страницу...) вот и проглядел. Пошел туда почитаю, может там, всё что я хотел обсудить уже есть...

Добавлено after 1 hour 30 minutes 25 seconds:
Для pyzhmana:
Спойлер[uquote="pyzhman",url="/forum/viewtopic.php?p=3278984#p3278984"]
довольно часто в поделках (причем не только любительских)
Примеры в студию. Особенно того, что в скобках.[/uquote]Вот: не я один это вижу [uquote="Аlex",url="/forum/viewtopic.php?p=2946018#p2946018"]Щелчёк - это ~ 0.2...0.3 сек.
А ждать 0.5 сек нажатой кнопку, для одного клика - мазохизм.
Встречался я с пром-приборами, ПО для которых писались такими горе-программистами. Одно только лазанье по меню вызывает раздражение, переходящее в нервоз. Не говоря уж о том, когда увеличиваешь/уменьшаешь цифровые значения параметров :facepalm:[/uquote]
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

Re: Кнопки и кнопочный интерфейс

Сообщение pyzhman »

[uquote="Ivanoff-iv",url="/forum/viewtopic.php?p=3280023#p3280023"]...
Для pyzhmana...[/uquote]
Не оправдывайтесь, ни к чему. Все пацаны и так в курсе.
Docendo discimus
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Кнопки и кнопочный интерфейс

Сообщение ARV »

Jack_A писал(а):Дык это наша с вами дискуссия и была,
ну так консенсус же был достигнут на фразе
Jack_A писал(а):Даже в этом ответе - сомневаюсь
, а тут снова категоричность в заявлении
Jack_A писал(а):тупо delay - зло абсолютное и должно быть игнорируемо
;)
Flasher писал(а):Самый четкий признак профнепригодности- категоричный бред.
люто плюсую!
philosoraptor писал(а):В адекватном же коде опрос вызывается по переполнению таймера каждые ~200 ms из основного цикла.
:facepalm:
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

Re: Кнопки и кнопочный интерфейс

Сообщение pyzhman »

[uquote="philosoraptor",url="/forum/viewtopic.php?p=3279889#p3279889"]...каждые ~200 ms...[/uquote]
Изображение
Docendo discimus
Аватара пользователя
Jack_A
Друг Кота
Сообщения: 6307
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Re: Кнопки и кнопочный интерфейс

Сообщение Jack_A »

В общем, сколько людей - столько и мнений. В спорах не рождается истина, в спорах ее могут только придушить :(
Старая добрая RC решает проблему, а если нужны фронты, есть место и не жмет потребление - триггер Шмиткина нам в помочь. И тогда об delay спор утихнет, и проблема автоповтор=длинное нажатие решится безболезненно, бо по прерыванию по фронту-срезу. Мы с Мурзиком такого мнения.Изображение
Вложения
RC.JPG
(2.53 КБ) 1311 скачиваний
Изображение
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Кнопки и кнопочный интерфейс

Сообщение ARV »

Jack_A писал(а):Старая добрая RC решает проблему
ну вы даёте! :shock: это же mauvais ton! а если кнопок 10 - это ж сколько обвеса дополнительного?! решение всех проблем программно (ну или аппартно встроенными в МК средствами) - вот наш выбор!

и кроме нас с Бусей и Кексом, так считают многие другие :)))
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
ozonn
Вымогатель припоя
Сообщения: 522
Зарегистрирован: Чт янв 21, 2016 15:59:10

Re: Кнопки и кнопочный интерфейс

Сообщение ozonn »

не вижу ничего плохого в применении _delay где бы то ни было и уж тем более для подавления дребезга :)
Ответить

Вернуться в «AVR»