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

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

Logik пишет:

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

да! а, если не начнёте - то, Логик кааак опубликует взрослый код и все дети заплачут в ужосе от вида этих гениталий.

*Логик, когда опубликуешь обещанное? - у меня новую упаковку памперсов шашель уже съела.

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

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

*Логик, когда опубликуешь обещанное? - у меня новую упаковку памперсов шашель уже съела.

Вот чего ты на форуме то сцыкнеш, то обосрешся. Теперь ясно. Шашель.

ПС. Хочеш коду - пиши сюда http://arduino.ru/forumy/ishchu-ispolnitelya

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

Logik пишет:

ПС. Хочеш коду - пиши сюда

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

*где обещанный код, чепуха?! О_О

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

Logik пишет:

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

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

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

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

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

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

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

Поясни, как Time = millis(), ,если одна переменная может иметь максимальное значение 255 а вторая 4294967295 ? Что случится , когда значение millis() превысит 255 ? ( Это произойдет через 1/4 секунды)

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

Logik пишет:

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

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

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

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

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

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

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

Поясни, как Time = millis(), ,если одна переменная может иметь максимальное значение 255 а вторая 4294967295 ? Что случится , когда значение millis() превысит 255 ? ( Это произойдет через 1/4 секунды)

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

Случится переполнение. После 255 пойдет 0 и по кругу.  На форуме есть много тем про переполнение millis(). Почитай, но не спрашивай ;) От того какое "максимальное значение" зависит максимальная длительность интервала, которую можна сформировать таким методом. У тя заявлено чтото порядка 20мсек. Если нужно столько - очевидно байта хватит. Нужно больше  берем инт или лонг. Там тоже переполнение возникает, но реже. От него не уйти но в нем абсолютно ничего плохого нет, алгоритм его проходит без сбоев. Но развивать тему о нем - не советую, сейчас бывалые наваляют по мозгам и вобщем заслужено )))