PIC32, XC32, no se ingresó el vector de interrupción del temporizador

1

Tengo el siguiente vector de interrupción del temporizador 5 que no se ha ingresado, incluso cuando se establece el bit de habilitación de interrupción correspondiente para el temporizador 5, y se establece el indicador de interrupción correspondiente para el temporizador 5.

Aquí está mi controlador de vectores de interrupción:

void __ISR(_TIMER_5_VECTOR,IPL4SOFT) _T5Interrupt(void)
{
    PORTDbits.RD2 = 1;  // << -- LED will light when here. 
    T4CONbits.ON = 0;
    TMR4 = 0;
    TMR5 = 0;
    Global_TimeOut = 1;
    IFS0bits.T5IF = 0;
}

Mis interrupciones globales están configuradas para aceptar interrupciones multi-vector y se inicializan de la siguiente manera:

void Init_Global_Interrupts(void)
{
    // Initializing Global Interrupts
    //INTCON
    // 16 Single Vector is not presented with a shadow register set
    INTCONbits.SS0 = 0;
    // 12 Interrupt Controller configured for multi vectored mode
    INTCONbits.MVEC = 1;
    // 10 - 8 Disables interrupt proximity timer
    INTCONbits.TPC = 0;
    // 4 External interrupt 0 falling edge interrupt
    INTCONbits.INT0EP = 0;
    // 4 External interrupt 1 falling edge interrupt
    INTCONbits.INT1EP = 0;
    // 4 External interrupt 2 falling edge interrupt
    INTCONbits.INT2EP = 0;
    // 4 External interrupt 3 falling edge interrupt
    INTCONbits.INT3EP = 0;
    // 4 External interrupt 4 falling edge interrupt
    INTCONbits.INT4EP = 0;
}

El temporizador 4 y el temporizador 5 se están utilizando en el modo de 32 bits. Como se indica en la hoja de datos, en esta configuración, son las interrupciones del temporizador 5 las que se utilizan:

void Init_Timer4_5(void)
{
    // 15 - Timer 4 is off
    T4CONbits.ON = 0;
    // 13 - Continue operation when device enters idle mode
    T4CONbits.SIDL = 0;
    // 7 - Gated time accumulation is disabled
    T4CONbits.TGATE = 0;
    // 6 - 4 - 1:8 prescale to achieve a 1uS unit time
    T4CONbits.TCKPS = 3;
    // 3 - Timer 4 and 5 set for 32 bit operation
    T4CONbits.T32 = 1;
    // 1 - Use internal Peripheral clock
    T4CONbits.TCS = 0;

    // Setting Timer 5 priority to level 4 of 7
    IPC5bits.T5IP = 4;
    // setting timer 5 sub priority to level 1 of 3
    IPC5bits.T5IS = 1;
    // Clear timer interrupt flag
    IFS0bits.T5IF = 0;
    // Enable timer interrupts
    IEC0bits.T5IE = 1;
}

Los temporizadores se inician con la siguiente función:

void Time_Out(unsigned int uTime)
{
    T4CONbits.ON = 0;
    TMR4 = 0;
    TMR5 = 0;
    Global_TimeOut = 0;

    PR4 = uTime;

    T4CONbits.ON = 1;
}

Por lo que puedo decir, he hecho todo lo necesario.

Avísame si necesitas información adicional.

    
pregunta Volcano

2 respuestas

2

También tuve que activar las interrupciones globales. Es un poco un poco escondido.

Está un poco dentro del registro de estado del coprocesador, y puedes habilitarlo mediante:

__asm__("EI");

o deshabilítelo usando:

__asm__("DI");
    
respondido por el Volcano
0

Este es el ejemplo que funciona, lo estoy pegando de uno de mis proyectos actuales:

int main(void) {

T2CONbits.T32 = 1;    //32-bit timer
T2CONbits.ON = 1;    //start
PR2 = 0xFFFF;
PR3 = 0xFFFF;
IPC3bits.T3IP = 1;    //interrupt priority
IFS0CLR = _IFS0_T3IF_MASK;
IEC0SET = _IEC0_T3IE_MASK;          //Timer 3 interrupt (for 2-3 pair

while(1);

}

//counts Timer2-3 overflows.
extern "C" void __ISR(_TIMER_3_VECTOR, IPL1AUTO) t23ISR() {

Rolls_t23++;                //increment rollover counter
IFS0CLR = _IFS0_T3IF_MASK;    //clear interrupt
}

Debería poder pegarlo en MPLABX, establecer el punto de interrupción dentro del ISR y ver cómo el programa llega a este punto de vez en cuando (verifique el período y disminuya si es necesario). Si no lo ve, asegúrese de que sus conf.bits estén en lo cierto y que el micro esté ejecutando el código (establezca otro punto de interrupción en while (1), por ejemplo).

    
respondido por el Oleg Mazurov

Lea otras preguntas en las etiquetas