We are running a survey to help us improve the experience for all of our members. If you see the survey appear, please take the time to tell us about your experience if you can.
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); }