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
}
}
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:
}
}
Eugen Sch.
justieren