Estoy tratando de configurar el temporizador 1 de un pictograma de 24h a 1ms por cada tic de temporizador, pero no parece que pueda hacer que las matemáticas coincidan con mis resultados.
Tengo un oscilador externo de 20MHz (con una resistencia de 1M en paralelo para la estabilidad) y creo que lo tengo habilitado con los siguientes bits de configuración establecidos en 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 cambiando un alfiler y mirándolo en la pantalla para comprobar mis matemáticas. Pensé que el cálculo era 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 1ms.
¿Qué me estoy perdiendo? ¿Cambia el PLL el valor de lo que creo que es F_OSC. ¿Hay alguna manera de validar F_OSC?
El ISR sólo incrementa una variable y borra la bandera 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 acabo de encontrar esto en la página 16 de la hoja de datos:
"Si el PLL del dispositivo objetivo está habilitado y configurado para el oscilador de arranque del dispositivo, la frecuencia máxima de la fuente del oscilador debe limitarse a ≤8 MHz para la puesta en marcha con el PLL habilitado para cumplir con las condiciones de arranque del dispositivo PLL. Esto significa que si el exterior frecuencia del oscilador está fuera de este rango, la aplicación debe iniciar en el modo FRC primero. Los ajustes PLL por defecto 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 PLL SFR, CLKDIV y PLLDBF a un adecuado y luego realizar un cambio de reloj al oscilador + reloj PLL fuente. Tenga en cuenta que la conmutación del reloj debe estar activada en el dispositivo Palabra de configuración".
Ahora, la primera cosa que voy a hacer después de la principal 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);
}
0 votos
¿Dónde está el código de inicialización del temporizador y el ISR? Además, bastante seguro de que desea FNOSC ajustado a HSPLL, pero vuelva a comprobar que para los PICs de 16 bits.
0 votos
@MattYoung HSPLL no es una opción en el menú desplegable en Ventana >> Vistas de memoria PIC >> Bits de configuración para este PIC.