No se puede ejecutar PIC24EP128MC206 a la velocidad nominal

4

Obtuve un PIC24EP128MC206 debido a su velocidad nominal de 70 MIPS. (Por el motivo que sea, se califica en MIPS, mientras que la mayoría de los otros PIC24 se califican en MHz).

Como entiendo que una instrucción en el PIC24 toma un ciclo de reloj Fcy, estoy tratando de configurar el reloj para que Fcy esté lo más cerca posible de 70 MHz. Sin embargo, parece que solo puedo ejecutarlo a aproximadamente la mitad de la velocidad nominal, alrededor de 31,5 MHz. Algo más alto que eso, y el PLL deja de hacer su cosa.

Estoy usando el reloj FRC interno, ya que no necesito la sincronización exacta en ningún lugar (por ejemplo, no uso UART). La frecuencia nominal de FRC es de 7,37 MHz, que se puede ajustar de 6,52 MHz a 8,20 MHz mediante el registro OSCTUN.

Como referencia, estoy usando la hoja de datos PIC24EPXXXGP / MC20X . Aquí está la sección relevante sobre la configuración del reloj:

yaquíestámicódigodeconfiguración:

//configurationfusesforPIC24EP128MC206_FICD(ICS_PGD1&JTAGEN_OFF)_FWDT(FWDTEN_OFF)_FOSC(POSCMD_NONE&OSCIOFNC_OFF&IOL1WAY_ON&FCKSM_CSECME)_FOSCSEL(FNOSC_FRC&IESO_ON)_FGS(GWRP_OFF&GCP_OFF)intmain(void){RCONbits.SWDTEN=0;//DisableWatchDogTimer//configureOscillator//Fosc=Fin*M/(N1*N2),Fcy=Fosc/2//withdefault7.37MHzFRCclk,Fcy=approx7.37*34/(2*2*2)=31.3MHzPLLFBD=32;//M=34(ANYTHINGHIGHERDOESN'TWORK)CLKDIVbits.PLLPRE=0;//N1=2CLKDIVbits.PLLPOST=0;//N2=2__builtin_write_OSCCONH(0x01);//setuptoswitchtoFRC+PLL__builtin_write_OSCCONL(OSCCON|0x01);//dotheswitchwhile(OSCCONbits.COSC!=0x00);//waitforswitchtotakeplacewhile(OSCCONbits.LOCK!=1){};//waitforPLLlock

Fsys=34*7.37/2=125.29queestácercaperonopordebajodelrangoaceptablede120a340MHz.

Conlosvaloresquesemuestranarriba,elrelojfuncionayobtengounasalidaagradabledealrededorde31,5MHz,medidaconelpinCLKO(queeselmismoqueFcy,elrelojdelciclodeinstrucciones).El31.5MHzsecomparabienconmivalorcalculadode31.3MHzanterior,dadoqueelrelojFRCde7.37MHzpuedeestarapagadounpoco.

Me gustaría usar un valor M de 76, que me daría un tiempo de ciclo de instrucción de 70 MHz.

Pero si hago que el valor de M sea superior a 34, el PLL se vuelve inestable y la salida del reloj vuelve a aproximadamente 3,70 MHz, que es la mitad de la frecuencia FRC (lo que implica que el circuito del PLL está fuera de la imagen). Cuando se está ejecutando, a veces puedo ver algunos destellos de la frecuencia más alta en el alcance, como si el PLL está intentando iniciarse y no se puede estabilizar. Como se puede ver en mi ejemplo de código, estoy esperando el bloqueo de PLL antes de continuar.

ACTUALIZACIÓN: Esto parece estar relacionado de alguna manera con la frecuencia final, no con la frecuencia PLL Fsys. Probé la siguiente combinación y también funcionó:

PLLFBD = 120;                  // M=122     (ANYTHING HIGHER DOESN'T WORK)
CLKDIVbits.PLLPRE = 1;         // N1=3
CLKDIVbits.PLLPOST = 0;        // N2=4

que da como resultado una frecuencia PLL de 300 MHz y un Fcyc de 37.46 MHz (medida, 37.7).

Me preocupaba un poco, tal vez no podría correr a 70 MIPS usando el FRC interno, pero la hoja de datos del oscilador PIC24E dice que "la salida del poscaler FRC se puede usar con el PLL interno para aumentar la frecuencia del sistema (FOSC) hasta 140 MHz para 70 ciclos de instrucción MIPS. así que no estoy tratando de hacer lo imposible.

Otra ACTUALIZACIÓN: probé una segunda placa y obtuve los mismos resultados; parece que no puedo configurar Fcy en una frecuencia superior a 40 MHz sin que se pierda el PLL. También intenté conectar un reloj de 24 MHz con búfer en OSC1 y configurar el sistema para usarlo como un reloj extral (EC) con PLL. Exactamente los mismos resultados.

¿Cómo puedo hacer que funcione un reloj más rápido?

ACTUALIZACIÓN FINAL: Resulta que la persona que realiza el diseño de la placa puso un límite de 0.1 uF en VCAP sin mirar la hoja de datos y tampoco la atrapé. Cambié eso con un ESR bajo de 10 uF 16v (se solicitó una hoja de datos de 4.7 uF o superior) y ahora puedo correr a 70 MIPS. Vea la respuesta aceptada sobre cómo encontré que este era el problema.

    
pregunta tcrosley

5 respuestas

4

Debería consultar el ejemplo 7-2 en el manual de referencia de la familia pic24E (FRM) titulado "Ejemplo de código para usar PLL con FRC interno de 7.37 MHz":

// Select Internal FRC at POR
_FOSCSEL(FNOSC_FRC & IESO_OFF);
// Enable Clock Switching and Configure Primary Oscillator in XT mode
_FOSC(FCKSM_CSECMD & OSCIOFNC_OFF & POSCMD_NONE);

int main()
{
    // Configure PLL prescaler, PLL postscaler, PLL divisor
    PLLFBD=63;            // M=65
    CLKDIVbits.PLLPOST=0; // N2=2
    CLKDIVbits.PLLPRE=0;  // N1=2

    // Initiate Clock Switch to FRC oscillator with PLL (NOSC=0b001)
    __builtin_write_OSCCONH(0x01);
    __builtin_write_OSCCONL(OSCCON | 0x01);

    // Wait for Clock switch to occur
    while (OSCCONbits.COSC!= 0b001);

    // Wait for PLL to lock
    while (OSCCONbits.LOCK!= 1);
}

Parece que el paso crítico que te estás perdiendo es __builtin_write_OSCCONL (OSCCON | 0x01);

También, mirando las matemáticas: 7.37 * (76 / (2 * 2)) == 140.03MHz que está ligeramente fuera del rango permitido, asumiendo que 140MHz es en realidad el rango máximo (no me preguntes por qué, pero para por alguna razón parece que puede ser de 120MHz).

Si esto todavía no funciona, quizás haya un problema con la fuente de alimentación. El oscilador interno de FRC es inestable bajo tensión y tensión de tensión, por lo que quizás debería verificar si hay demasiado ruido. Esto haría que el FRC sea tan difícil como el VCO utilizado en el PLL, evitando un bloqueo.

Si observa la tabla 30-18 en la hoja de datos pic24EP128MC206, le indica que en el rango de temperatura y voltaje tiene aproximadamente un ± 1% para algunos modelos y un ± 2% para otros. La Figura 31-9 muestra la variación con un voltaje estable en un rango de temperatura. No parece haber un análisis de la variación de voltaje a una temperatura estable.

Si estás tratando de conseguir una carrera estable a una alta frecuencia, solo tomaría un cristal.

EDITAR (del comentario): Por lo tanto, a partir de los sonidos de tus otras publicaciones sobre tus condiciones, parece que deberías buscar un problema en otra parte. ¿Cuál es la frecuencia de la ondulación? ¿Ha dimensionado correctamente el condensador Vreg interno? Parece que, dado que este es un problema de bloqueo y no un problema de configuración, tiene otros problemas con la placa que no están relacionados con su código.

EDITAR:

¡Me alegro de que esta haya sido la respuesta correcta! ¡Buena suerte depurando el resto del tablero!

    
respondido por el Kit Scuzz
1

Eche un vistazo al Manual de referencia de PIC24E, Sección 07. Oscilador . Tiene una explicación más detallada de la sección del oscilador y el PLL. Especialmente, en la página 7-26, tiene un ejemplo de exactamente lo que quiere: use el FRC y el PLL (aunque sea para 60MHz). Este ejemplo configura los bits de configuración de manera diferente a su código de ejemplo - esp. no cambia automáticamente a la fuente de reloj definida por el usuario.

También veo que habilitas el monitor del reloj, puede ser que se active por alguna razón y luego vuelva a la FRC normal.

Con respecto al PLLDIV: creo que esto es un error. Las hojas de datos siempre hablan de los valores utilizados (por ejemplo, PLLDIV), que son parte de registros más grandes (PLLFBD en este caso). Lo mismo ocurre con PLLPOST y PLLPRE en la imagen que publicaste, son parte del registro CLKDIV.

    
respondido por el hli
1

No estoy familiarizado con los PIC, y obviamente parece que sabes lo que estás haciendo. ¿Pero estás seguro de que el PLLDIV no existe? ¿Estás seguro de que tienes el chip o la hoja de datos correcta?

TABLA A-1 PRINCIPALES ACTUALIZACIONES DE SECCIÓN estados:

  

Se actualizaron los valores de Todos los restablecimientos para CLKDIV y PLLFBD en el sistema   Mapa de registro de control (ver Tabla 4-35).

Entonces, tal vez tengas un chip más antiguo (si esto afecta algo, solo hojeé la hoja de datos)

  

Hay una pequeña inconsistencia en la documentación; Figura 9-2 y   La ecuación 9-2 se refiere a un registro PLLDIV, que no existe en este   microcontrolador

Si está seguro de tener el chip y la hoja de datos correctos, eso parece ser una gran discrepancia, lo suficiente como para hacerme creer que puede tener un chip falso o defectuoso (siempre que sepa lo que está haciendo. )

Y parece que está siguiendo esto, 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 3 MHz < FIN < 5.5 MHz para cumplir con el dispositivo PLL   Condiciones de puesta en marcha. Esto significa que si el oscilador externo   La frecuencia está fuera de este rango, la aplicación debe iniciarse en el   El modo FRC primero. La configuración predeterminada de PLL después de un POR con un   La frecuencia del oscilador fuera de este rango violará el dispositivo   velocidad de operacion. Una vez que el dispositivo se enciende, el firmware de la aplicación   puede inicializar los SFR de PLL, CLKDIV y PLLDBF a un valor adecuado,   y luego realice un cambio de reloj a la fuente de reloj Oscillator + PLL.   Tenga en cuenta que el cambio de reloj debe estar habilitado en la Configuración del dispositivo   Palabra.

    
respondido por el Garrett Fogerlie
0

He tenido éxito con dsPICs en 50MIPS usando el oscilador RC interno y el PLL. Intenta esto:

  • Establezca la parte para usar FRC con dividir por N y PLL directamente (FRCPLL). No veo ninguna razón para comenzar con otro reloj y luego cambiar a él. También deshabilite los relojes que salen del exterior y las fuentes de osciladores externos; configúrelos como líneas GPIO si existen opciones.
  • Como las primeras líneas en main (), configure PLLFBD, PLLPOST y PLLPRE, luego espere el bloqueo de PLL.
respondido por el Adam Lawrence
0

Tuve el mismo problema con el PLL que no se bloqueó en la alta frecuencia de mi oscilador externo. Mi problema fue el ESR del capacitor en la entrada VCAP. Debe ser inferior a 1 ohmio (consulte la hoja de datos de PIC24E) y, en mi caso, el ESR era de 4 ohmios y no se estaba ejecutando.

¡Gracias por la sugerencia!

    
respondido por el Matt

Lea otras preguntas en las etiquetas