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
}
}
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:
}
}
Eugenio Sh.
justamente