Несовсем понятен unsigned long
- Войдите на сайт для отправки комментариев
Сб, 08/11/2014 - 19:35
unsigned long timeWait1; //хранители времени unsigned long timeWait2; unsigned long timeWait3; unsigned long time1 = 2;//время срабатывания unsigned long time2 = 20; unsigned long time3 = 70; void setup() { timeWait1=millis();//запоминаем стратовое время timeWait2=millis(); timeWait3=millis(); } void loop() { if (millis() > timeWait1)//через промежуток времени выполняю { program1(); } if (millis() > timeWait2) { program2(); } if (millis() > timeWait3) { program3(); } } void program1() { ... timeWait1=millis()+time1; } void program2() { ... timeWait2=millis()+time2; } void program3() { ... timeWait3=millis()+time3; }
Проблема в том, что такая конструкция работает около 200 циклов. После чего выполняется только program1() . Остальные игнорируются.
Или неправилен алгоритм выполнения (хотя сначала работает) или проблема с типом переменных. Подскажите пожалуйста правильное направление хода мыслей.
Возможно, происходит переполнение и сброс на 0. А так как в переменных timeWait2 и timeWait3 значения превышают значение millis(), потому и не работает!
Возможно, происходит переполнение и сброс на 0.
millis()
Возвращает количество миллисекунд с момента начала выполнения текущей программы на плате Arduino. Это количество сбрасывается на ноль, в следствие переполнения значения, приблизительно через 50 дней.
Правильное направление мыслей - это переходить к отладке с целью выяснения, что же происходит
Для начала можно понаблюдать за ходом выполнения по светодиодам
Ну или код целиком. А то в Ваших ... может, что угодно прятаться.
Правильное направление мыслей - это переходить к отладке с целью выяснения, что же происходит
Для начала можно понаблюдать за ходом выполнения по светодиодам
Я и упустил код, где моргают светодиоды :) По идее, переполнение произойдёт через ~50 дней. Мне столько не нужно. Останавливается через примерно 200 циклв (15-20 сек). Первая программа остаётся работать, а остальные как бы теряют точку времени.
Код программы ещё до конца не отработан, по этому выкладывать его целиком смысла не имеет. Разрабатываю кусками. Упёрся вот в эти ворота.
Выводите в Serial.print() контролируемое и заданное значения, смотрите что изменилось, далее почему изменилось не верно. Как-то так.
Хз, написано синтаксически правильно.
Мне в недрах движка Unreal Engine попался вот такой приём:
То есть в метках времени содержится чистое время, а сравнивается время+delay. Если перевести на wiring, то будет:
Хз, должно работать. Фаза Луны :)
Хз, должно работать. Фаза Луны :)
Проблема решилась непонятным образом. :) Последний редактированный, но не сохранённый скетч, улетел в трубу после пропадания напряжения. Взял предыдущий, дописал чего нехватало и всё заработало.
Спасибо всем кто пытался помочь.
жуть
основы электротехники явно не здавали
а такой баян про положительные длинные числа
шиза
основы электротехники явно не здавали
Смею поинтересоваться, с чего такое заявление?
Хз, должно работать. Фаза Луны :)
Проблему локализовал. Если поставить перед 16 строчкой delay(1), начинаются глюки вплоть до зависания контроллера.Проверка на время ( 4 строчка) какую либо роль играть перестаёт.