PIC24FJ64GA002 no funciona a velocidad

Estoy intentando que mi PIC24FJ64GA002 funcione a 32 Mhz. Mido la frecuencia en el pin OSCO, y son solo 4 Mhz. Aquí está mi código:

config  __FOSCSEL, FNOSC_FRCPLL & IESO_OFF
config  __FOSC, FCKSM_CSECMD & OSCIOFNC_ON

                mov        #0x1182,        W0                    ; OSCCON
                mov        #0x0000,        W1                    ; CLKDIV
                mov        #0x0000,        W3                    ;OSCTUN

                mov        W0,                OSCCON
                mov        W3,                OSCTUN
                mov        W1,                CLKDIV

Respuestas (2)

Parece que no está cambiando el reloj: si se parece al dsPIC que usé recientemente, solo puede cambiar al PLL después de que se esté ejecutando el oscilador principal (INTRC o EXT XTAL).

Para ello utiliza una secuencia de desbloqueo que se detalla en el manual. Acabo de echar un vistazo rápido y está ahí para su chip con una explicación en la página 93.

Hay macros en la biblioteca C30 (solo para información si planea usar C en algún momento) para desbloquear y escribir en los registros OSC necesarios y hacer lo mismo, pero no puedo verlos mencionados allí (estará en el manual del C30).
De todos modos, intente seguir las instrucciones en esa página y avísenos, si aún no funciona, volveré a buscar (creo que podría tener uno de esos PIC24 por aquí para probar si es necesario)

EDITAR: como referencia, a continuación se muestra el código en cuestión. Debe poner 0x03 (el código para cristal externo con PLL) en W0 justo antes de que se ejecute. Probablemente desee tener un pequeño retraso después del cambio para permitir que el nuevo reloj se estabilice, y verifique OSWEN y el bit LOCK para asegurarse de que el cambio fue exitoso.

;Place the new oscillator selection in W0
OSCCONH (high byte) Unlock Sequence
MOV #OSCCONH, w1
MOV #0x78, w2
MOV #0x9A, w3
MOV.b w2, [w1]
MOV.b w3, [w1]
;Set new oscillator selection
MOV.b WREG, OSCCONH
;OSCCONL (low byte) unlock sequence
MOV #OSCCONL, w1
MOV #0x46, w2
MOV #0x57, w3
MOV.b w2, [w1]
MOV.b w3, [w1]
;Start oscillator switch operation
BSET OSCCON,#0

EDITAR

Eché otro vistazo y creo que debería poder comenzar a usar el FRC con PLL en este chip (en el dsPIC solo era con xtal de todos modos IIRC) Dejaré lo anterior allí como referencia sobre el cambio de todos modos.

Mi segunda conjetura es que creo que tiene la configuración incorrecta: se ve y el archivo .inc muestra que las configuraciones para el OSC, etc. están en config2, no en config.
Compruébelo usted mismo en su carpeta ASM30; debería estar en algo como:
C:\Program Files\Microchip\MPLAB ASM30 Suite\Support\PIC24F\inc)
También tenga en cuenta las notas sobre la configuración de los bits de configuración con macro o de forma más larga. Asegúrese de tener estos correctos.
Además, podría valer la pena verificar el bit PLL LOCK (en el registro OSCCON; consulte este documento del oscilador FRM para obtener una discusión más completa. Con los PIC más grandes, necesitará el manual de referencia familiar de todos modos, así que tome todas las partes de microchip si no los tienes)

¡Gracias por tu sugerencia! Agregué el código y parece cambiar de velocidad, pero el PLL aún no se enciende. Estoy usando el FRC (oscilador Fast RC), por lo que es 0x01, no 0x03.
Ah, pensé que estabas usando un cristal externo. Después de leer más, creo que debería poder usar el PLL sin cambiar. Ver ediciones para más pensamientos. Déjame saber como va..
¡Funciona! Cambié la línea a:
configuración __CONFIG2, FNOSC_FRCPLL y IESO_OFF

Según la ficha técnica:

La fuente de reloj del procesador se divide por dos para producir el reloj de ciclo de instrucción interno, FCY. En este documento, el reloj del ciclo de instrucción también se indica mediante FOSC/2. El reloj de ciclo de instrucción interno, FOSC/2, se puede proporcionar en el pin de E/S de OSCO para algunos modos de funcionamiento del oscilador primario.

Entonces, si está obteniendo 4 MHz del pin OSCO, entonces el oscilador interno debe estar funcionando a 8 MHz.

8MHz es la frecuencia base del oscilador Fast RC interno.

Para llegar a 32MHz los 8MHz deben pasar por el PLL para multiplicarlo por 4.

En teoría, con un reloj de 32 MHz, debería ver 16 MHz en el pin OSCO.

Esto supuestamente ya lo estás haciendo, tanto a través de los ajustes de configuración como del registro OSCCON.

Todos sus escaladores posteriores están configurados en 1: 1, lo cual es bueno.

Cosas para probar y/o aclarar:

  1. ¿El núcleo funciona realmente a solo 8MHz, o el pin OSCO está dando la frecuencia previa a PLL (poco probable)? Intente ejecutar un programa simple que alterna un pin IO ALTO y luego BAJO en el espacio de 2 T C Y y mida el ancho del pulso.
  2. Intente ejecutar el chip con un cristal externo a 8 MHz y use el PLL para intentar obtener 32 MHz. Esto puede ser solo un arreglo temporal para confirmar que se está habilitando el PLL.
  3. Investigue mirando el estado del PLL para asegurarse de que se haya asentado como lo primero que hace su programa. No pude ver exactamente qué bandera verificar para esto durante mi vistazo superficial a la hoja de datos, pero si usa el PLL, siempre debería ser lo primero que haga su programa.
Implementé su idea del programa de prueba, y parece estar yendo 1/4 de la velocidad esperada si tuviéramos 16 MIPS. Por alguna razón, el PLL no se bloquea. Probé con otro chip para ver si estaba defectuoso, pero no sirvió de nada.
Estoy usando MPLab X Beta 7.12. Todavía no he actualizado a la final. No sé si eso podría marcar la diferencia.