Дисплеи, датчики и прочие функциональные узлы, управляемые МК.
Ответить

Re: Помогите опросить кнопку

Пн май 04, 2015 16:04:37

U235 писал(а):
-=eagle=- писал(а):...а третья ни в какую не хочет нажиматься...

Может надо так?
Код:
   if(!(PINB&4)) // опрашиваем кнопку 3(+)
   {
      flag3=1; //кнопка нажата (устанавливаем флаг в 1)
      _delay_ms(10); //задержка (защита от дребезга)
   }
   
   if(( flag3==1 )&&(PINB&4)) //условие если кнопка была нажата о потом отпущена
   { count++; flag3=0; }

И старайтесь не использовать "магические числа".


Точно так! :) Спасибо! Без магических чисел тоже не удалось... Сейчас во всем разберусь что к чему!

Re: Помогите опросить кнопку

Пн май 04, 2015 22:06:41

Вообще, тут концептуально неправильно. надо считать все 3 кнопки сразу, а потом уже производить с ними действия. А дребезг подавить - так это просто считывать надо с интервалом не менее 10мс и соответственно тогда же проводить разбор состояний.

Re: Помогите опросить кнопку

Вт июн 02, 2015 23:04:46

Может не в кассу - но задержка и всего 10 ms - это "коряво" и мало.
Коряво - зачем стопорить "работу" для обработки дребезга.
Мало - дребезг величина не постоянная и со временем будет только увеличиваться - износ, брак, китай.
Сам боролся с этой проблемой - встречал дребезги и до 250ms - на "заюзанных" кнопках - но 250 это не 10 и на четверть секунды стопорить МК не дело (хотя зависит от задач).

Re: Помогите опросить кнопку

Ср июн 03, 2015 20:16:39

Нет, это как раз в самый раз. А от кнопок с дребезгом больше 10мс надо избавляться - это уже не дребезг а банально плохой контакт.
Ситуация конечно разной бывает, и не от всех кнопок можно избавится но это исключения.

Re: Помогите опросить кнопку

Чт июн 04, 2015 18:28:10

Alexeyslav писал(а):Нет, это как раз в самый раз. А от кнопок с дребезгом больше 10мс надо избавляться - это уже не дребезг а банально плохой контакт.
Ситуация конечно разной бывает, и не от всех кнопок можно избавится но это исключения.


Я со всем согласен кроме одного.
а) устройство должно работать, а не пребывать на "замене кнопок"
b) даже если кнопка показывала нормальные показатели по дребезгу при сборке - никто не гарантирует что "завра" они будут такими же, особенно на "китае" (имхо 90% того что продают в массы)
Вывод - вопрос надо решать кардинально - 150-250 ms это намного меньше чем частота нажатий на кнопку среднестатистического девайса, но значительно для выполняемых контролером задач - значит можно организовывать "антидребезг" исходя из этих параметров, но по другому алгоритму - в результате больше устойчивость к износу и меньше зависимость от качества "китая". В идеале надо к программному "антидребезгу" добавить еще и "хардварный" :)

Re: Помогите опросить кнопку

Чт июн 04, 2015 21:14:52

хардварный - это просто лишние детали. 200мс на реакцию на нажатие? Выбросить и больше никогда не брать эти кнопки.
Откуда берутся такие кнопки? Всё очень просто - ИХ ПОКУПАЮТ. Не надо покупать плохие кнопки, и китай перестанет их делать.

Re: Помогите опросить кнопку

Пт июн 05, 2015 08:14:05

Alexeyslav писал(а):хардварный - это просто лишние детали. 200мс на реакцию на нажатие? Выбросить и больше никогда не брать эти кнопки.
Откуда берутся такие кнопки? Всё очень просто - ИХ ПОКУПАЮТ. Не надо покупать плохие кнопки, и китай перестанет их делать.


Легко сказать не покупать :), только тяжело сделать - когда собирал одно устройство - подходящие мне кнопки нашел только в "китае" по почте и у дилера Швецаркой компании - первом случаи стоимость кнопки получалась $2 во втором случаи $43 - качество тоже было пропорционально цене :) - только в устройстве 24 кнопки - 24*$43=$1032 как то многовато для "ручной поделки" что бы не покупать "китайских кнопок" и не "заморачивать" с антидребезгом для них - Вам не кажется :)

Re: Помогите опросить кнопку

Сб июн 06, 2015 19:54:28

kobaltd писал(а): стоимость кнопки получалась $2 во втором случаи $43 - качество тоже было пропорционально цене :)


Они что - золотые с бриллиантовыми толкателями? А если "пропорционально цене", то та, что за $43, не только замыкает цепь, но еще и варит кофе и поет "Алеет восток" ? Вполне нормальные кнопки - на $1 горсть.

Re: Помогите опросить кнопку

Сб июн 06, 2015 21:12:57

Это мы тут представляем себе кнопочки 5x5мм, а на самом деле кнопки есть довольно громоздкие, например для пульта от подъемника, аварийного отключения, вандалоустойчивые и т.д. такая запросто может стоить 40$ только непонятно нафига такие кнопки напрямую к МК подключать.

Re: Помогите опросить кнопку

Сб июн 06, 2015 22:23:33

Alexeyslav писал(а):Это мы тут представляем себе кнопочки 5x5мм, а на самом деле кнопки есть довольно громоздкие, например для пульта от подъемника, аварийного отключения, вандалоустойчивые и т.д. такая запросто может стоить 40$ только непонятно нафига такие кнопки напрямую к МК подключать.


Есть и еще дороже - допустим кнопки с Led дисплеем - они вообще заоблачные. но вкратце человек прав это не 6*6/12*12 и из этой серии - это кнопки с "большим ходом" - в одном корпусе сама кнопка, "колпачок", направляющая хода, светодиод, защита для вставки, размеры кнопки 20*20*40 мм. (нужны были такие для пульта - типа как у телевизионщиков) - так вот 1 нормальная такая кнопка у допустим OAE (просьба не считать за рекламу) компании начинается от $15, а дальше зависит от того что в нее напихаешь (по типу конструктора) - китайский аналог в полном сборе 2-3$. У фирменной (взял для пробы) на 100 нажатий 2-3 дребезга с интервалом 5-15 микросекунд, у "китая" от 50 микро до 150 мили и в среднем на 100 нажатий 500-600 колебаний - это я имел в виду когда говорил про качество и цену.

Re: Помогите опросить кнопку

Вс июн 07, 2015 03:11:51

Как на счёт такой идеи опроса кнопок. По таймеру раз в эн миллисекунд опрашиваем кнопки. Если кнопка нажата, то инкрементируем соответствующую переменную, если отпущена, то сбрасываем её в ноль. Когда переменная дотикивает до порогового значения, считаем, что кнопка нажата. Можно сделать флаг нажатости кнопки и аналогичную процедуру провести для переключения из нажатого состояния в отпущенное. Какие могут быть проблемы у этого алгоритма?

Re: Помогите опросить кнопку

Вс июн 07, 2015 09:41:20

Только избыточность. Инкрементировать ничего не нужно, сам опрос каждые N милисекунд избавляет от дребезга контактов. Главное в самой процедуре обработки не считывать значение несколько раз иначе будут проблемы.
Дополнительная защита в виде описанного алгоритма нужна только если кнопки совсем ненадёжны и у них уже не дребезг а наблюдается ненадежный контакт.

Re: Помогите опросить кнопку

Вс июн 07, 2015 10:08:57

Понятно, спасибо.

Re: Помогите опросить кнопку

Вс июн 07, 2015 10:28:02

Alexeyslav писал(а):Только избыточность. Инкрементировать ничего не нужно, сам опрос каждые N милисекунд избавляет от дребезга контактов. Главное в самой процедуре обработки не считывать значение несколько раз иначе будут проблемы.
Дополнительная защита в виде описанного алгоритма нужна только если кнопки совсем ненадёжны и у них уже не дребезг а наблюдается ненадежный контакт.


1) если уж делаете "задержку" то ее надо делать и на "отпускание" - при этом тоже есть дребезг, а за частую он даже сильнее - не сделав рано или поздно получите "ложное нажатие" без нажатия.
2) алгоритм с delay() перепишите на millis(), на 2 переменных больше, но не стопориться работа контроллера хотя бы и позволяет обрабатывать "разболтанные кнопки" без ущерба для работы основного алгоритма прошивки.

Re: Помогите опросить кнопку

Вс июн 07, 2015 11:28:23

А при отпускании счетчик не досчитает до надежного срабатывания и срабатывание не будет засчитано. А если обойтись простым считыванием через интервал(кстати где там было упоминание про delay?) то такой антидребезг одинаково работает как на нажатие так и отпускание.

Re: Помогите опросить кнопку

Пн июн 08, 2015 08:17:58

B@R5uk писал(а): Какие могут быть проблемы у этого алгоритма?


Да никаких :) Почти точная цитата из моего ответа ( только слегка ухудшенная :) )
viewtopic.php?f=57&t=97334&p=2390774#p2390774

Re: Помогите опросить кнопку

Вт июн 09, 2015 10:27:39

B@R5uk писал(а):Какие могут быть проблемы у этого алгоритма?
Никаких... только плюсы...
Это самое надежное общение с кнопкой... я такой алгоритм использую уже лет 15...
http://asis-kbr.ru/forum/viewtopic.php? ... p=301#p301

Re: Помогите опросить кнопку

Вт июн 09, 2015 16:42:44

Jack_A писал(а):Почти точная цитата из моего ответа
Jack_A писал(а):Ну если прерывание - сложно, то м. быть сделать аппаратный антидребезг ? Цена вопроса - 1 корпус триггеров Шмитта.
Изображение
Кстати, триггеры Шмитта по цифровым входам есть в самом AVR, так что достаточно двух резисторов и конденсатора. А если использовать внутренний подтягивающий резистор, то можно аппаратный антидребезг сделать на двух внешних деталях: резисторе и конденсаторе. Только на подтягивающие резисторы допуск большой: 20...50 kΩ. Но с учётом того, что дребезг тоже не особо то нормирован, не думаю, что это страшно.

Жаль в даташите не написали пороги срабатывания внутреннего триггера Шмитта.

Re: Помогите опросить кнопку

Вт июн 09, 2015 19:50:37

Эта схема не спасает от дребезга. может быть, уменьшает количество импульсов но до конца не спасает от дребезга. И в таком варианте кнопка подгорает несколько быстрее чем обычно.

Re: Помогите опросить кнопку

Вт июн 09, 2015 21:24:27

В даташите на ATmega8A в разделе 28.8 Pin Thresholds and Hysteresis на страницах 253, 254 нашёл графики зависимостей напряжений срабатываний и гистерезиса от напряжения питания при различных температурах. Для питания 5 вольт напряжение срабатывания ≈2,6 вольт, а гистерезис всего 0,44 мВ. Как-то очень мало для гистерезиса. Без нормального триггера действительно не взлетит.

Вообще, длительность дребезга гарантированно блокируемого RC-цепочкой можно посчитать так:

Δt = τ ln [ (Vcc - V1) / (Vcc - V2) ]

где т — постоянная времени RC-цепочки, Vcc — напряжение питания, а V1 и V2 — нижнее и верхнее напряжения срабатывания триггера Шмитта. Эта формула для наихудшего случая, когда первое срабатывание кнопки не успело разрядить конденсатор полностью.

Для sn74hc14 этот логарифм в худшем и в обычном случаях равен соответственно:

ln [ 1 + 0,4 / (4,5 - 1,55) ] = 0,127
ln [ 1 + 0,9 / (4,5 - 2,5) ] = 0,37

Чтобы гарантированно заблокировать дребезг длительностью 100 мс нужна пара ёмкость-сопротивление 40 мкФ - 20 кОм.

Если считать, что конденсатор успевает разрядится до нуля, то формула будет такой:

Δt = - τ ln [ 1 - V2 / Vcc ]

Для sn74hc14 получается

- ln [ 1 - 1,55 / 4,5 ] = 0,42
- ln [ 1 - 2,5 / 4,5 ] = 1,56

В разы лучше, но 100 мс гасить всё так же нереально.
Последний раз редактировалось B@R5uk Вт июн 09, 2015 21:33:19, всего редактировалось 1 раз.
Ответить