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.