Відповісти

Введіть повідомлення і натисніть Надіслати
Параметри

Назад

Огляд теми (нові повідомленні вгорі)

NoName
2016-03-31 19:45:45

typedef enum {
TIMER_EXE         = 0,
TIMER_DISABLED  = 1,
TIMER_RUN       = 2,
}TE_TIMER;

объявление
а то не соберется пример

мой код понятен ?

kolio
2016-03-31 19:26:34

упс. то я прогнал
я имел ввиду отнять 10 smile заговорился

NoName
2016-03-31 18:29:12

"отнять минус 10. "   это - (-10)
не удержался )

NoName
2016-03-31 17:45:43

я так делаю

TE_TIMER programm_count_down_ulong ( unsigned long *timer , unsigned short shift )
{
	  if (*timer > 0 )
	  {
		  if (*timer > shift )
		  {
			  *timer -= shift;
			  return TIMER_RUN;
		  }
		   else
		  {
			   *timer = 0;
			   return TIMER_EXE;
		  }
	  }
	return TIMER_DISABLED;
}

	 if (  TIMER_EXE ==  programm_count_down_ulong ( &Time_Next_effect, time ))
	 {
		 Executed (); 
// на выполнение когда счетчик дошел до нуля
где time значение на которое нужно уменьшить счетчик 
	 }
kolio
2016-03-31 17:21:23

хитрость просто в том, что у меня в цикле та самая timeToBegin может дополнительно уменьшаться по определенным условиям

kolio
2016-03-31 17:09:14

спасибо за ответ
я про уловку понял
у меня уловка по сути такая же:

long delta = millis() - modeStartedAt;
if (timeToBegin > delta) {
      timeToBegin -= delta;//уменьшаем время до старта
      modeStartedAt = millis();
} else {
      timeToBegin = 0;
}

вот только не понял причем тут 1 - (-10)
у меня ведь вопрос в: unsigned long var = 1-10 = ?

NoName
2016-03-31 17:03:32

"unsigned long равный 1 отнять минус 10. что будет? "
(unsigned long )1 - (-10) = 11 %)

temp =  millis();
if (temp > modeStartedAt )
{
timeToBegin = millis() - modeStartedAt;
}
else
timeToBegin = 0;

код не читаемый  (
по телу вопроса написал  пример

kolio
2016-03-31 16:53:11

долго думал как назвать тему smile буду краток

1. есть переменная unsigned long timeToBegin = 10800000; //1000*60*60*3 //3 часа
2. условно говоря когда нажимаем кнопку то засекается время старта unsigned long modeStartedAt
3. timeToBegin уменьшается в цикле loop вот так: timeToBegin = millis() - modeStartedAt;
4. потом идет проверка:
     if (timeToBegin > 0) {//еще не время?
            break;
          } else {
            timeToBegin = 0;
          }

5. цикл может длиться 1мс, а может и 2 сек, то есть теоретически когда timeToBegin станет 1, а в следующем цикле окажется, что millis() - modeStartedAt меньше нуля - то что будет со значением присвоенным timeToBegin?

получается что от беззнаковому числу пытаются присвоить минусовое значение. получается что моя проверка на > 0 отработает неверно?

я могу выкрутиться по другому, но хочется понять, как оно отработает на аппаратном уровне

Підвал форуму