HI,
I use GNU compiler.
I have written code that send the Character string to COM-1 when I make the external interrupt (EXTINT-2) pin low. Interrupt is active low edge sensitive.
Interrupt flag is set but processor does not go to interrupt service routine.
I have checked code many times it seem all interrupt setting are correct.
Does I need to make changes in Start-up code.
code is below
#include<lpc21xx.h>
#define RS 0x01000000; #define RW 0x00800000; #define EN 0x00400000; #define BL 0x00200000;
#define reset 0x3; #define four_bit 0x2; #define one_line 0x20; #define two_line 0x28; #define clear 0x01; //CLEAR DDRAM CONTENT #define home 0x02; #define inc_cursor 0x06; #define dec_cursor 0x04; #define inc_cursor 0x06; #define shift_right 0x05; #define shift_left 0x07; #define dis_cur_off 0x08; //CLEAR DISPLAY WITHOUT CLEARING DDRAM CONENT #define dis_off_cur_on 0x0A; #define dis_on_cur_off 0x0C; #define dis_on_cur_blink 0x0E; #define shift_cur_left 0x10; #define shift_cur_right 0x14; #define shift_entire_left 0x18; #define shift_entire_right 0x1C; #define first_line 0x80; #define second_line 0xC0;
void command_sent(void); void data_sent(void); void command_split_send(void); void data_split_send(void); void delay(void); void delay_long(void); void uart0_sent(void);
void EXTINTVectored_IRQ(void) __attribute__ ((interrupt("IRQ")));
int ldata,ldata1,x,i,j,k,D3,D2,D1,D0,R1,R2;
char UART0_DATA[]="TIME:"; char LCD_DATA[]="TIME:";
int main (void) { /*********************************** TIMER-0 SETUP FOR DELAY********************************/ VPBDIV = 0x02; //DIVIDED CCLOCK BY TWO T0CTCR = 0X00; //SET COUNTER AS TIMER T0MCR = 0X0006; //INTERRUPT AND REST ON MATCH T0IR = 0X00; //CLEAR ALL INTERRUPT T0PR = 0X06; //COUNTER CLOCK DIVIDED BY 6=1MHz
/************************************ EXTERNAL-2 INTERRUPT SETUP **************************/
PINSEL0 = 0xC0000000; //SET GPIO FOR EXT-2 EXTINT = 0X00; //CLEAR EXT-2 FLAG EXTMODE = 0X04; //SELECT EDGE SENSETIVE EXTPOLAR = 0X00; //SELECT ACTIVE LOW EDGE SENSETIVE VICIntSelect = 0x00000000; //SELECT EXINT-2 AS FIQ
VICVectCntl0 = 0x20; //select a priority slot for a given interrupt
VICVectAddr0 = (unsigned)EXTINTVectored_IRQ; //pass the address of the IRQ into the VIC slot
VICIntEnable = 0x00010000; //ENABLE EXINT-2 INTERRUPT
/******************************* LCD Setup *************************************************/
IO0DIR = 0X00003C00; //SET PORT-0 PIN AS OUTPUT FOR LCD DATA IO1DIR = 0X01E00000; //SET PORT-1 PIN AS OUTPUT FOR LCD CONTROL SIGNAL for(x=0;x<=20;x++) { delay_long(); } //WAIT 20ms FOR LCD INTIALIZE ITSELF
IO1CLR = EN; //PULL ENABLE LOW
ldata= reset ldata = ldata <<10; command_sent(); //SEND RESET COMMAND
for(x=0;x<=10;x++) { delay_long(); //WAIT 10ms FOR LCD RESET }
ldata= reset ldata = ldata<<10; command_sent(); //SEND RESET COMMAND delay_long(); //WAIT 1ms FOR LCD RESET
ldata= four_bit; ldata = ldata<<10; command_sent(); //SET FOUR BIT MODE=0X2
ldata1= two_line; command_split_send();
ldata1= dis_on_cur_off; command_split_send();
ldata1= inc_cursor; command_split_send();
ldata1= first_line; command_split_send();
/****************************** UART-0Setup ***********************************************/ PINSEL0 = 0x5; // Enable RxD1 and TxD1 U0LCR = 0x83; // 8 bits, no Parity, 1 Stop bit U0FCR = 0X7; U0DLL = 0x27; //9600 Baud Rate @ 6MHz VPB Clock U0DLM = 0X00; U0LCR = 0x3; // DLAB = 0
/******************************* LCD Character Sent *****************************************/ while (LCD_DATA[j]!='\0') { ldata1 = LCD_DATA[j]; data_split_send(); j++; } /****************************** UART-0 CharacterSent****************************************/ while (UART0_DATA[i]!='\0') { U0THR =UART0_DATA[i]; while((U0LSR & 0X40)==0X00); i++; } for(;;); }
/**************************************** End Main *******************************************/
/********************************** INTERRUPT SUBROUTINE**************************************/ void EXTINTVectored_IRQ(void) { while (UART0_DATA[k]!='\0') { U0THR =UART0_DATA[k]; while((U0LSR & 0X40)==0X00); k++; } EXTINT = 0X00; //CLEAR EXT-2 FLAG VICVectAddr = 0x00000000; }
/**********************************************************************************************/
void delay(void) { unsigned long y; for(y=0;y<1000;y++); }
void delay_long(void) { T0MR0 = 1000; //MATCH-0=1000 T0TCR = 0X01; //TURN ON TIMER-0 while((T0TCR & 0X01)==0X01); //WAIT FOR TIMER MATCH AND INTERRUPT FLAG SET T0TCR = 0X00; //TURN OFF AND RESET TIMER-0 } void command_sent(void) { IO0PIN = ldata; IO1CLR = RS; IO1CLR = RW; IO1SET = EN; delay(); IO1CLR = EN; delay(); } void data_sent(void) { IO0PIN = ldata; IO1SET = RS; IO1CLR = RW; IO1SET = EN; delay(); IO1CLR = EN; delay(); }
void command_split_send(void) { ldata = ((ldata1 & 0XF0)<<6); command_sent(); ldata = ((ldata1 & 0X0F)<<10); command_sent(); }
void data_split_send(void) { ldata = ((ldata1 & 0XF0)<<6); data_sent(); ldata = ((ldata1 & 0X0F)<<10); data_sent(); }
void uart0_sent(void) { U0THR = ldata1; while((U0LSR & 0X40)==0X00); }