Estoy tratando de configurar el Temporizador 1 de una pic24h a 1 ms por cada tictac del temporizador pero parece que no soy capaz de obtener los cálculos para coincidir con mis resultados.
Tengo un oscilador externo de 20MHz (con una resistencia de 1M en paralelo para estabilidad) y creo que lo tengo habilitado con los siguientes bits de configuración establecidos en el código:
#pragma config FNOSC = PRIPLL // Oscillator Mode (Primary Oscillator (XT, HS, EC) w/ PLL)
#pragma config IESO = ON // Internal External Switch Over Mode (Start-up device with FRC, then automatically switch to user-selected oscillator source when ready)
Estoy alternando un pin y mirándolo en el visor para verificar mis cálculos. Pensé que el cálculo es el siguiente:
// ms_per_tick = ((F_OSC / 2)/prescaler)^-1 * PR1
// = ((20MHz / 2) / 8)^-1 * 4200
// NO= 1ms
bit un valor de PR1 = 4200 es lo más cercano que puedo llegar a un tick de 1 ms.
¿Qué me estoy perdiendo? ¿Cambia el PLL el valor de lo que creo que es F_OSC? ¿Hay alguna forma de validar F_OSC?
El ISR solo incrementa una variable y borra el indicador de interrupción. Aquí está el código de inicialización:
T1CONbits.TCKPS = 0b01; // configure the timer prescaler to divide-by-8
T1CONbits.TCS = 0; // do NOT use the external clock
PR1 = 4200; // configure the timer period
// configure the Timer1 interrupt
_T1IF = 0; // begin with the interrupt flag cleared
_T1IE = 1; // enable the interrupt
T1CONbits.TON = 1; // turn on timer1
Estoy empezando a aprender más sobre el PLL a través de algunos SFR:
CLKDIV is: 0x3040 (PLLPOST = 1, PLLPRE = 0)
PLLFBD is: 0x0030 (PLLDIV = 48)
También encontré esto en la página 16 de la hoja de datos:
"Si el PLL del dispositivo de destino está habilitado y configurado para el dispositivo de arranque del oscilador, la frecuencia máxima de la fuente del oscilador debe estar limitado a ≤8 MHz para el inicio con el PLL habilitado para cumplir Con condiciones de arranque del dispositivo PLL. Esto significa que si el externo La frecuencia del oscilador está fuera de este rango, la aplicación debe Arranque primero en el modo FRC. La configuración predeterminada de PLL después de un POR con una frecuencia de oscilador fuera de este rango violará la Velocidad de funcionamiento del dispositivo. Una vez que el dispositivo se enciende, la aplicación El firmware puede inicializar los SFRs PLL, CLKDIV y PLLDBF a un adecuado y luego realice un cambio de reloj al reloj Oscillator + PLL fuente. Tenga en cuenta que el cambio de reloj debe estar habilitado en el dispositivo Palabra de configuración. "
Ahora, lo primero que ejecuto después de main es este código de ejemplo:
void ConfigureOscillator(void) {
// Disable the Watch Dog Timer
RCONbits.SWDTEN = 0;
// When clock switch occurs switch to Prim Osc (HS, XT, EC)with PLL
__builtin_write_OSCCONH(0x03); // Set OSCCONH for clock switch
__builtin_write_OSCCONL(0x01); // Start clock switching
// Wait for Clock switch to occur
while(OSCCONbits.COSC != 0b011);
// Wait for PLL to lock, if PLL is used
while (OSCCONbits.LOCK != 1);
}