PIC32MX795F512H Problema de interrupción UART1

2

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
}
    
pregunta brook

1 respuesta

3

Usted habilitó el módulo UART, pero sus bloques de receptor y transmisor permanecieron sin alimentación. Necesitas establecer:

U1STAbits.URXEN = 1; //enable receiver
U1STAbits.UTXEN = 1; //enable transmitter

No es necesario configurar el modo GPIO mediante \ $ \ texttt {PORTSetPinsDigital} \ $ porque PIC32 cambia automáticamente la configuración del pin cada vez que un periférico comienza a usarlo.

    
respondido por el venny

Lea otras preguntas en las etiquetas