Problem mit XC8, RX-Interrupt [PIC18F4550]

Ich habe ein Problem mit meinem Interrupt und ich weiß nicht warum. Ich möchte jedes Mal eine Unterbrechung verwenden, wenn ich Daten von meinem RX-Port erhalte. Also habe ich den Interrupt am Port RX meines Mikrocontrollers verwendet. Mein Problem ist, ich kann eine Unterbrechung erkennen, aber ich bin in der Unterbrechung gefangen. Ich bin eingesperrt wie ein while(1). Irgendeine Idee?

Das ist mein Testcode:

//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
        }
    }
Wenn Sie kontinuierlich Daten empfangen, so wird der Interrupt für jedes empfangene Byte ausgelöst, sodass es Ihnen möglicherweise so vorkommt, als seien Sie dort "eingesperrt".
Sind Sie sicher, dass Sie in diese Schleife eintreten? Es ist schon eine Weile her, dass ich die 8-Bit-Produkte von Microchip verwendet habe, aber brauchen Sie nicht den zusätzlichen Compiler __ISR usw.? Oder hast du das Zeug für diese Frage weggelassen?

Antworten (2)

Das UART-Empfangsflag ist klebrig, was bedeutet, dass das Löschen des Flags in der Software es nicht in der Hardware löschen wird, bis die Bedingung, die den Interrupt ausgelöst hat, entfernt ist. Sie müssen das Empfangsregister lesen, um das Flag zu löschen oder bevor das Flag gelöscht werden kann.

Der folgende Ausschnitt stammt aus dem Datenblatt, Interrupt-Abschnitt.

RCIF: EUSART Empfangs-Interrupt-Flag-Bit

1 = Der EUSART-Empfangspuffer, RCREG, ist voll (gelöscht, wenn RCREG gelesen wird)

0 = Der EUSART-Empfangspuffer ist leer

Sie müssen Ihren Puffer löschen.

 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:      
    }  
}
Willkommen bei EE.SE O.Blue. Großartig, nützlich, erster Beitrag! - Könnten Sie vielleicht eine Zeile hinzufügen, warum das Nicht-Löschen des Puffers die Sperre / Endlosschleife im ursprünglichen Code verursacht hat, um die Antwort "vollständiger" zu machen? :-)