Tengo un PIC18F26J50 y quiero que el timer0 emita una señal de 1Hz en RA6. Ahora estoy recibiendo ~ 800Hz con mi configuración actual. El reloj es 48MHz / 4 = 12MHz en RA6 (si INTOSCPLLO está habilitado). El compilador es C18.
Aquí está mi código, que obviamente es incorrecto y necesito averiguar cuál es el problema y entender cómo funciona esto.
BYTE Timer0Init( WORD wTimeInterval )
{
UINT16 timerRegValue;
INT8 rc = ERROR_INVALID_COMMAND;
const UINT16 timerPeriodInSeconds = 1;
const UINT32 clockFreq = GetSystemClock();
const UINT16 prescalerValue = (256);
const UINT16 resolution = 65536;
interruptsDisableAll();
//! configure the timer 0 for 16 bit mode and preescaler of 256
T0CONbits.TMR0ON = TMR0ON_OFF; //! turn off
T0CONbits.T08BIT = T08BIT_LEN_16; //! select the 16 bit mode
T0CONbits.T0CS = T0CS_INT; //! internal clock
T0CONbits.T0SE = 0;
T0CONbits.PSA = PSA_PREESC_ASSIGN; //! use the prescaler
T0CONbits.T0PS = T0PS_PREESC_1_256; //! 1/? prescaler
timerRegValue = ( clockFreq * timerPeriodInSeconds );
timerRegValue = (UINT16)( timerRegValue/(4*prescalerValue) );
timerRegValue = resolution - timerRegValue;
reloadValue_ = timerRegValue;
writeTMR0Register( timerRegValue );
INTCONbits.TMR0IF = 0; //! clear the interrupt flag
INTCONbits.TMR0IE = 1;
T0CONbits.TMR0ON = TMR0ON_ON; //! turn on
interruptsEnableAll();
rc = ERROR_SUCCESS;
return rc;
}
Obtuve estos cálculos de una fórmula que encontré en Internet. Leí y releí la hoja de datos y los cálculos parecen estar bien. Entonces, ¿cuál es el problema de todos modos?
Cualquier ayuda es realmente apreciada!
Gracias.