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.