dspic Timer1 Interrupts Ocurre dos veces más lento

0

Tal vez me esté perdiendo algo aquí, pero en un dsPIC33FJ16GS502, diseñé Timer1 para alternar un pin a 200 Hz, pero cuando se implementa, la frecuencia es de 100 Hz. Tengo las siguientes configuraciones:

XT (HS): 16 MHz FCY: 8 MHz Precalentador: 64 PR1: 8 MHz / (200 Hz * 64) = 625

Aquí está el código:

_FOSC( POSCMD_HS & OSCIOFNC_OFF );
_FOSCSEL( FNOSC_PRI & IESO_OFF );
_FWDT( FWDTEN_OFF );

int main(int argc, char** argv) {


    OSCCONbits.COSC = 0b010;    //  HSXT no PLL
    OSCCONbits.CLKLOCK = 1;
    OSCCONbits.IOLOCK = 1;

    CLKDIVbits.ROI = 0;
    CLKDIVbits.DOZEN = 0;

    //  Set TMR1 Registers
    T1CONbits.TON = 0;              //  Shut off timer for configuration
    T1CONbits.TSIDL = 1;
    T1CONbits.TGATE = 0;
    T1CONbits.TCKPS = 0b10;         //  1:64 Prescaler
    T1CONbits.TCS = 0;              //  Use internal clock
    TMR1= 0x0000;
    PR1 = 625;
    IPC0bits.T1IP = 0x01;
    IFS0bits.T1IF = 0;
    IEC0bits.T1IE = 1;

    T1CONbits.TON = 1;              //  Turn on Timer

    TRISBbits.TRISB8 = 0;
    LATBbits.LATB8 = 1;

    while(1);
}

void __attribute__((__interrupt__, no_auto_psv)) _T1Interrupt(void){

    LATBbits.LATB8 = ~LATBbits.LATB8;
    IFS0bits.T1IF = 0;

}

Si PR1 se configuró en 312, obtendría la frecuencia de 200 Hz, pero de acuerdo con mis cálculos, PR1 establecido en 312 daría como resultado una frecuencia de 400 Hz. No tengo idea de por qué estoy fuera por un factor de 2. Estoy bastante seguro de que estoy configurando los registros correctamente.

    
pregunta superkittens

1 respuesta

4

Tu código es correcto, en realidad estás cambiando el pin a 200Hz ... Eso significa que su frecuencia es de 100Hz.

El período que está configurando en el temporizador es la distancia entre un flanco ascendente y un borde descendente, y viceversa, por lo que el período de onda será el doble del período del temporizador porque el período de onda se define como la distancia entre dos puntos ascendentes ( o cayendo) bordes.

Vaya con el valor que funcione y estará bien.

    
respondido por el Vladimir Cravero

Lea otras preguntas en las etiquetas