DSPIC30f timer1 no se dispara cada vez en POR

1

Estoy usando timer1 en DSPIC30f4011 para generar una interrupción cada milisegundo. Sin embargo, el ISR del temporizador 1 no se ejecuta cada vez en POR (2 de cada 10 veces). Si enciendo el chip y uso MCLR (cambiarlo a alto o bajo), el temporizador funcionará cada vez que se reinicie MCLR . ¿Hay algo que deba aclarar en el software? Ya reinicié la marca del temporizador 1.

unsigned char t2=0;
unsigned char  t1=0;
unsigned char t0=0;
void main() {
  ADPCFG=0xff;
  //timer1 setting##########
  T1IF_bit= 0;                     //clear flag 
  IEC0.T1IE         = 1;           //enable timer1 interrupt
  IPC0=0b0100000000000000;         //priority
  PR1                 = 7373;      //load
  //###########


  UART2_Init(115200);             //output something to computer


  ////////
  T1CON.TON=1;  ///start timer1
  ////////
  while(1){

    UART_Write(t2);
    UART_Write(t1);
    UART_Write(t0); 
  }
}
void Timer1Interrupt() iv IVT_ADDR_T1INTERRUPT{

  T1IF_bit= 0;  //clear the flag
  t0++;         //increment something
  if(t0==255){t1++;}
  if(t1==255){t2++;}
}
    
pregunta Timtianyang

1 respuesta

1

Si solo se inicia algunas veces, probablemente sea un problema de hardware. Compruebe que el tiempo de subida de la fuente de alimentación esté dentro de las especificaciones del PIC. De lo contrario, puede ser necesario un circuito de reinicio externo. El temporizador de encendido y la detección de caída de tensión (si existe) también pueden ayudar.

No parece que el firmware sea tan relevante para esto, pero hay varios problemas con él. La constante de código duro, como 7373, elegida mágicamente del aire es una muy mala idea. Además, su rutina de incremento de 3 bytes en la interrupción está rota. Es curioso cómo tienes que pararte sobre tu cabeza para incrementar 3 bytes en C cuando esto sería más simple en el ensamblador. No he hecho una rutina de interrupción en C30, así que no estoy seguro de esto, pero no veo ninguna manera obvia de que el compilador sepa que se trata de una rutina de interrupción y, por lo tanto, termine con una instrucción RETFIE en lugar de RETURN . ¿No hay algún pragma que deba murmurar al compilador para que produzca una rutina de interrupción válida?

    
respondido por el Olin Lathrop

Lea otras preguntas en las etiquetas