Изобретаем свой велосипед. (Ещё одна реализация защиты от дребезга)

Kakmyc
Offline
Зарегистрирован: 15.01.2018

Почему то все предлагаемые варианты меня не устроили. Решил придумать что то свое.
Привязал задержку к количеству циклов loop()
Получилось следующее.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Не понял, ещё одна защита? А то я уже две вижу :)

Kakmyc
Offline
Зарегистрирован: 15.01.2018

int X=0;
boolean SB1;
void setup(){}
void loop(){
if (digitalRead(4)==(HIGH)) {if (X<=2000){X++;}}
else {X=0;}
if (X>=20){SB1=(HIGH);} else {SB1=(LOW);}
}

Kakmyc
Offline
Зарегистрирован: 15.01.2018

2000 циклов(конкретно этого скетча) дают приблизительно 22мс.
Ограничил размер переменной, иначе она достигает максимума и падает в ноль.

Клапауций 089
Клапауций 089 аватар
Offline
Зарегистрирован: 14.01.2018

Kakmyc пишет:
2000 циклов(конкретно этого скетча) дают приблизительно 22мс. Ограничил размер переменной, иначе она достигает максимума и падает в ноль.

а, теперь добавь в код печать в индикатор lcd.print(число циклов); и обрадуй нас временем исполнения 2000 циклов. О_О

Kakmyc
Offline
Зарегистрирован: 15.01.2018

Картинку не знаю как вставить, а так дал бы сигнал с осциллографа

Клапауций 089
Клапауций 089 аватар
Offline
Зарегистрирован: 14.01.2018

Kakmyc пишет:
Картинку не знаю как вставить, а так дал бы сигнал с осциллографа

опиши в тексте - у меня богатая фонтазия.

Lion777
Offline
Зарегистрирован: 20.05.2016

дальше(ниже) кода защиты от дребезга код можно писать или это только для кнопочки ? )))

Клапауций 089
Клапауций 089 аватар
Offline
Зарегистрирован: 14.01.2018

Lion777 пишет:

дальше(ниже) кода защиты от дребезга код можно писать или это только для кнопочки ? )))

ниже кода защиты от дребезга нужно писать функцию, вычисляющую оптимальное количество циклов проверки состояния кнопки от времени исполнения кода, иначе время отклика кнопки будет непредстказуемо.

О_О

Клапауций 089
Клапауций 089 аватар
Offline
Зарегистрирован: 14.01.2018

ок. в пень глумёж - сначала:

Kakmyc пишет:
Привязал задержку к количеству циклов loop()

наводящий вопрос:
в чём принципиальное отличие методов?:
- проверять состояние кнопки в течении определённого времени.
от
- проверять состояние кнопки в течении определённого количества циклов.
 
не закрадывается ли у ТС подозрение, что два метода аналогичны по сути и результату?

 

Kakmyc
Offline
Зарегистрирован: 15.01.2018

Клапауций 089 пишет:

ок. в пень глумёж - сначала:

Kakmyc пишет:
Привязал задержку к количеству циклов loop()

наводящий вопрос:
в чём принципиальное отличие методов?:
- проверять состояние кнопки в течении определённого времени.
от
- проверять состояние кнопки в течении определённого количества циклов.
 
не закрадывается ли у ТС подозрение, что два метода аналогичны по сути и результату?

 

А ты не видишь разницы, между проверкой и вычислением в каждом цикле чисел unsigned long() и int() ?

b707
Offline
Зарегистрирован: 26.05.2017

Клапауций 089 пишет:

наводящий вопрос:
в чём принципиальное отличие методов?:
- проверять состояние кнопки в течении определённого времени.
от
- проверять состояние кнопки в течении определённого количества циклов.
 
не закрадывается ли у ТС подозрение, что два метода аналогичны по сути и результату?

 

нет, не аналогичны. Метод ТС зависит от продолжительности цикла ЛУП, а значит при любом изменении кода  задержки антидребезга будут требовать корректировки. Классический метод через миилис значительно удобнее.

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

nik182
Offline
Зарегистрирован: 04.05.2015

O!!! Супер! Побежал вставлять в свои проекты седьмую строчку. Правильно ли я понимаю, что после двадцатого круга лупа при нажатой кнопке каждый цикл будет выдавать TRUE ?  Подскажите как можно это использовать?

b707
Offline
Зарегистрирован: 26.05.2017

nik182 пишет:

 Подскажите как можно это использовать?

только при покупке лицензии. Купить можно у меня, ежегодное продление со скидкой 20%.

Клапауций 089
Клапауций 089 аватар
Offline
Зарегистрирован: 14.01.2018

Kakmyc пишет:
А ты не видишь разницы, между проверкой и вычислением в каждом цикле чисел unsigned long() и int() ?

пока я вижу непредсказуемость времени отклика кнопки.

ок. тогда, поделись профитом невычисления в каждом цикле чисел unsigned long - где и что ты выигрываешь?

Kakmyc
Offline
Зарегистрирован: 15.01.2018

Кстати int() тут даже избыточен, достаточно short().
Память и процессорное время беречь надо.

b707
Offline
Зарегистрирован: 26.05.2017

Клапауций 089 пишет:

ок. тогда, поделись профитом невычисления в каждом цикле чисел unsigned long - где и что ты выигрываешь?

как что? - несколько тиков процессора на каждом обороте. Они позволят более эффективно крутить цикл ФОР 2000 раз, пока ждем кнопку :)

Клапауций 089
Клапауций 089 аватар
Offline
Зарегистрирован: 14.01.2018

b707 пишет:

нет, не аналогичны. Метод ТС зависит от продолжительности цикла ЛУП, а значит при любом изменении кода  задержки антидребезга будут требовать корректировки. Классический метод через миилис значительно удобнее.

это уже технические мелочи - мы напишем функцию производную количества циклов от времени исполнения кода и всё будем пучком. :D

b707
Offline
Зарегистрирован: 26.05.2017

Клапауций 089 пишет:

это уже технические мелочи - мы напишем функцию производную количества циклов от времени исполнения кода и всё будем пучком. :D

будем калибровать длительность ЛУП прямо в коде? - блестящая идея

Клапауций 089
Клапауций 089 аватар
Offline
Зарегистрирован: 14.01.2018

Kakmyc пишет:
Память и процессорное время беречь надо.

для кого беречь?

ты процессорное время и память по наследству потомкам передашь? О_О

b707
Offline
Зарегистрирован: 26.05.2017

Клапауций 089 пишет:

ты память по наследству потомкам передашь? О_О

чтобы сохранить память в пожилом возрасте, ее не беречь надо, а тренировать :)

Клапауций 089
Клапауций 089 аватар
Offline
Зарегистрирован: 14.01.2018

b707 пишет:

будем калибровать длительность ЛУП прямо в коде? - блестящая идея

будем измерять время луп и считать оптимальное количество циклов.

а, кто обещал, что будет легко?

b707
Offline
Зарегистрирован: 26.05.2017

ТС, если без глума - фигню предлагаете. Такие "костыли" вместо задержек обычно новички придымывают от неспособности понять работу миллис()

Kakmyc
Offline
Зарегистрирован: 15.01.2018

b707 пишет:

Клапауций 089 пишет:

это уже технические мелочи - мы напишем функцию производную количества циклов от времени исполнения кода и всё будем пучком. :D

будем калибровать длительность ЛУП прямо в коде? - блестящая идея

Ничего там калибровать не надо.
В том то и разница , что точные вычисления нам тут совсем не нужны. Я думаю и 5 и 10 циклов, уже будет являться защитой. Но задал с запасом. Уменьшенное с 2000 до 100, и работоспособность не изменится. Код спокойно обрабатывает дребезг, проверено осцилографом , подключались два щупа и сравнивались результаты.
Да куда как проще взять готовую библиотеку и использовать ее. Но во первых она занимает больше памяти и замедляет быстродействие.

И это походу из за таких как Клапуций у меня страница в хроме 200мб весит.

evgta
Offline
Зарегистрирован: 02.09.2016

Клапауций 089 пишет:

b707 пишет:

будем калибровать длительность ЛУП прямо в коде? - блестящая идея

будем измерять время луп и считать оптимальное количество циклов.

а, кто обещал, что будет легко?

Шикарно 

Клапауций 089
Клапауций 089 аватар
Offline
Зарегистрирован: 14.01.2018

b707 пишет:

ТС, если без глума - фигню предлагаете. Такие "костыли" вместо задержек обычно новички придымывают от неспособности понять работу миллис()

зря ты на ТС наезжаешь - вот здесь https://hackaday.com/2015/12/10/embed-with-elliot-debounce-your-noisy-bu... вумные люди с академическим образованием считают, что сей метод - лучший. там они битами рулят, но не суть. 

Клапауций 089
Клапауций 089 аватар
Offline
Зарегистрирован: 14.01.2018

Kakmyc пишет:
Да куда как проще взять готовую библиотеку и использовать ее. Но во первых она занимает больше памяти и замедляет быстродействие. И это походу из за таких как Клапуций у меня страница в хроме 200мб весит.

я знал, что всё зло от библиотек и Клапауциев. О_О

Kakmyc
Offline
Зарегистрирован: 15.01.2018

b707 пишет:

ТС, если без глума - фигню предлагаете. Такие "костыли" вместо задержек обычно новички придымывают от неспособности понять работу миллис()

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

b707
Offline
Зарегистрирован: 26.05.2017

Клапауций 089 пишет:

зря ты на ТС наезжаешь - вот здесь https://hackaday.com/2015/12/10/embed-with-elliot-debounce-your-noisy-bu... вумные люди с академическим образованием считают, что сей метод - лучший. там они битами рулят, но не суть. 

Интересно. Но смысл-то там совсем не в счетчике циклов - счетчик там в тексте вообще не обсуждают - а в хранении историй считывания кнопки в сдвигаемом битовом поле.  Это очень интересный подход. А интервалы можно и нужно отсчитывать с помощью миллис - в том числе и в том коде, что по ссылке.

Клапауций 089
Клапауций 089 аватар
Offline
Зарегистрирован: 14.01.2018

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

никто же и не спорит, что твой метод рабочий.

проблема в том, что твой метод требует ручной оптимизации под время исполнения кода.

а, когда ты захочешь плюшек настройки времени отклика кнопки, прочих производных состояния кнопки по времени - тебе придётся оперировать числами unsigned long.

b707
Offline
Зарегистрирован: 26.05.2017

Kakmyc пишет:
Ну да это же сложно понять, как присвоить переменной значение текущего времени, а потом раз в цикл вычитать из него значение текущего времени, до тех пор пока условие не сойдется. Итого, каждый цикл мы оперируем большими числами там, где достаточно двух байт или даже одного .

На соревнованиях вместо секундомера тоже можно просто считать "Раз, два, три...". Немного потренироваться и отсчеты будут получаться вполне равномерынми и точными.  А судьи зачем-то пользуются сложными приборами, где можно обойтись своим разумом и здравым смыслом :)

Клапауций 089
Клапауций 089 аватар
Offline
Зарегистрирован: 14.01.2018

b707 пишет:

Интересно. Но смысл-то там совсем не в счетчике циклов - счетчик там в тексте вообще не обсуждают - а в хранении историй считывания кнопки в сдвигаемом битовом поле.  Это очень интересный подход. А интервалы можно и нужно отсчитывать с помощью миллис - в том числе и в том коде, что по ссылке.

в том то и дело, когда начнёшь отсчитывать интервалы с помощью миллис, все преимущества хранения состояний кнопки в счётчике или битовом поле теряют смысл - их съедают накладные расходы операций с миллис.

evgta
Offline
Зарегистрирован: 02.09.2016

а если программа в зависимости от события в любое произвольное время преходит в фунция и шлет что-нибуть в сериал(на дисплей, делает замер чего-нибудь)

то как быть?

Kakmyc
Offline
Зарегистрирован: 15.01.2018

evgta пишет:

а если программа в зависимости от события в любое произвольное время преходит в фунция и шлет что-нибуть в сериал(на дисплей, делает замер чего-нибудь)

то как быть?

Ну значит на проверку дребезга будет в эти моменты уходить не 20-30 мсек а 30-60. Критично ?

Kakmyc
Offline
Зарегистрирован: 15.01.2018

Kakmyc пишет:
evgta пишет:

а если программа в зависимости от события в любое произвольное время преходит в фунция и шлет что-нибуть в сериал(на дисплей, делает замер чего-нибудь)

то как быть?

Ну значит на проверку дребезга будет в эти моменты уходить не 20-30 мсек а 30-60. Критично ?
Да даже полсекунды не критично.

b707
Offline
Зарегистрирован: 26.05.2017

Клапауций 089 пишет:

в том то и дело, когда начнёшь отсчитывать интервалы с помощью миллис, все преимущества хранения состояний кнопки в счётчике или битовом поле теряют смысл - их съедают накладные расходы операций с миллис.

а кто сказал, что все это затеяно ради ускорения работы? там в тексте, вообще-то, совсем другие "преимущества" обсудаются -

Wow, that’s simple — the entire routine just checks to see if button_historyis. Detecting a release is then a test for 0b10000000and the up and down states are 0b00000000and 0b11111111respectively. The memory overhead is small, all of the functions are essentially one-liners, and the update and test functions are separable. There’s no need to keep track of what state the button is in, or so it seems, because 0b01111111already contains the notion of a state change between unpressed and pressed. And it works surprisingly well.

Kakmyc
Offline
Зарегистрирован: 15.01.2018

Пролистал статью по ссылке.
Пендосы вполне себе обошлись одним байтом.
Мне есть куда расти :-).

b707
Offline
Зарегистрирован: 26.05.2017

Kakmyc пишет:

 Ну значит на проверку дребезга будет в эти моменты уходить не 20-30 мсек а 30-60. Критично ? Да даже полсекунды не критично.

к чему тогда рассуждения о экономии процессорного времени, если, как выясняется. даже полсекунды не критично ? :)))))))))

b707
Offline
Зарегистрирован: 26.05.2017

Kakmyc пишет:
Пролистал статью по ссылке. Пендосы вполне себе обошлись одним байтом. Мне есть куда расти :-).

вы просто не поняли, о чем они пишут.... Сходство с вашей "идеей" лишь внешнее, и оно обманчиво :)

Kakmyc
Offline
Зарегистрирован: 15.01.2018

Не критичны полсекунды, которые ты на кнопку давишь. И это так, утрировал. Но согласись, что когда ты нажимаешь на кнопку, не важно 20 или 50мсек проверяется дребезг , ты разницы не почувствуешь.

Клапауций 089
Клапауций 089 аватар
Offline
Зарегистрирован: 14.01.2018

b707 пишет:

а кто сказал, что все это затеяно ради ускорения работы? там в тексте, вообще-то, совсем другие "преимущества" обсудаются -

та, да - не корысти ради, а токмо во исполнение воли пославшей мя жены. О_О

кроме эмоций о внезапно открывшемся методе хранения информации в битах - никаких преимуществ не увидел.

а, недостатков - вагон и маленькая тележка.

b707
Offline
Зарегистрирован: 26.05.2017

Клапауций 089 пишет:

кроме эмоций о внезапно открывшемся методе хранения информации в битах - никаких преимуществ не увидел.

а, недостатков - вагон и маленькая тележка.

зря ты так, некая новизна присутсвует.

А какие недостатки?

Клапауций 089
Клапауций 089 аватар
Offline
Зарегистрирован: 14.01.2018

b707 пишет:

А какие недостатки?

лично я считаю недостатком, когда метод вызывает больше вопросов, чем даёт ответов.

так:
1. откуда известно, что нужно проверять состояние кнопки 8-16-32, а не 2000(как это делает ТС :D) раз?
2. почему событием нажатия является 0b01111111, если вслед может получится 0b11111110? событие нажатия без состояния нажатия?
3. время и метод тактирования кнопки, когда время исполнения кода более времени тактирования?
4. история с шумящей кнопкой и метод фильтрации ея шума - вообще, гон.
Клапауций 089
Клапауций 089 аватар
Offline
Зарегистрирован: 14.01.2018

Kakmyc пишет:
Пролистал статью по ссылке. Пендосы вполне себе обошлись одним байтом. Мне есть куда расти :-).

дело за малым - воткнуть результат 2000 опросов в один байт. О_О

Клапауций 089
Клапауций 089 аватар
Offline
Зарегистрирован: 14.01.2018

дабы ТС ещё чего не переизобрёл - программная эмуляция конденсатора на пине кнопки.

http://www.kennethkuhn.com/electronics/debounce.c

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Kakmyc пишет:
Кстати int() тут даже избыточен, достаточно short(). Память и процессорное время беречь надо.

Позвольте узнать, сколько "памяти и процессорного времени" сбережётся, если все, какие бывают в скетчах int'ы заменить на short'ы? Ну вот на одну замену сколько сэкономиться? Или на десять замен?

Клапауций 089
Клапауций 089 аватар
Offline
Зарегистрирован: 14.01.2018

ЕвгенийП пишет:

если все, какие бывают в скетчах int'ы заменить на short'ы?

долой полумеры! - заменяем все переменные на биты.

Похожее изображение

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Точно. А еще можно биты в полубиты. Один бит в LOW, а другой в HIGH.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

qwone пишет:

Точно. А еще можно биты в полубиты. Один бит в LOW, а другой в HIGH.

Ну, уж нет! Это милитаризм какой-то! Одни вон такие неделимый атом разщепили, Хиросиме с Припятью до сих пор аукается. Так что ращеплять неделимые биты мы всяким тут безответсвенным экспериментаторам позволить не могём!

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Ну боды расщепили. Почему бит нельзя разщипить. А то что Терминаторы всякие заведутся, ну такова судьба человечества.Пожили и хватит.

Logik
Offline
Зарегистрирован: 05.08.2014

Kakmyc пишет:
b707 пишет:

ТС, если без глума - фигню предлагаете. Такие "костыли" вместо задержек обычно новички придымывают от неспособности понять работу миллис()

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

А зачем это оперировать большими числами?! Интервал на миллисе отлично делается на шорте или  байте. Дето так например по 20мсек интервальчик.

void loop(void)
{
  static byte OldTime;
  byte Time;  
  
  Time=millis();

  if(byte(Time-OldTime)>20)
  {
.....

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