//
// Periodic Timer
// By PEK '2006
//
// MCU: AT91SAM7S256
// Experiment board: AT91SAM7S-EK
//

#include "Board.h"

// Macros
#define SET_LED(x)  AT91C_BASE_PIOA->PIO_ODSR = (x)

// Definitions
#define INT_PRIO_TIMER     4           // Priority of interrupt
#define TIME_PERIOD         MCK/16/10   // Period of 100 ms

void period_isr(void)
{
    static unsigned char ucCntr = 0;
    volatile unsigned int uiStat;

    if(AT91C_BASE_PITC->PITC_PISR & AT91C_PITC_PITS)    // The right kind of system interrupt?
    {
		uiStat = AT91C_BASE_PITC->PITC_PIVR;    // Interrupt Acknowledge

		SET_LED(~ucCntr);
		ucCntr++;
	}
}

int main()
{
    // Setup PIO
    AT91C_BASE_PMC->PMC_PCER = 1 << AT91C_ID_PIOA;  // Enable clock to PIO
    AT91C_BASE_PIOA->PIO_OER = LED_MASK;    // Output on PA0-PA3
    AT91C_BASE_PIOA->PIO_OWER = LED_MASK;   // Enable to set/clear PA0-PA3 with status register
    SET_LED(0xF); // Clear leds

    // Setup PIT
    AT91C_BASE_PITC->PITC_PIMR = TIME_PERIOD | AT91C_PITC_PITEN | AT91C_PITC_PITIEN;    // Enable interval timer and interrupt

    // Setup interrupts
    AT91F_AIC_ConfigureIt(AT91C_BASE_AIC, AT91C_ID_SYS, INT_PRIO_TIMER, AT91C_AIC_SRCTYPE_INT_LEVEL_SENSITIVE, period_isr);
    AT91C_BASE_AIC->AIC_IECR = 1 << AT91C_ID_SYS;

    while(1);
}

