¿Cómo configurar el oscilador PIC24F?

6

Estoy codificando en PIC24F y todavía estoy luchando con la configuración del oscilador. Entre los bits de configuración y los SFR, como CLKDIV y OSCCON, estoy un 'bit' perdido ... He estado haciendo que las cosas funcionen por prueba y error, pero todavía no he entendido exactamente lo que estoy haciendo: / (como cuando finalmente entiendes punteros y tener el momento "ohh").

Creo que las partes que me faltan son:

    ¿
  • son los accesos directos de bits de configuración para SFR? se superponen?
  • ¿cuáles son los valores predeterminados / de inicio y cuáles debo tocar?
  • ¿cómo puedo verificar que el reloj esté funcionando a la velocidad correcta?

Si es necesario que sea más específico, estoy intentando configurar un PIC24FJ con un cristal externo de 12 MHz.

Editar:

// CONFIG2
#pragma config POSCMOD = HS             // Primary Oscillator Select (HS Oscillator mode selected)
#pragma config I2C1SEL = PRI            // I2C1 Pin Location Select (Use default SCL1/SDA1 pins)
#pragma config IOL1WAY = OFF            // IOLOCK Protection (IOLOCK may be changed via unlocking seq)
#pragma config OSCIOFNC = OFF           // Primary Oscillator Output Function (OSC2/CLKO/RC15 functions as CLKO (FOSC/2))
#pragma config FCKSM = CSDCMD           // Clock Switching and Monitor (Clock switching and Fail-Safe Clock Monitor are disabled)
#pragma config FNOSC = PRI              // Oscillator Select (Primary Oscillator (XT, HS, EC))
#pragma config SOSCSEL = SOSC           // Sec Oscillator Select (Default Secondary Oscillator (SOSC))
#pragma config WUTSEL = LEG             // Wake-up timer Select (Legacy Wake-up Timer)
#pragma config IESO = ON                // Internal External Switch Over Mode (IESO mode (Two-Speed Start-up) enabled)

// CONFIG1
#pragma config WDTPS = PS32768          // Watchdog Timer Postscaler (1:32,768)
#pragma config FWPSA = PR128            // WDT Prescaler (Prescaler ratio of 1:128)
#pragma config WINDIS = OFF             // Watchdog Timer Window (Windowed Watchdog Timer enabled; FWDTEN must be 1)
#pragma config FWDTEN = OFF             // Watchdog Timer Enable (Watchdog Timer is disabled)
#pragma config ICS = PGx1               // Comm Channel Select (Emulator EMUC1/EMUD1 pins are shared with PGC1/PGD1)
#pragma config GWRP = OFF               // General Code Segment Write Protect (Writes to program memory are allowed)
#pragma config GCP = OFF                // General Code Segment Code Protect (Code protection is disabled)
#pragma config JTAGEN = ON              // JTAG Port Enable (JTAG port is enabled)

Luego en el inicio de mi principal ():

OSCCONbits.COSC = 0b010;
CLKDIVbits.DOZE = 0b000;

¿Tengo derecho a asumir lo siguiente :?

#define FOSC    12000000UL
#define FCY     FOSC/2
    
pregunta Agnar

1 respuesta

4

Sí, la cadena del reloj en algunos de los PIC 24 es bastante complicada, pero todo está bien explicado en la hoja de datos y en el manual de referencia de la familia. Busque en el capítulo de la hoja de datos del oscilador, encuentre a qué capítulo del manual de referencia de familias específicas se refiere y luego lea eso. Cuidadosamente. Todo eso.

A veces me resulta útil imprimir el diagrama de reloj general generalmente en las primeras páginas del capítulo del oscilador. Esto puede ser útil para mirar mientras lee otras secciones y rellena los campos en los registros de configuración y los registros de control del oscilador de tiempo de ejecución.

Los bits de configuración son bits en "registros" especiales en los que se coloca información estática en el momento de la compilación. Estos bits se codificarán en el archivo HEX y se establecerán en la parte cuando esté programado. Debe conocerse alguna configuración para que el dispositivo pueda ejecutarse, por lo que deben configurarse antes del tiempo de ejecución. Eso es lo que son los bits de configuración. No, no son realmente SFRs.

Los valores predeterminados de todos los bits están claramente documentados en la hoja de datos. Léelo.

Dado que la cadena del reloj puede ser complicada, verificar que lo hice bien es una de las primeras cosas que hago en un nuevo proyecto. Después de asegurarme de que la parte esté inicializada y la parte de tiempo de ejecución de la cadena del reloj esté configurada como creo que debería estar, ejecuto un código como este:

loop:
    btg LATB, #0    ;toggle RBO
    bra loop

Por supuesto que escoges un pin que no daña nada si se alterna. RB0 es solo el ejemplo que elegí aquí.

La instrucción BTG toma un ciclo, y BRA toma 2. Cada iteración de bucle por lo tanto toma 3 ciclos, y un período completo de RB0 por lo tanto, 6 ciclos. Ahora mira a RB0 con un alcance y ve si realmente obtiene la frecuencia de reloj de instrucción dividida por 6.

    
respondido por el Olin Lathrop

Lea otras preguntas en las etiquetas