Sé que este tema ya se ha mencionado y he estado revisando esas publicaciones, pero aún no puedo hacer funcionar la interrupción de RX de UART1. Lo que estoy tratando de hacer es recibir la cadena NMEA de mi módulo GPS que puedo ver que se entrega al pin UART RX después de la inspección con un osciloscopio.
Estos caracteres que estoy recibiendo los quiero mostrar en una pantalla LCD que es parte del código que ya tengo en ejecución. Lo que no entiendo es por qué no se dispara una interrupción cuando los caracteres se envían al puerto UART1. Adjuntaré mi rutina principal () e ISR. Cualquier ayuda sería enormemente apreciada.
main()
{
InitApp(); //initialise ports
intLCD(); //initialise LCD
clrLCD();
putsLCD("Initialising \n \t TCAS");
INTEnableSystemMultiVectoredInt();
//UART
U1MODEbits.UARTEN = 1; //enable UART1
U1MODEbits.PDSEL = 0; //8 bits, no parity
U1MODEbits.STSEL = 0; //1 stop bit used
U1BRG = 1041; //set baud rate to 4800
U1STAbits.URXISEL = 0; //interrupt flag bit is set when a character is received
PORTSetPinsDigitalOut(IOPORT_F, BIT_5); //data transmitter
PORTSetPinsDigitalIn(IOPORT_F, BIT_4); //data receiver
//interrupts
IEC0bits.U1RXIE = 1; //enable interrupt
U1STAbits.URXISEL = 0; //interrupt after character is received
gpsINITIALISE(); //initialise GPS to receive data
int check = 0;
while(1)
{ //wait in here for uart interrupt
if(check == 0)
{
sendMessages(); //send message to gps to recieve 0183 message
check = 1;
}
}
}
void __ISR(_UART_1_VECTOR, ipl6) _U1RXInterrupt(void)
{
putsLCD("interrupt \n \t triggered");
if(U1STAbits.OERR == 1)
U1STAbits.OERR = 0;
if(U1STAbits.URXDA) //check if data is ready to be read
{
c = getcUART1();
while(BusyUART1());
if(c == '$') //c == $, hex=0x0024
{
count = 0;
}
if(count < 6)
{
dataTemp[count] = c;
count++;
}
else if(count > 5 && count < 80)
{
if(dataTemp[4]=='G')
GGA[count]=c;
else //error
count++;
}
}
//parse GPS
parseGPS();
GPStest(); //function to test GPS
IFS0bits.U1RXIF = 0; //clear RX interrupt flag
}