¿Cómo configurar PIC24H para un oscilador externo de 20MHz?

2

La adición básica de un resonador externo de 20MHz se está volviendo mucho más dolorosa de lo que pensaba. Tengo una configuración de tablero con un paquete DIP de un PIC24HJ128GP502. Nada especial, y ha podido parpadear un LED con el FRC interno para el reloj. Mis bits de configuración se establecen en el código de la siguiente manera:

// General Segment code-protection configuration:
// leave code protection off,                       GSS_OFF
// disable code protection,                         GCP_OFF
// disable write protection,                        GWRP_OFF
_FGS(GSS_OFF & GCP_OFF & GWRP_OFF)

// OSCillator SELection:
// Primary oscillator (XT, HS, EC) w/ PLL           FNOSC_PRIPLL
// enable two-speed oscillator startup              IESO_ON
_FOSCSEL(FNOSC_PRIPLL & IESO_ON)


// OSCillator configuration:
//   enable clock switching but not monitoring,     FCKSM_CSECMD
//   allow the RPn pins to be continually remapped, IOL1WAY_OFF
//   leave OSC2 pin as clock pin (not digital I/O)  OSCIOFNC_OFF
//   High-Speed (10-32MHz crystal) Oscillator,      POSCMD_HS
_FOSC(FCKSM_CSECMD & IOL1WAY_OFF & OSCIOFNC_OFF & POSCMD_HS)

// WatchDog Timer configuration:
//   disable the watchdog timer,                    FWDTEN_OFF
_FWDT(FWDTEN_OFF)

// Power-On-Reset configuration:
//   map I2C pins to SDA1/SCL1,                     ALTI2C_OFF
//   use the smallest power-on-reset value of 2ms,  FPWRT_PWR2
_FPOR(ALTI2C_OFF & FPWRT_PWR2)

// Debugger configuration:
//  JTAG is enabled,                                JTAGEN_ON
//  communicate on PGC1/EMUC1 and PGD1/EMUD1,       ICS_PGD1
_FICD(JTAGEN_ON & ICS_PGD1)

int main(void) {
  // STAYS HERE FOREVER, NEVER LOCKS!
  while (!OSCCONbits.LOCK);         // wait for the PLL to lock
  ...  

Las únicas perillas (o lugares en los que puedo ir mal que conozco) están en _FOSCSEL() y _FOSC() . He intentado casi todas las iteraciones de esos bits de configuración que tenían algún sentido (incluso un poquito ... incluso los que no tenían sentido). También he intentado programarlo en modo de depuración así como en modo de lanzamiento.

Entorno: MPLab v8.88.00.00, compilador C30

Investigación relevante: - Sección 39.13 sobre inicio de dos velocidades: enlace - Sección 2.7 de la ficha técnica. - el archivo de encabezado en general, p24HJ128GP502.h, para encontrar las macros correctas y las máscaras de configuración.

Circuito: Fuente de alimentación 3.3V el pin central del resonador va a GND, los dos pines externos van a OSC1 y OSC2, hay una resistencia de 1 Mhm que conecta cada uno de los dos pines externos para el resonador de 3 pines (para estabilidad) resonador: ZTT 20.00MX enlace anuario

    
pregunta tarabyte

1 respuesta

1

Además de que el cristal suena como si fuera realmente un resonador (¿número de pieza?), también es necesario desbloquear el registro OSCCON para cambiar las fuentes del reloj. El compilador proporciona funciones integradas para hacer esto, como se describe en la hoja de datos.

Este es un ejemplo de la hoja de datos del código para cambiar al Oscilador primario con PLL (debe verificar / configurar los bits del divisor / multiplicador de acuerdo con su frecuencia; esto es para el cristal de 20Mhz y la frecuencia de operación de 80Mhz):

int main()
{
// Configure PLL prescaler, PLL postscaler, PLL divisor
PLLFBD=30; // M = 32
CLKDIVbits.PLLPOST=0; // N1 = 2
CLKDIVbits.PLLPRE=2; // N2 = 4
// Initiate Clock Switch to Primary Oscillator with PLL (NOSC = 0b011)
__builtin_write_OSCCONH(0x03);
__builtin_write_OSCCONL(0x01);
// Wait for Clock switch to occur
while (OSCCONbits.COSC != 0b011);
// Wait for PLL to lock
while(OSCCONbits.LOCK!=1) {};
} 
    
respondido por el Oli Glaser

Lea otras preguntas en las etiquetas