Ok... I spent a little more time and actually read through your code
properly. I'm not actualy quite sure what you're trying to achieve however
there's a few obvious things.
1) are you trying to actually use the watchdog? I can't see any reference to
setting up WDTC or WDMOD so are you sure it's actually switched on?
2) if you are actively using it you don't have any form of kick for it
inside your main while loop (one of the reasons I decouple it to a timer IRQ
that acts as an internal system check to look at running statuses).
3) Can't remember off the top of my head, but don't you also have to reset
the count for the timer when you initialise it?
ie:
T0PR = 0x1; // set the prescaler to the pclk frequency 60MHz
T0TCR = 0x2; // reset the counter to 0
T0MCR = 0x3; // on match generate an IRQ
T0MR0 = 0x600000; // count 0x600000 hex cycles per IRQ
T0TCR = 0x1; // enable timer
VICVectCntl0 = 0x24; // IRQ 4 + Enabled bit
VICVectAddr0 = (unsigned)T0ISR; // address of IRQ handler
VICIntEnable |= 0x10; // Turn on IRQ 4
4) Have you checked the UART parameters to ensure your clock and divisors
etc are giving you the correct baud rate?
Andy
-----Original Message-----
From: lpc2000@yahoogroups.com [mailto:lpc2000@yahoogroups.com]On Behalf
Of poland459
Sent: 10 May 2006 11:40
To: lpc2000@yahoogroups.com
Subject: [lpc2000] Re: Interrupt in LPC22XX
Thanks for your reply..I have added the asm code and called enableIRQ
after the timer is enabled.. But the program is not jumping to ISR...
I forgot to mention in my first post that, iam using UART0 in polling
mode and TIMER0 in ISR..(ISR is not triggered even if I use only
TIMER0 in ISR).
here is the asm code..
static __inline unsigned long asm_get_cpsr(void) __arm
{
unsigned long retval;
__asm { mrs retval, CPSR };
return retval;
}
static __inline void asm_set_cpsr(unsigned long value) __arm{
value = value; // avoid warning: unused parameter
__asm { msr CPSR_c, R0 }; // value passed in R0
}
unsigned long enableIRQ(void)
{
unsigned long _cpsr;
_cpsr = asm_get_cpsr();
asm_set_cpsr(_cpsr & ~IRQ_MASK);
return _cpsr;
}
Thank you.
--- In lpc2000@yahoogroups.com, "fordp2002" <SimonEllwood@...> wrote:
> I got it from the WinARM site a good place for examples.
>
> You may have other problems too, I did not read your code in detail.
>
> Let us know how you get on ;)
>
> FordP
>
>
> Good
> --- In lpc2000@yahoogroups.com, "poland459" <poland459@> wrote:
> >
> > Hi am new to this forum.I am using "free" KEIL evalution software
as
> > my IDE to work on LPCE2214 OLIMEX board. Am able to work on TIMER
and
> > serial port in "polling" mode. But when I enable ISR functions
using
> > VIC,my program in not jumping to ISR.but in debug mode i could
see
> > the jump to ISR. also I have DefaultISR in my code.here am
attaching
> > my code with this mail.
> > // This program is created for LPC-E2214 board
> > #include "lpc22xx.h"
> >
> > #define OSCILLATOR_CLOCK_FREQUENCY 14745600 //in MHz
> > #define PLOCK 0x400 //in MHz
> >
> >
> > void Initialize(void);
> > void feed(void);
> > void UART0Initialize(unsigned int baud);
> > void UART0WriteChar(unsigned char ch0);
> > unsigned char UART0ReadChar(void);
> > unsigned char UART0ReadChar_nostop(void);
> > unsigned int processorClockFrequency(void);
> > unsigned int peripheralClockFrequency(void);
> >
> > void tc0(void)__irq;
> > static void DefDummyInterrupt(void)__irq;
> >
> > void init_timer(void);
> > void InitVIC(void);
> >
> > long volatile timeval;
> >
> > void wait (void) /* wait function */
> > {
> > unsigned long i;
> > i = timeval;
> > while ((i + 10) != timeval); /* wait 100ms */
> > }
> >
> >
> >
> > int main()
> > {
> > /**** VARIABLES ****/
> > unsigned char ch0 = 0x0;
> > unsigned char ch1 = 0x0;
> > long i=0;
> >
> > /**** INITIALIZATION ****/
> > // Frequency initialization
> > Initialize();
> > // UART initialization
> > UART0Initialize(9600);
> >
> > init_timer();
> > InitVIC();
> >
> >
> > while(1)
> > {
> >
> > UART0WriteChar('3');
> > wait();
> >
> > UART0WriteChar('2');
> > wait();
> > }
> >
> > }
> >
> >
> > void Initialize(void)
> > {
> >
> > // Setting Multiplier and Divider values
> > PLLCFG=0x23;
> > feed();
> >
> > // Enabling the PLL */
> > PLLCON=0x1;
> > feed();
> >
> > // Wait for the PLL to lock to set frequency
> > while(!(PLLSTAT & PLOCK)) ;
> >
> > // Connect the PLL as the clock source
> > PLLCON=0x3;
> > feed();
> >
> > // Enabling MAM and setting number of clocks used for Flash
memory
> > fetch (4 cclks in this case)
> > MAMCR=0x2;
> > MAMTIM=0x4;
> >
> > // Setting peripheral Clock (pclk) to System Clock (cclk)
> > VPBDIV=0x1;
> >
> > }
> >
> >
> > void feed(void)
> > {
> > PLLFEED=0xAA;
> > PLLFEED=0x55;
> > }
> >
> > /* Setup the Timer Counter 0 Interrupt */
> > void init_timer (void) {
> > T0MR0 = 149999; // 10mSec = 150000-1 counts
> > T0MCR = 3; // Interrupt and Reset on MR0
> > T0TCR = 1; // Timer0 Enable
> > VICVectAddr0 = (unsigned long)tc0; // set interrupt vector in 0
> > VICVectCntl0 = 0x20 | 4; // use it for Timer 0 Interrupt
> > VICIntEnable = 0x00000010; // Enable Timer0 Interrupt // Timer0
Enable
> > }
> >
> > /* Timer0 Compare-Match Interrupt Handler (ISR) */
> > /* Timer Counter 0 Interrupt executes each 10ms @ 60 MHz CPU
Clock */
> > /* Timer Counter 0 Interrupt executes each 10ms @ 60 MHz CPU
Clock */
> > void tc0 (void) __irq
> > {
> > ++timeval;
> > T0IR = 1; // Clear interrupt flag
> > VICVectAddr = 0; // Acknowledge Interrupt
> > }
> > void DefDummyInterrupt(void)__irq
> > {
> > ;
> > }
> > void InitVIC()
> > {
> > VICDefVectAddr = (unsigned long)DefDummyInterrupt;
> > }
> >
> >
> > /**** UART0 ****/
> > void UART0Initialize(unsigned int baud)
> > {
> > unsigned int divisor = peripheralClockFrequency() / (16 * baud);
> >
> > U0LCR = 0x83;
> >
> >
> > //devisor
> > U0DLL = divisor & 0xFF;
> > U0DLM = (divisor >> 8) & 0xFF;
> > U0LCR &= ~0x80;
> >
> > //set functionalite to pins: port0.0 -> TX0, port0.1 -> RXD0
> > PINSEL0 = PINSEL0 & ~0xF | 0x5;
> > }
> >
> > void UART0WriteChar(unsigned char ch0)
> > {
> > //when U0LSR_bit.THRE is 0 - U0THR contains valid data.
> > while ((U0LSR && 0x20) == 0);
> > U0THR = ch0;
> > }
> >
> > unsigned char UART0ReadChar(void)
> > {
> > //when U0LSR_bit.DR is 1 - U0RBR contains valid data
> > while ((U0LSR && 0x01) == 0);
> > return U0RBR;
> > }
> > unsigned int processorClockFrequency(void)
> > {
> > //return real processor clock speed
> > return OSCILLATOR_CLOCK_FREQUENCY * (PLLCON & 1 ? (PLLCFG & 0xF)
+
> > 1 : 1);
> > }
> >
> > unsigned int peripheralClockFrequency(void)
> > {
> > //VPBDIV - determines the relationship between the processor
clock
> > (cclk)
> > //and the clock used by peripheral devices (pclk).
> > unsigned int divider;
> > switch (VPBDIV & 3)
> > {
> > case 0: divider = 4; break;
> > case 1: divider = 1; break;
> > case 2: divider = 2; break;
> > }
> > return processorClockFrequency() / divider;
> > }
> >
> > Please look into this and It would be a great help for me as i
have
> > been trying for it from past 2 weeks.
> > I think, abviously iam missing some things. I did not changed any
> > things in startup.s file.I will post the start up code if any
body
> > wanted to look in
> > please guide me.appreciate your help.
> >
> > Thanks
> >
>
Yahoo! Groups LinksMessage
RE: [lpc2000] Re: Interrupt in LPC22XX
2006-05-10 by Andrew Berney
Attachments
- No local attachments were found for this message.