I have Timer 0 working great. It is used for delays down to 1 ms and
has worked for months.
I was setting up Timer 1 to give me delays down to 1 us. Once I got
it working, I was going to integrate the Timer 1 code into Timer 0 to
allow delays by SECS, MS, and US.
However, for some reason, Timer 1 is not firing the interrupt. I
copied the code from Timer 0 and adjusted for Timer 1. Using Keil's
debugger, the interrupt flag is set and the VIC is the proper vector,
but still not firing. Can someone can spot something?
I'm using a 11.059Mhz clock with PLL disabled, thus the calculations
below.
When I use delay2() (using Timer 1), it gets stuck at "while
(delay_timerA > 0);". And, delay_timerA never changes, so the INT is
never firing. But, delay() (using Timer 0) works fine.
Also, I was planning to not run the timers all the time (I leave Timer
0 running continually), but when I start and stop the Timer 0 like I
have done with Timer 1 (in delay2(), Timer 0 stops working. Can't
figure out why, either.
Thanks for looking to anyone who has a minute.
Sutton
void set_up_timer0()
{
// Set up Timer Counter 0 and its Interrupt
PCONP |= 0x00000002; // ON by default, but just to be sure
T0CTCR = 0; // puts Timer 0 in timer mode
T0PR = 0; // One increment per PCLK
T0TCR = 2; // reset Timer 0
T0IR = 1; // reset Timer 0 interrupt flag
/*
Match values at certain speeds
Subtract this number from 0xFFFFFFFF for the match value (T0MR0)
Eval boards use 12Mhz - Our board is 11.0592 Mhz
0xFFFFFFFF @ 11.0592Mhz = 1 interrupt every 388.36 seconds
0x278D0000 @ 11.0592Mhz = 1 interrupt every 60 seconds
0x00A8C000 @ 11.0592Mhz = 1 interrupt every 1 second
0x0010E000 @ 11.0592Mhz = 1 interrupt every .1 second (100ms)
0x0001B000 @ 11.0592Mhz = 1 interrupt every .01 second (10ms)
0x00002B33 @ 11.0592Mhz = 1 interrupt every .001 second (1ms)
0x00000452 @ 11.0592Mhz = 1 interrupt every .0001 second (100us)
0x0000006F @ 11.0592Mhz = 1 interrupt every .00001 second (10us)
0x0000000B @ 11.0592Mhz = 1 interrupt every .000001 second (1us)
*/
T0MR0 = 110; // 0x0B - 1 = 10 for 11.0592Mhz clock
T0MCR = 3; // Interrupt and Reset on MR0
// set up Timer0 interrupt
VICVectAddr0 = (unsigned long) decrement_timers;
VICVectCntl0 = 0x24; // IRQ 4 plus enable bit (page 59 -
int. sources)
VICIntEnable |= 0x00000010; // enables Timer0 interrupt - page 54
T0TCR = 1; // start clock
}
void set_up_timer1()
{
// Set up Timer Counter 1 and its Interrupt
PCONP |= 0x00000004; // ON by default, but just to be sure
T1CTCR = 0; // puts Timer 1 in timer mode
T1PR = 0; // One increment per PCLK
T1TCR = 2; // reset Timer 1
T1IR = 1; // reset Timer 1 interrupt flag
/*
Match values at certain speeds
Subtract this number from 0xFFFFFFFF for the match value (T1MR0)
Eval boards use 12Mhz - Our board is 11.0592 Mhz
0xFFFFFFFF @ 11.0592Mhz = 1 interrupt every 388.36 seconds
0x278D0000 @ 11.0592Mhz = 1 interrupt every 60 seconds
0x00A8C000 @ 11.0592Mhz = 1 interrupt every 1 second
0x0010E000 @ 11.0592Mhz = 1 interrupt every .1 second (100ms)
0x0001B000 @ 11.0592Mhz = 1 interrupt every .01 second (10ms)
0x00002B33 @ 11.0592Mhz = 1 interrupt every .001 second (1ms)
0x00000452 @ 11.0592Mhz = 1 interrupt every .0001 second (100us)
0x0000006F @ 11.0592Mhz = 1 interrupt every .00001 second (10us)
0x0000000B @ 11.0592Mhz = 1 interrupt every .000001 second (1us)
*/
T1MR0 = 110; // 0x0B - 1 = 10 for 11.0592Mhz clock
T1MCR = 3; // enable interrupt on match, reset TC
// set up Timer1 interrupt
VICVectAddr3 = (unsigned long) decrement_timers_2;
VICVectCntl3 = 0x25; // IRQ 5 plus enable bit (page 59 -
int. sources)
VICIntEnable |= 0x00000020; // enables Timer1 interrupt - page 54
T1TCR = 1;
}
// interrupt for Timer 0
void decrement_timers(void) __irq
{
// occurs every .001 second (1ms)
delay_timer--;
T0IR = 1;
VICVectAddr = 0; // Acknowledge interrupt
}
// interrupt for Timer 1
void decrement_timers_2(void) __irq
{
// occurs every .000001 second (1us)
delay_timerA--;
T1IR = 1;
VICVectAddr = 0; // Acknowledge interrupt
}
// uses Timer 0
void delay(unsigned char type, float x)
{
if (x == 0)
{
return;
}
if (type == MS)
{
delay_timer = (unsigned long) (x * 100.0);
}
else if (type == SECS) // SECS
{
delay_timer = (unsigned long) (x * 100000.0);
}
else // US - microseconds
{
delay_timer = (unsigned long) x;
}
while (delay_timer > 0);
}
// uses Timer 1
void delay2(unsigned char type, float x)
{
if (x == 0)
{
return;
}
if (type == MS)
{
delay_timerA = (unsigned long) (x * 1000.0);
}
else if (type == SECS) // SECS
{
delay_timerA = (unsigned long) (x * 100000.0);
}
else // US - microseconds
{
delay_timerA = (unsigned long) x;
}
T1TCR = 2; // reset timer
T1TCR = 1; // start timer
while (delay_timerA > 0);
T1TCR = 0; // stop timer
}
------------------------------------

(You need to be a member of lpc2000 -- send a blank email to lpc2000-subscribe@yahoogroups.com )
Sutton Mehaffey wrote:
> I have Timer 0 working great. It is used for delays down to 1 ms and
> has worked for months.
>
> I was setting up Timer 1 to give me delays down to 1 us. Once I got
> it working, I was going to integrate the Timer 1 code into Timer 0 to
> allow delays by SECS, MS, and US.
>
> However, for some reason, Timer 1 is not firing the interrupt. I
> copied the code from Timer 0 and adjusted for Timer 1. Using Keil's
> debugger, the interrupt flag is set and the VIC is the proper vector,
> but still not firing. Can someone can spot something?
>
I had a similar problem with LPC2138 a few months ago. I had Timer 0
working, giving me an interrupt every 10 mS. In order to use the
built-in A/D converters at 44.1 kHz, I programmed Timer 1 with a count
of 167 decimal. At a clock frequency at 14.7456 MHz this should give me
a timer period of 11.3 uS. Using only the positive-going edge to trigger
an A/D conversion this gives a conversion every 22.6 uS, corresponding
to 44.1 kHz.
But it never worked. I tried everything without result. The timer never
trigged the A/D. Then as a last resort I swapped the two timers such
that Timer 1 generated the 10 mS interrupt and Timer 0 the fast A/D
conversion. To my surprise it worked!
My theory is that Timer 1 stops generating interrupts when the period
gets too low. However, I didn't experiment in order to find the
threshold. Thus, my advice is: try to swap the timers. It worked for me!
Best regards
Ole Bromose
------------------------------------

(You need to be a member of lpc2000 -- send a blank email to lpc2000-subscribe@yahoogroups.com )