Problema con XC8, interrupción RX [PIC18F4550]

Tengo un problema con mi interrupción y no sé por qué. Quiero usar una interrupción cada vez que recibo datos de mi puerto RX. Entonces, usé la interrupción en el puerto RX de mi microcontrolador. Mi problema es que puedo detectar una interrupción pero estoy bloqueado en la interrupción. Estoy encerrado como un while(1). ¿Alguna idea?

Este es mi código de prueba:

//Functions//

void interrupt SerialRxPinInterrupt(void);


int main(int argc, char** argv) 
{
    //Variables//
    unsigned char UARTConfig = 0, baud = 0;


    //Toggle led//
    TRISAbits.RA1=0; //output

    //Configuration internal clock to 8Mhz//
    OSCCONbits.IRCF0 = 1;
    OSCCONbits.IRCF1 = 1;
    OSCCONbits.IRCF2 = 1;

    /*UART PINS*/
    TRISCbits.RC6 = 0; //TX pin set as output
    TRISCbits.RC7 = 1; //RX pin set as input

    //UART Configuration//
    UARTConfig = USART_TX_INT_OFF & USART_RX_INT_ON & USART_ASYNCH_MODE & USART_EIGHT_BIT & USART_BRGH_HIGH ;
    baud=51; //Formula 16(X+1) = Fosc/Baud Rate
    OpenUSART(UARTConfig,baud);

    //Interrupt configuration//
    RCIF = 0; //reset RX pin flag
    RCIP = 0; //Not high priority
    RCIE = 1; //Enable RX interrupt
    PEIE = 1; //Enable pheripheral interrupt (serial port is a pheripheral)
    ei();   //(INTCONbits.GIE = 1)


    while(1)
    {
        LED=1;
    }

    return (EXIT_SUCCESS);
}

    void interrupt SerialRxPinInterrupt(void)
    {
        LED=0;
        //check if the interrupt is caused by RX pin
        if(PIR1bits.RCIF == 1)
        {
            RCIF = 0; // clear rx flag
        }
    }
Si está recibiendo datos continuamente, la interrupción se activa para cada byte recibido, por lo que puede parecerle que está "bloqueado" allí.
¿Estás seguro de que estás entrando en ese bucle? Ha pasado un tiempo desde que usé los productos de 8 bits de Microchip, pero ¿no necesita un compilador adicional __ISR, etc.? ¿O omitió esas cosas para esta pregunta?

Respuestas (2)

El indicador de recepción de UART es fijo, lo que significa que hasta que se elimine la condición que activó la interrupción, borrar el indicador en el software no lo borrará en el hardware. Debe leer el registro de recepción para borrar la bandera o antes de que se pueda borrar la bandera.

El siguiente fragmento es de la hoja de datos, sección de interrupción.

RCIF: EUSART Recibir bit de bandera de interrupción

1 = El búfer de recepción de EUSART, RCREG, está lleno (se borra cuando se lee RCREG)

0 = El búfer de recepción de EUSART está vacío

Tienes que borrar tu búfer.

 void interrupt SerialRxPinInterrupt(void)
{
    LED=0;
    //check if the interrupt is caused by RX pin
    if(PIR1bits.RCIF == 1) && (PIE1bits.RCIE == 1)
    {
        RCIF = 0; // clear rx flag
        data=RCREG;
        CommReceiveFin:      
    }  
}
Bienvenido a EE.SE O.Blue. ¡Genial, útil, primera publicación! -- ¿Podría agregar tal vez 1 línea sobre por qué no borrar el búfer causó el bloqueo/bucle infinito en el código original, con el fin de hacer que la respuesta sea más "completa"? :-)