Несовсем понятен 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 дней.
Правильное направление мыслей - это переходить к отладке с целью выяснения, что же происходит
Для начала можно понаблюдать за ходом выполнения по светодиодам
void program2() { digitalWrite(LED2, HIGH); // вкл. светодиод #2 delay(200); // чтобы визуально зафиксировать вкл. светодиода ... timeWait2=millis()+time2; digitalWrite(LED2, LOW); // выкл. светодиод #2 }Ну или код целиком. А то в Ваших ... может, что угодно прятаться.
Правильное направление мыслей - это переходить к отладке с целью выяснения, что же происходит
Для начала можно понаблюдать за ходом выполнения по светодиодам
Я и упустил код, где моргают светодиоды :) По идее, переполнение произойдёт через ~50 дней. Мне столько не нужно. Останавливается через примерно 200 циклв (15-20 сек). Первая программа остаётся работать, а остальные как бы теряют точку времени.
Код программы ещё до конца не отработан, по этому выкладывать его целиком смысла не имеет. Разрабатываю кусками. Упёрся вот в эти ворота.
Выводите в Serial.print() контролируемое и заданное значения, смотрите что изменилось, далее почему изменилось не верно. Как-то так.
Хз, написано синтаксически правильно.
Мне в недрах движка Unreal Engine попался вот такой приём:
class Trigger extends Triggers native; function Touch( actor Other ) { local actor A; if( IsRelevant( Other ) ) { if ( ReTriggerDelay > 0 ) { if ( Level.TimeSeconds - TriggerTime < ReTriggerDelay ) return; TriggerTime = Level.TimeSeconds; } // Broadcast the Trigger message to all matching actors. if( Event != '' ) foreach AllActors( class 'Actor', A, Event ) A.Trigger( Other, Other.Instigator ); // .............. } }То есть в метках времени содержится чистое время, а сравнивается время+delay. Если перевести на wiring, то будет:
unsigned long timestamp=millis(); unsigned long dtime=5000; if(millis()-timestamp>=dtime){ // code timestamp=millis(); }Хз, должно работать. Фаза Луны :)
Хз, должно работать. Фаза Луны :)
Проблема решилась непонятным образом. :) Последний редактированный, но не сохранённый скетч, улетел в трубу после пропадания напряжения. Взял предыдущий, дописал чего нехватало и всё заработало.
Спасибо всем кто пытался помочь.
жуть
основы электротехники явно не здавали
а такой баян про положительные длинные числа
шиза
основы электротехники явно не здавали
Смею поинтересоваться, с чего такое заявление?
Хз, должно работать. Фаза Луны :)
Проблему локализовал. Если поставить перед 16 строчкой delay(1), начинаются глюки вплоть до зависания контроллера.Проверка на время ( 4 строчка) какую либо роль играть перестаёт.