Yahoo Groups archive

Lpc2000

Index last updated: 2026-04-28 23:31 UTC

Message

Re: LPC2138 Timer0 Interrupt

2005-12-08 by Ken Wada

First of all; you are not acknowledging your VIC interrupt. This will 
cause your system to 'look' like it is not interrupting.

void decrement_timers() __irq
{
    // occurs 896 times per second
    system_timer--;
    T0IR = 1;
    VICVectAddr = 0;     /* <--- Acknowledge VIC Interrupt !!! */
}

plus: Here is a snippet from an initialization routine that I use, and 
it works perfectly:

extern unsigned long acquireFOSC(void);  // VPB clock in Hertz

void Timer0_init (const unsigned vicSlot)
{
    /*** some sundry global variable initializations here ***/
      ...
      ...
      ...

    /*** now initialize the timer and install the service ***/
    T0PR  = (acquireFOSC () / 2000) - 1;/* Prescaler ~ .0005 sec    */
    T0MR0 = 1;                          /* Set MR0 count = .001 sec */
    T0MCR = 0x03;                       /* Set to reset & interrupt */
    VIC_install (vicSlot,VICCH_TMR0,TMR0_isr); //install the service
    T0TCR = 1;                          /* Timer0 Enable            */
}

--- In lpc2000@yahoogroups.com, "dodge1955" <sutton@h...> wrote:
>
> Can anyone tell me why my interrupt is not firing? The T0IR flag is
> set upon rollover of the TIMER0 32 bit timer, but my code is not
> vectored to the interrupt code. My variable 'system_timer' never 
gets
> decremented.
> 
> unsigned long system_timer, j;
> 
> void decrement_timers() __irq
> {
> // occurs 896 times per second
> 
> system_timer--;
> 
> T0IR |= 1;
> }
> 
> int main()
> {
> VPBDIV = 1;
> 
> // set up delay timer (TIMER 0)
> 
> VICIntSelect = 0; // all interrupts classified as IRQs
> VICVectCntl0 = 0x00000024;
> VICVectAddr0 = (unsigned int) decrement_timers;
> VICIntEnable = 0x00000010;
> 
> // Disable Timer0 and Reset Interrupt Flag
> 
> T0TCR = 0;
> T0IR |= 1;
> 
> T0MR0 = 0;
> T0MCR = 1;
> 
> T0CTCR = 0;
> T0PR = 0;
> T0TCR = 1;
> 
> // just an infinite loop to check Timer0
> 
> system_timer = 4000;
> 
> j = 0;
> for(;;)
> {
> j = j + 2;
> }
>

Attachments

Move to quarantaine

This moves the raw source file on disk only. The archive index is not changed automatically, so you still need to run a manual refresh afterward.