Cómo calcular la precarga del temporizador correctamente en PIC32MX575F

0

Estoy tratando de lograr 1 segundo en un temporizador en PIC32MX575F pero de alguna manera no lo estoy Alcanzando lo que quiero. Algunas personas dicen que tengo que mirar el PLLDIV, otras personas dicen que debería mirar el PLLMUL. He seguido un par de ecuaciones, pero ninguna de ellas está alcanzando la interrupción de 1 segundo. No sé qué estoy haciendo mal, así que quiero saber cuál es la mejor forma de calcular.

Aquí está mi código:

void initTIMER2(void) {
   T2CONbits.ON = 0;
   IFS0bits.T2IF = 0;
   T2CON = 0x0;
   TMR2 = 0;
   PR2=0x7A12; 
   T2CONbits.TCKPS = 0b111;//1:256 prescale value
   T2CONbits.T32 = 0;//16 bit timer

   IPC2bits.T2IS = 0;
   IPC2bits.T2IP = 2;
   IEC0bits.T2IE = 1;

   T2CONbits.ON = 1;
}

Estas son las confusiones que he hecho:

#pragma config FNOSC = FRC // 

#pragma config FPBDIV = DIV_1 

T2CONbits.TCKPS = 0b111

EDITADO: Después de algunas investigaciones, parece que el código está llamando a OSCConfig( OSC_FRC_PLL, OSC_PLL_MULT_20, OSC_PLL_POST_2, OSC_PB_DIV_1) en algún lugar. Ya hice cálculos con estos nuevos valores pero sin éxito. Entonces, si OSC_FRC_PLL se declara como #define OSC_FRC_PLL (1 << _OSCCON_NOSC_POSITION) , significa en la hoja de datos "001 = Oscilador RC rápido con división por N con módulo PLL (FRCDIV+PLL) ".

Por favor, eche un vistazo al Diagrama:

    
pregunta scuba

1 respuesta

2

#pragma config FNOSC = FRC // Oscillator Selection
Ha elegido el oscilador FRC de 8MHz como el reloj de su sistema, por lo que no importa cuál sea la configuración de PLLMUL o PLLDIV, ya que no está utilizando el PLL en ese modo.

#pragma config FPBDIV = DIV_1 // Peripheral Clock divisor
El reloj del bus periférico no se está dividiendo, por lo que se ajusta al mismo valor (8MHz), eso es lo que su módulo Timer2 ve como entrada.

T2CONbits.TCKPS = 0b111;//1:256 prescale value
Ha seleccionado un preescalador de 1: 256 en su módulo Timer2, por lo que se ejecutará a (8MHz / 256) = 31.25kHz

Ahora todo lo que queda es establecer PR2 en un valor apropiado.
El valor que tienes (0x6768) es 26472 decimal.
El módulo del temporizador contará desde 0 hasta que alcance ese valor, y acabamos de calcular que cuenta a 31.25 kHz, por lo que debería tomar 0.847104 segundos, y luego volver a cero y continuar contando nuevamente.
Esto debería darle una tasa de repetición de 1.18Hz

Como apunta a 1Hz, debe configurar su PR2 al mismo valor que la frecuencia de entrada del temporizador, en su caso 31250 (0x7A12).

Editar:
Entonces, a partir de sus comentarios, parece que el reloj de su sistema no es de 8MHz, sino de 80Mhz (si mi mirada rápida a los parámetros de OSCConfig es correcta). Seguir el procedimiento anterior lo llevaría a un valor de PR2 de 312500, que no se ajusta a un registro de 16 bits ... Por lo tanto, con estos ajustes no puede alcanzar una tasa de interrupción de 1Hz.

Algunas opciones pueden ser:
 - ejecuta tu Timer2 en modo de 32 bits encadenándolo a Timer3
 - ralentice el reloj del bus periférico cambiando la configuración de PB_DIV en su llamada OSCConfig ()
 - deje el Timer2 funcionando a 10Hz (que probablemente se esté ejecutando en este momento) y agregue un contador a la función de interrupción para que solo haga cosas cada 10 interrupciones

    
respondido por el brhans

Lea otras preguntas en las etiquetas