PIC24 Timer 2/3 El indicador de interrupción no se establece

0

Estoy trabajando con un PIC24FJ1024.

Quiero probar el temporizador 2/3 (temporizador de 32 bits), escribiendo un código C, donde alterno un pin (PORTAbits.RA7) cada segundo.

Eso es parte del código:

while(!IFS0bits.T2IF);
LATAbits.LATA7 = ~LATAbits.LATA7;
IFS0bits.T2IF = 0;  

Cuando compilo y descargo en mi herramienta de desarrollo (Explorer 16/32), no veo que mi Pin (que está conectado a un LED) se alterne.

Debito el programa, y resulta que IFS0bits.T2IF no se configura, el programa solo se sienta en while(!IFS0bits.T2IF)

¿Puede alguien explicarme por qué sucede esto?

Gracias de antemano.

EDITAR: El Código

#include <xc.h>

#pragma config FWDTEN = OFF
#pragma config FNOSC = FRC //8MHz 
#pragma config ICS = PGD2

void Timer23_Init (void)
{
    /*
     Initialize T2 & 3
     from FRC
     * 1 second
     * on and off

     */

    T2CONbits.T32 = 1;//32 bit timer

    T2CONbits.TSIDL = 0;//continues through Idle Mode
    T2CONbits.TGATE = 0;//no TGATE Operationss
    T2CONbits.TCS = 0;//internal CLK SRC
    T2CONbits.TECS = 0x00;

    T2CONbits.TCKPS = 3;//1:256
    /*
      PRESCALAR = 256
     * t = 1 sec = 1000 ms = 1,000,000 us
     * Fosc = 8MHz Fosc/2 = 4MHz Tcy = 0.25 us
     * 
     * t = N*PRE*Tcy
     * N = t/(PRE*Tcy) = 1,000,000/(256*0.25) = 15,625
     * PR2 = 15625 (0x3D09)    
     */

    TMR2 = 0x00000000;
    PR2 = 15625;   

    TRISAbits.TRISA7 = 0;//output
    ANSAbits.ANSA7 = 0;//Digital
    LATAbits.LATA7 = 0;

    T2CONbits.TON = 1;
}

int main (void)
{   


    Timer23_Init ();

    while(1)
    {
        IFS0bits.T2IF = 0;

        while(!IFS0bits.T2IF);
        LATAbits.LATA7 = ~LATAbits.LATA7;
        IFS0bits.T2IF = 0;  
    }

    return 0;
}
    
pregunta Forat

2 respuestas

1
  

¿Puede alguien explicarme por qué sucede esto?

La bandera está casi seguramente disparando y su pin led volteado. Excepto que el pin no está en modo GPIO.

    
respondido por el dannyf
0

Aunque Timer2 y Timer3 trabajan juntos en hardware como un temporizador de 32 bits, los cargaría como dos registros de 16 bits. Es poco probable que el compilador sepa que los está tratando como un par. Yo haría lo mismo para PR2 y PR3. Además, noté en una hoja de datos similar (no el número de pieza exacto) que la interrupción del temporizador superior (T3IF no T2IF) es la interrupción que se verá afectada, no la T2IF inferior cuando están concatenadas.

    
respondido por el Entrepreneur

Lea otras preguntas en las etiquetas