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

2

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?

    
pregunta udushu

1 respuesta

4

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

enlace

Cuando habilitas 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érica. Si no definió una dirección legal para el periférico, el vector de interrupción periférica tendrá una dirección desconocida (quizás 0) y cuando la interrupción se activará, irá a esa dirección y pueden ocurrir cosas impredecibles

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

cuando escribas:

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

}

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

y cuando escribas:

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

}

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

    
respondido por el Ran.CohenTawil

Lea otras preguntas en las etiquetas