17.11.2020, 17:29
|
|
Почётный гражданин KAZUS.RU
Регистрация: 15.11.2010
Сообщений: 2,379
Сказал спасибо: 338
Сказали Спасибо 328 раз(а) в 253 сообщении(ях)
|
Re: многозадачный таймер на millis для Ардуино
Сообщение от ProtAS-13
|
Здесь ЭЛЕМЕНТАРНАЯ алгоритмическая ошибка.
|
А где алгоритм, представленный ТС? По криво вставленному коду реверсировать алгоритм мало кто возьмётся.
Сообщение от dgrishin
|
надо учитывать отрицательные числа тоже.
|
не надо. У него беззнаковые переменные. Системный таймер также беззнаковый.
Сообщение от ProtAS-13
|
Когда сработает ветка со вторым if, если первая if ветка всегда выполняется первой?
|
лично мне вообще без разницы, что, когда и где выполнится или не выполнится. Сказано же: ардурины здесь нет.
|
|
|
|
17.11.2020, 18:05
|
|
Заблокирован
Регистрация: 07.09.2014
Адрес: В Кремле!
Сообщений: 4,486
Сказал спасибо: 396
Сказали Спасибо 2,220 раз(а) в 1,319 сообщении(ях)
|
Re: многозадачный таймер на millis для Ардуино
Сообщение от ProtAS-13
|
Исчерпывающий ответ
|
Я всё объяснил раньше. Если вы не понимаете, что такое декремент, то это не мои проблемы.
Протас как всегда - ничего не понял, но понтов нагнал много, а результат - пшик и пук. Он просто никогда не делал программные таймеры, потому и не понимает, как это делается.
Если опираться на значение системного тика, то он имеет свойство переполняться через некоторый интервал времени. К тому же, для циклических таймеров вообще это излишне - в каждом цикле вычислять приращение систиков, а в каждом систике вычислять разницу между целевым и текущим значениями.
Гораздо эффективнее заводить таймер с обратным отсчетом, который при каждом системном тике будет уменьшаться на 1 до 0. Это и обрабатывается быстрее, и позволяет легко перезапускать цикл счета, записывая стартовое значение после окончания декрементов.
Абсолютно ничего сложного, безопасно от переполнения счетчика систиков, да и алгоритмически верно.
Последний раз редактировалось NewWriter; 17.11.2020 в 18:44.
|
|
|
|
17.11.2020, 19:24
|
|
Почётный гражданин KAZUS.RU
Регистрация: 12.02.2013
Сообщений: 1,045
Сказал спасибо: 43
Сказали Спасибо 273 раз(а) в 214 сообщении(ях)
|
Re: многозадачный таймер на millis для Ардуино
Сообщение от NewWriter
|
Если опираться на значение системного тика, то он имеет свойство переполняться через некоторый интервал времени.
|
У Ардуино все интереснее - функция возвращает время в мс с момента старта системы. И у нее периодичность около 50 дней. То есть если время работы системы меньше 50 дней - то на переполнение можно забить, а если больше и про эту фичу не вспомнить - то через 50 дней можно получить непредсказуемый результат.
|
|
|
|
17.11.2020, 19:44
|
|
Заблокирован
Регистрация: 07.09.2014
Адрес: В Кремле!
Сообщений: 4,486
Сказал спасибо: 396
Сказали Спасибо 2,220 раз(а) в 1,319 сообщении(ях)
|
Re: многозадачный таймер на millis для Ардуино
Даже если так, то всё равно, вычисление приращения многобайтного систика на 8-битной системе гораздо тормознутее работает, нежели декрементный счет таймера. И это особенно актуально на ардуйне. Впрочем, ардуйня - она потому и ардуйня, что никто не думает за быстродействие.
|
|
|
|
17.11.2020, 20:32
|
|
Прописка
Регистрация: 17.03.2015
Сообщений: 296
Сказал спасибо: 0
Сказали Спасибо 220 раз(а) в 126 сообщении(ях)
|
Re: многозадачный таймер на millis для Ардуино
Сообщение от NewWriter
|
Протас как всегда - ничего не понял, но понтов нагнал много, а результат - пшик и пук. Он просто никогда не делал программные таймеры, потому и не понимает, как это делается.
|
Каюсь. Я действительно не понял.
Не понял как Вы вообще пишете код?
Так и представляю в ваших "творениях" гроздья ПОСЛЕДОВАТЕЛЬНО расположенных операторов if, выполняющих проверку ОДНОГО И ТОГО ЖЕ условия.
Простите, что вмешался в спор "продвинутых", я бы даже сказал - "альтернативно продвинутых"
|
|
|
|
17.11.2020, 20:51
|
|
Заблокирован
Регистрация: 07.09.2014
Адрес: В Кремле!
Сообщений: 4,486
Сказал спасибо: 396
Сказали Спасибо 2,220 раз(а) в 1,319 сообщении(ях)
|
Re: многозадачный таймер на millis для Ардуино
ProtAS-13, то, что вы навоображали себе, не имеет отношения к действительности. Вы никогда не использовали программные таймеры на основе одного системного, потому для вас вообще сложно понять алгоритм работы декрементных счетчиков.
Я не разбирал творения топикстартера, поскольку незачем его разбирать. Есть другой вариант, гораздо более экономичный. У вас просто мозгов не хватает, чтобы увидеть его. Протас, разберитесь с декрементными таймерами - и вам всё станет понятно, что и как работает, и что там нет ничего такого, над чем у вас, Протас, тут возникли сложности.
Последний раз редактировалось NewWriter; 17.11.2020 в 21:01.
|
|
|
|
17.11.2020, 21:11
|
|
Прописка
Регистрация: 17.03.2015
Сообщений: 296
Сказал спасибо: 0
Сказали Спасибо 220 раз(а) в 126 сообщении(ях)
|
Re: многозадачный таймер на millis для Ардуино
Сообщение от NewWriter
|
Я не разбирал творения топикстартера, поскольку незачем его разбирать. Есть другой вариант, гораздо более экономичный.
|
Сорри за офтоп.
Цитата:
|
Американский форум:
- здравствуйте, где можно купить яблок?
- в магазине "Трейдер Джойс"
- можно заказать он-лайн вот на этом сайте
...
"продвинутый" форум:
- здравствуйте, где можно купить яблок?
- а зачем вам яблоки?
- не понимаю, зачем вам яблоки, когда полно отличных груш
...
|
|
|
|
|
17.11.2020, 21:49
|
|
Почётный гражданин KAZUS.RU
Регистрация: 12.02.2013
Сообщений: 1,045
Сказал спасибо: 43
Сказали Спасибо 273 раз(а) в 214 сообщении(ях)
|
Re: многозадачный таймер на millis для Ардуино
Если вы очень хотите помигать 4-мя разными светодиодами с разной частотой - то вот как это должно выглядеть.
unsigned long Start_Timer0, Start_Timer1, Start_Timer2, Start_Timer3, Current_Timer;
unsigned lowHIGH_0 = 0; // текущее состояни пина.
void setup()
{
pinMode(2, OUTPUT);// выход
pinMode(3, OUTPUT);// выход
pinMode(4, OUTPUT);// выход
pinMode(5, OUTPUT);// выход
Start_Timer0 = millis();
Start_Timer1 = Start_Timer0;
Start_Timer2 = Start_Timer0;
Start_Timer3 = Start_Timer0;
}
void loop()
{
Current_Timer_ms = millis(); // function calls only one time per loop() call
if (Current_Timer_ms - Start_Time0 = 3000) {Start_Timer0 = Current_Timer_ms;
if(lowHIGH_0 == 0) digitalWrite(2, LOW);
else digitalWrite(2, HIGH);
lowHIGH_0 ^= 1;
}
/////////////////////////////////////////////////////////////////////////////////
// для timer1, timer2 and timer3 - аналогично
////////////////////////////////////////////////////////////////////////////////
}
Но проблема периода 50 дней здесь не учитывается.
|
|
|
Сказали "Спасибо" dgrishin
|
|
|
17.11.2020, 22:47
|
|
Частый гость
Регистрация: 07.11.2019
Сообщений: 15
Сказал спасибо: 6
Сказали Спасибо 1 раз в 1 сообщении
|
Re: многозадачный таймер на millis для Ардуино
спасибо я нашел пример по нему сделал макетный вариант код изменил значительно , тема с декрементами интересна еще не изучал это , просто у меня задача в программе заменить задержки delay на millis что бы не тормозили код в цикле , но я смотрю там настолько заморочено и приходиться усложнять код и использовать больше ресурсов Ардуино что в худшем варианте может и оставлю delay ну будут датчики опрашиваться не постоянно а раз в 15 сек
|
|
|
|
17.11.2020, 22:59
|
|
Частый гость
Регистрация: 07.11.2019
Сообщений: 15
Сказал спасибо: 6
Сказали Спасибо 1 раз в 1 сообщении
|
Re: многозадачный таймер на millis для Ардуино
со светодиодами это просто макетный вариант для проверки как это все работает , основная задача при выполнении определенных условий в программе сделать нужную задержку и исполнить код вот и все , задержи будут : секунды , минуты , часы . по истечении 50 суток обнулиться счетчик думаю на мои задержки не должен повлиять хотя нужно все проверять , программа должна работать 7 мес в году все таки отопительный котел
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 16:46.
|
|