PIC18 Interrupción de alta prioridad no interrumpe la baja (xc8)

3

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.

    
pregunta Esfand

1 respuesta

1

Aunque no estoy seguro de por qué, esto resolvió mi problema.

En Power-On-Reset, el bit ADON se borra, lo que significa que deshabilita el convertidor A / D de forma predeterminada, ¿verdad? Esto significa que si deshabilito o no el convertidor A / D, se desactiva automáticamente.

ADCON0bits.ADON = 0;

Pero, agregué esta línea a mi configuración y funcionó, ahora tanto la interrupción externa (alta prioridad) como la interrupción USART (baja prioridad) funcionan en el mismo programa.

Es una solución, pero todavía me pregunto por qué funcionó.

    
respondido por el Esfand

Lea otras preguntas en las etiquetas