Estaba intentando aprender e implementar la propiedad de prioridad de las interrupciones en PIC18F46K22 uC. Yo uso MPLABX y XC8 compilador.
En mi código (transformado de un código de ejemplo), tengo una interrupción externa (INT1) y una interrupción de recepción USART (RC1IF). La entrada externa es un controlador LED y USART es un programa de eco simple controlado por un terminal de PC.
Algunas partes del código se proporcionan a continuación, con comentarios. El código construye con éxito. Pero con esta combinación de "alto-bajo", cuando USART está activo y el programa envía con éxito el texto al terminal, no puedo interrumpir la transmisión con una interrupción externa que se ha dado con un botón.
Aquí están los ISR.
void interrupt low_priority USB(void)
{
if (PIR1bits.RC1IF==1) // check if receive interrupt has fired
{
t = RCREG1; // read received character to buffer
// check if received character is not new line character
// and that maximum string length has not been reached
if ( (t != '\n') && (rcindex < STRLEN) )
{
rcbuf[rcindex] = t; // append received character to string
rcindex++; // increment string index
}
else
{
rcindex = 0; // reset string index
USART_puts(rcbuf); // echo received string
for(int x=0; x<STRLEN+1; x++){ //clear
rcbuf[x] = 0; // any leftover
} // from
RCREG1 = 0x00; // last
TXREG1 = 0x00; // transmission
}
PIR1bits.RCIF = 0; // reset receive interrupt flag
}
}
y
void interrupt high_priority inticik(void)
{
if(INTCON3bits.INT2IF==1)
{
LATAbits.LA1 = ~LATAbits.LA1;
__delay_ms(20);
}
INTCON3bits.INT2IF = 0;
}
Esta es la función de configuración de interrupción;
void interrupt_config(void)
{
//interrupt main configuration
RCONbits.IPEN = 1; // interrupt priority mode enabled, H or L interrupts
INTCONbits.GIE_GIEH = 1; // high priority interrupts are enabled
INTCONbits.PEIE_GIEL = 1; // low priority interrupts are enabled
//pin interrupt 1&2 enable + priority assignments + edge selection
TRISBbits.TRISB2 = 1;
ANSELBbits.ANSB2 = 0;
INTCON3bits.INT1IE = 1; // int1 is enabled
INTCON3bits.INT2IE = 1; // int2 is enabled
INTCON3bits.INT1IP = 1; // int1 is high priority
INTCON3bits.INT2IP = 1; // int2 is high priority
INTCON2bits.INTEDG1 = 1; // rising edge
INTCON2bits.INTEDG2 = 1; // rising edge
//EUSART interrupt enable + priority assignments
PIE1bits.RC1IE = 1; //receive interrupt enabled
PIE1bits.TX1IE = 1; //transmit interrupt enabled
IPR1bits.RC1IP = 0; // receive is low priority
IPR1bits.TX1IP = 0; // transmit is low priority
}
Y aquí está la función principal.
int main(void)
{
TRISAbits.TRISA1 = 0;
LATA = 0x00;
interrupt_config();
USART_init();
USART_puts("Init complete!\n");
//main loop
while(1)
{
Sleep();
}
return 0;
}
Otras partes del código, como las funciones USART y "config.h" conf. los encabezados de bits no se proporcionan debido a la irrelevancia.
Gracias.
Editar
Olvidé mencionar, cuando cambio el,
"void interrupt low_priority USB(void)"
declaración a
"void interrupt high_priority USB(void)"
El programa funciona con éxito y se hace eco en el terminal. Pero cuando se configura como "low_priority", el módulo USART no funciona en el terminal. Sólo la interrupción externa se ejecuta correctamente.