¿Por qué DSPIC33F se reinicia cuando se aborda el indicador de interrupción del temporizador?

Tengo un problema peculiar con el temporizador del DSPIC33F. Necesito crear una función de retardo y he decidido usar el temporizador 2 para contar el número de ciclos de instrucción. La función habilitaría el temporizador y luego esperaría en el ciclo while esperando que se establezca el indicador de interrupción. Vea el código a continuación:

T2CONbits.TON = 0;                  // disable Timer 2  
IFS0bits.T2IF = 0;                  // reset Timer 2 interrupt flag
TMR2 = 0;                           // reset timer accumulator
T2CONbits.TON = 1;                  // enable Timer 2

while(!IFS0bits.T2IF);              // Wait until until the timer 2 timeout
IFS0bits.T2IF = 0;                  // reset Timer 2 interrupt flag

T2CONbits.TON = 0;                  // disable Timer 2

La función funciona perfectamente bien si las interrupciones TMR2 están deshabilitadas. Sin embargo, si las interrupciones TMR2 están habilitadas, el firmware se reinicia cuando se establece el indicador de interrupción. Este reinicio solo ocurre cuando ejecuto el código, pero no durante la ejecución paso a paso (estoy usando el ICD3 con MPLab 8.algo). No configuré el ISR para TMR2. Todas las demás interrupciones están deshabilitadas.

Aunque he logrado mi objetivo de crear la función de retraso, todavía me pregunto sobre las posibles razones del reinicio del firmware. ¿Se debe a que, por alguna razón, puedo abordar el indicador de interrupción solo dentro de la ISR? ¿O hay otras razones?

Si habilita una interrupción y no especifica un ISR, sucederán cosas malas. La CPU saltará al vector independientemente de si ha puesto o no algún código ISR en su firmware...
Bueno, supongo que eso explica por qué funciona perfectamente bien durante la ejecución paso a paso. Gracias.
Las cosas pueden ser diferentes en el modo de depuración frente al modo de aplicación, especialmente con ISR (mi experiencia con Microchip).

Respuestas (1)

La página 2 en la referencia de la familia de interrupciones PIC33f ilustra cómo funciona el proceso de interrupción para el dsPIC33f:

http://ww1.microchip.com/downloads/en/DeviceDoc/70300C.pdf

Cuando habilita una interrupción (por ejemplo, T2IE) y la interrupción se dispara, va a la ubicación de la dirección que se encuentra en el vector de interrupción periférico. si no definió una dirección legal para el periférico, el vector de interrupción del periférico tendrá una dirección desconocida (quizás 0) y cuando se dispare la interrupción, irá a esa dirección y pueden suceder cosas impredecibles

en su caso, suponiendo que el bit ALTIVT (INTCON2<15>) esté borrado, cuando se active la interrupción TMR2, irá a la ubicación de la dirección que se encuentra en 0x000022.

cuando escribes:

void __attribute__((__interrupt__, auto_psv)) _T2Interrupt (void)
{

}

en realidad le está diciendo a su compilador que le gustaría colocar la dirección del inicio de este código en la dirección 0x000022 (dirección IVT TMR2)

y cuando escribes:

void __attribute__((__interrupt__, auto_psv)) _AltT2Interrupt (void)
{

}

le está diciendo a su compilador que coloque la dirección del inicio de este código en la dirección 0x000122 (dirección AIVT TMR2)