TODOPIC

Microcontroladores PIC => dsPIC => Mensaje iniciado por: anton en 04 de Enero de 2012, 22:43:06

Título: Timer solo interrumpe 1 vez
Publicado por: anton en 04 de Enero de 2012, 22:43:06

Hola a todos, estoy programando un dsPIC30F4013 con C30, y tengo un problema: programo el Timer1 para que se active desde un boton fisico
(conectado a INT1), para que al presionar el boton, haga un toggle de un puerto de salida cada 0.5 segundos, el problema es que sólo hace el toggle una vez,
no continuamente. (NOTA: el boton tiene controlado el bounce mediante hardware).

El codigo es el siguiente:

int main(void)
{
  // INITIALIZATION
  //Init();
  TRISB = 0;
  IEC1bits.INT1IE = 1;
  IEC1bits.INT2IE = 1;
  // GENERAL LOOP
  loop:

  //vacio durante la prueba actual

  goto loop;

} //main

void _INT1Interrupt(void)   //BOTON VERDE
{
  IFS1bits.INT1IF = 0;      //clear interrupt flag
 
  TMR1 = 0;                 //borra el timer
  PR1 = 0xE4E2;             //Pone el periodo de T1 a d58,594 que equivale a 0.5 segs
  IEC0bits.T1IE = 1;        //Habilita la interrupcion de T1
  T1CON = 0x8030;           //Activa el Timer con Preescaler a 1:256, con OSC interno 
  PORTBbits.RB2 = 1;
 
}

void _T1Interrupt(void)     //TIMER 1
{
  IFS0bits.T1IF = 0;        //clear interrupt flag

  PORTBbits.RB2 = - PORTBbits.RB2;  //toggle bit
 
}

NOTA: la interrupcion del boton, si funciona cada vez que éste es presionado. Su ayuda sera muy apreciada.

Título: Re: Timer solo interrumpe 1 vez
Publicado por: Nocturno en 05 de Enero de 2012, 03:27:44
Se te ha olvidado borrar el flag de interrupción. Mete esto dentro de la función _INT1Interrupt
IFS1bits.INT1IF=0;

y esto otro dentro de la del timer:
IFS0bits.T1IF=0;
Título: Re: Timer solo interrumpe 1 vez
Publicado por: anton en 05 de Enero de 2012, 23:22:56
Gracias por responder Nocturno.


Sin embargo, nota cómo si se borran los flags de ambas interrupciones, es la primera instruccion dentro de cada ISR.  :(


Saludos
Título: Re: Timer solo interrumpe 1 vez
Publicado por: fram_22 en 06 de Enero de 2012, 03:03:44
quizas sea una tonteria pero no veo que configures el puerto b como digital.

Hay un registro (ADPCFG) donde configuras los pines que se comparten con el ADC como digitales y generalmente el puerto b contiene pines analógicos. Cuando no haces esta configuracion el puerto se comporta de modo erratico. Asi que aun si estra al interrupción el toggle no funcionará bien.
Título: Re: Timer solo interrumpe 1 vez
Publicado por: Nocturno en 06 de Enero de 2012, 03:31:14
Gracias por responder Nocturno.


Sin embargo, nota cómo si se borran los flags de ambas interrupciones, es la primera instruccion dentro de cada ISR.  :(


Saludos

Joder, estoy ciego, no los vi a pesar de haberlo mirado. Disculpa