2012-01-05 4 views
1

Я пишу игру типа pong в C, которая будет работать на плате ARM через ЖК-экран. Часть требований к игре - это то, что называется «волшебным временем».Использование таймеров в встроенном программном обеспечении ARM

Период «волшебного времени» происходит в случайные интервалы между 5 и 10 секундами - то есть между 5 и 10 секундами после последнего периода «волшебного времени» и длится от 2 до 10 секунд.

+0

В чем заключается цель 'magicTime == magicTimeLength;'? Он сравнивает логическое значение с целым числом (что само по себе является проблемой), но не сохраняет результат нигде. –

+3

Это вопрос и ответ. Вы задаете вопросы, мы отвечаем на них. Какой у Вас вопрос? –

+1

Таймеры не являются частью ядра ARM (кроме ARM Cortex-M SYSCLK, но это не код Cortex-M). Периферийные устройства на микроконтроллерах на базе ARM определяются поставщиком. Вам нужно точно указать, какая часть ARM от того поставщика. Возможно, вы упростили бы всю систему, используя RTOS. – Clifford

ответ

2

Я не очень понимаю ваш вопрос (вы выполнить этот код каждую секунду через прерывание по таймеру, или?), Но есть некоторые ошибки, которые я вижу на первый взгляд:

while (magicTime == true) { 
    magicTimeLength++; 
    magicTime == magicTimeLength; 
} 

Последняя линия (magicTime == magicTimeLength;) ничего не делают - он просто оценивает, равен ли magicTimemagicTimeLength, поэтому вы входите в мертвую петлю.

Я думаю, что вы хотите сделать это:

  1. Init magicTimeOccurence со случайным значением в 5 и 10.
  2. Init magicTimeLength со случайным значением в пределах 2 и 10.
  3. Каждый второй, если magicTimeOccurence больше 0, уменьшает его значение на единицу.
  4. После magicTimeOccurence показов 0, уменьшение magicTimeLength значение по одному.
  5. Проверить, если magicTimeLength больше 0. Если это так, это магия период времени (так, установите флаг magicTime на номер true). Decrement magicTimeLength.
  6. Если 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 */ 
} 
+0

Да, он выполняется каждую секунду, используя таймер прерывания в основном классе. Я только что понял, насколько я ошибался в своей логике, я пытаюсь установить значение булина на время. Спасибо, что пытались ответить, я переписал свой код и ответ. – user1080390

+0

Нет проблем, удачи! Я добавил образец кода в свой ответ, чтобы вы могли его проверить. –

+0

Будет ли это работать? Я был под впечатлением, что мне придется вызывать цикл while, чтобы он продолжал увеличиваться/уменьшаться в стоимости? Или он будет продолжать выполнять инструкции if из-за таймера прерывания? – user1080390

Смежные вопросы