По поводу CurrentFlag функция включения планируется использоваться если CurrentFlag изначально имеет флаг FALSE.
И Соответственно как видно в теле функции она будет возвращать CurrentFlag до тех пор пока не выполниться условия (TimerToStart>=TimeVar)
Добавлено after 2 minutes 2 seconds:
А по поводу 4294967295UL то есть если к нему прибавить +1, он как я понял обнулится ?
Добавлено after 6 minutes 26 seconds:
Столкнулся только с одной проблемой при испытаниях кода переменная TIMER.MS была == uint16_t.
Если зафиксируем время допустим в 65530 TIMER.MS а TimeVar установим больше 5 то TIMER.MS обнулялся раньше чем выполниться условия (TimerToSTOP >= TimeVar) и соответственно происходил сбой в работе.
Добавлено after 28 minutes 25 seconds:
Как я понимаю надо делать проверку на подобие ((MAX_UINT32-TIMER.Channel[Number].TimeCountingON)>TimeVar) и если она не выполнилась использовать еще одну переменную для подсчета ?
Добавлено after 6 minutes 12 seconds:
Без доп переменной пришла такая идея, правда не знаю насколько она правильная.
Код:
Код: Выделить всё
uint8_t OnAfterTimeMS(uint32_t TimeVar,uint8_t Number,uint8_t CurrentFlag)
{
cli();
uint8_t OutFlag=0; //Переменная отвечает за RETURN f().
TIMER.TimeCurrent=TIMER.MS; //Присваиваем текущие значение МС
if (TIMER.Channel[Number].FlagTimersON==0) //Условия для захвата времени вызова функции и установки флага работы
{
TIMER.Channel[Number].TimeCountingON=TIMER.MS;
TIMER.Channel[Number].FlagTimersON=1;
}
uint32_t TimerToStart = TIMER.TimeCurrent-TIMER.Channel[Number].TimeCountingON;
if ((TimerToStart >= TimeVar)&((MAX_UINT32-TIMER.Channel[Number].TimeCountingON)>TimeVar)) //Если время до старта == TimeVar, то OutFlag=1 и обнуляем Флаг работы.
{
OutFlag=1;
TIMER.Channel[Number].FlagTimersON=0;
TIMER.TimeCurrent=0;
TIMER.Channel[Number].TimeCountingON=0;
TimerToStart=0;
}
else
{
OutFlag=CurrentFlag;
if (((MAX_UINT32-TIMER.Channel[Number].TimeCountingON)<TimeVar))
{
TIMER.MS=0;
TIMER.Channel[Number].TimeCountingON=0;
}
}
sei();
return OutFlag;
}
Использовал три таймера:
))))