Несовсем понятен unsigned long

Nafany
Offline
Зарегистрирован: 13.10.2014





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() . Остальные игнорируются.

Или неправилен алгоритм выполнения (хотя сначала работает) или проблема с типом переменных. Подскажите пожалуйста правильное направление хода мыслей.

gafbich
Offline
Зарегистрирован: 23.12.2013

Возможно, происходит переполнение и сброс на 0. А так как в переменных timeWait2 и timeWait3 значения превышают значение millis(), потому и не работает!

faraddin
Offline
Зарегистрирован: 11.08.2013

gafbich пишет:

Возможно, происходит переполнение и сброс на 0.

 

millis()

Возвращает количество миллисекунд с момента начала выполнения текущей программы на плате Arduino. Это количество сбрасывается на ноль, в следствие переполнения значения, приблизительно через 50 дней.

vdk
Offline
Зарегистрирован: 14.04.2013

Nafany пишет:

Или неправилен алгоритм выполнения (хотя сначала работает) или проблема с типом переменных. Подскажите пожалуйста правильное направление хода мыслей.

Правильное направление мыслей - это переходить к отладке с целью выяснения, что же происходит

Для начала можно понаблюдать за ходом выполнения по светодиодам

void program2()
{
  digitalWrite(LED2, HIGH); // вкл. светодиод #2
  delay(200); // чтобы визуально зафиксировать вкл. светодиода
 ...
  timeWait2=millis()+time2;
  digitalWrite(LED2, LOW); // выкл. светодиод #2
}
faraddin
Offline
Зарегистрирован: 11.08.2013

Ну или код целиком. А то в Ваших ... может, что угодно прятаться.

Nafany
Offline
Зарегистрирован: 13.10.2014

vdk пишет:

Правильное направление мыслей - это переходить к отладке с целью выяснения, что же происходит

Для начала можно понаблюдать за ходом выполнения по светодиодам

Я и упустил код, где моргают светодиоды :) По идее, переполнение произойдёт через ~50 дней. Мне столько не нужно. Останавливается через примерно 200 циклв (15-20 сек). Первая программа остаётся работать, а остальные как бы теряют точку времени.

Код программы ещё до конца не отработан, по этому выкладывать его целиком смысла не имеет. Разрабатываю кусками. Упёрся вот в эти ворота.

bwn
Offline
Зарегистрирован: 25.08.2014

Выводите в Serial.print() контролируемое и заданное значения, смотрите что изменилось, далее почему изменилось не верно. Как-то так.

std
Offline
Зарегистрирован: 05.01.2012

Хз, написано синтаксически правильно.

Мне в недрах движка 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();
}

Хз, должно работать. Фаза Луны :)

Nafany
Offline
Зарегистрирован: 13.10.2014

std пишет:

Хз, должно работать. Фаза Луны :)

Проблема решилась непонятным образом. :) Последний редактированный, но не сохранённый скетч, улетел в трубу после пропадания напряжения. Взял предыдущий, дописал чего нехватало и всё заработало.

Спасибо всем кто пытался помочь.

art100
Offline
Зарегистрирован: 09.03.2014

жуть

основы электротехники явно не здавали

а такой баян про положительные длинные числа

шиза

 

Nafany
Offline
Зарегистрирован: 13.10.2014

art100 пишет:

основы электротехники явно не здавали

Смею поинтересоваться, с чего такое заявление?

std пишет:

Хз, должно работать. Фаза Луны :)

Проблему локализовал. Если поставить перед 16 строчкой delay(1), начинаются глюки вплоть до зависания контроллера.Проверка на время ( 4 строчка) какую либо роль играть перестаёт.