user1080390
user1080390

Reputation: 471

Using timers in ARM embedded C programming

I'm writing a pong-type game in C, which will run on an ARM board over an LCD screen. Part of the requirements for the game is something called 'magic time'.

A "magic time" period occurs at random intervals between 5 and 10 seconds - i.e, between 5 and 10 seconds after the last "magic time" period, and lasts for a random duration of 2 to 10 seconds.

Upvotes: 1

Views: 3273

Answers (1)

Nemanja Boric
Nemanja Boric

Reputation: 22157

I don't really understand your question (do you execute this code every second via timer interrupt, or?), but there are some errors that I see on the first sight:

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

Last line (magicTime == magicTimeLength;) don't do anything - it simply evaluates if magicTime is equal to the magicTimeLength, so you will enter dead-loop.

I think that you want to do this:

  1. Init magicTimeOccurence with random value within 5 and 10.
  2. Init magicTimeLength with random value within 2 and 10.
  3. Every second, if magicTimeOccurence is greater than 0, decrease its value by one.
  4. Once magicTimeOccurence hits 0, decrease magicTimeLength value by one.
  5. Check if magicTimeLength is greater than 0. If it is, it is magic time period (so, set the magicTime flag to true). Decrement magicTimeLength.
  6. If magicTimeLength, set magicTime to false and go to step 1.

You should initialize your timer0 interrupt with period of 1s. I think that you accomplished it with

/* Set timer 0 period */
T0PR = 0;
T0MR0 = SYS_GetFpclk(TIMER0_PCLK_OFFSET)/(TIMER0_TICK_PER_SEC);

but make sure that is triggered every second.

Here is sample code, it should show you what I mean.

/* 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 */
}

Upvotes: 2

Related Questions