Problema con XC8, interrupción de RX [PIC18F4550]

1

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, utilicé 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 en 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
        }
    }
    
pregunta konova

2 respuestas

1

El indicador de recepción de UART es pegajoso, lo que significa que hasta que se elimine la condición que activó la interrupción, borrar el indicador en el software no lo eliminará 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: bit de marca de interrupción de recepción EUSART

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

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

    
respondido por el vini_i
1

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:      
    }  
}
    
respondido por el O.Blue

Lea otras preguntas en las etiquetas