Tengo un problema peculiar con el temporizador en el DSPIC33F. Necesito crear una función de demora 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 bucle while esperando a que se establezca el indicador de interrupción. Ver código abajo:
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 de TMR2 están desactivadas. Sin embargo, si las interrupciones de 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.something). No configuré el ISR para TMR2. Todas las demás interrupciones están deshabilitadas.
A pesar de que he logrado mi objetivo de crear la función de retraso, todavía me pregunto sobre las posibles razones para el reinicio del firmware. ¿Se debe a que, por alguna razón, puedo abordar el indicador de interrupción solo dentro del ISR? ¿O hay alguna otra razón?