Я не совсем понимаю ваш вопрос (вы выполняете этот код каждую секунду через прерывание по таймеру или?), Но есть некоторые ошибки, которые я вижу на первый взгляд:
while (magicTime == true) {
magicTimeLength++;
magicTime == magicTimeLength;
}
Последняя строка (magicTime == magicTimeLength;
) ничего не делает - она просто оценивает, равен ли magicTime
magicTimeLength
, поэтому вы попадете в тупик.
Я думаю, что вы хотите сделать это:
- Инициация
magicTimeOccurence
со случайным значением в пределах 5 и 10.
- Инициация
magicTimeLength
со случайным значением в пределах 2 и 10.
- Каждую секунду, если
magicTimeOccurence
больше 0, уменьшается
его значение на единицу.
- Как только
magicTimeOccurence
достигнет 0, уменьшите значение magicTimeLength
по одному.
- Проверьте, если
magicTimeLength
больше 0. Если это так, это волшебство
период времени (поэтому установите флаг magicTime
на true
). декремент
magicTimeLength
.
- Если
magicTimeLength
, установите magicTime
на false
и перейдите к шагу 1.
Вам следует инициализировать ваше timer0
прерывание с периодом 1 с. Я думаю, что вы сделали это с
/* Set timer 0 period */
T0PR = 0;
T0MR0 = SYS_GetFpclk(TIMER0_PCLK_OFFSET)/(TIMER0_TICK_PER_SEC);
, но убедитесь, что он срабатывает каждую секунду.
Вот пример кода, он должен показать вам, что я имею в виду.
/* In void InitTimer0Interrupt() */
...
T0TCR_bit.CE = 1; /* Counting Enable */
magicTimeOccurence = 5+(rand()%5);
magicTimeLength = 2+(rand()%8);
magicTime = false;
__enable_interrupt();
}
/* In void Timer0IntrHandler (void) */
void Timer0IntrHandler (void) {
/* clear interrupt */
T0IR_bit.MR0INT = 1;
VICADDRESS = 0;
if(magicTimeOccurence > 0)
{
magicTimeOccurence--;
}
else if(magicTimeLength > 0){
magicTime = true;
magicTimeLenght--;
}
else{
magicTime = false;
magicTimeOccurence = 5+(rand()%5);
magicTimeLength = 2+(rand()%8);
}
/* take action on timer interrupt */
}