Estoy ejecutando un PIC24F32KA302 utilizando la fuente de reloj Low Power RC with Postscaler (FRCDIV) a 250 KHz. Me gustaría cambiar el reloj en el código a 8 MHz FRC Oscillator con Postscaler y el módulo PLL (FRCPLL). Estoy usando el compilador CCS PIC-C. Mi código para realizar el cambio de reloj:
void oscillator_16Mhz()
{
disable_interrupts(GLOBAL);
#asm
MOV #0x742,W1 // OSCONH
MOV #0x78,W2
MOV #0x9A,W3
MOV #0x01,WREG
MOV.b W2,[W1]
MOV.b W3,[W1]
MOV.b WREG,OSCONH
MOV #0x743,W1 // OSCONH
MOV #0x46,W2
MOV #0x57,W3
MOV.b W2,[W1]
MOV.b W3,[W1]
BSET OSCON,#0
#endasm
delay_ms(200);
// #use delay(internal=16MHz) // For wifi Interface
enable_interrupts(GLOBAL);
}
El listado del desensamblador:
98: void oscillator_16Mhz()
99:
{
100: disable_interrupts(GLOBAL);
0EC6 A9E081 bclr.b 0x0081,#7
0EC8 200E04 mov.w #0xe0,0x0008
0ECA 880214 mov.w 0x0008,0x0042
0ECC A8E081 bset.b 0x0081,#7
101: #asm
102: MOV #0x742,W1 //OSCONH
0ECE 207421 mov.w #0x742,0x0002
103: MOV #0x78,W2
0ED0 200782 mov.w #0x78,0x0004
104: MOV #0x9A,W3
0ED2 2009A3 mov.w #0x9a,0x0006
105: MOV #0x01,WREG
0ED4 200010 mov.w #0x1,0x0000
106: MOV.b W2,[W1]
0ED6 784882 mov.b 0x0004,[0x0002]
107: MOV.b W3,[W1]
0ED8 784883 mov.b 0x0006,[0x0002]
108: MOV.b WREG,OSCONH
0EDA B7E742 mov.b 0x0000,0x0742
109: MOV #0x743,W1 //OSCONH
0EDC 207431 mov.w #0x743,0x0002
110: MOV #0x46,W2
0EDE 200462 mov.w #0x46,0x0004
111: MOV #0x57,W3
0EE0 200573 mov.w #0x57,0x0006
112: MOV.b W2,[W1]
0EE2 784882 mov.b 0x0004,[0x0002]
113: MOV.b W3,[W1]
0EE4 784883 mov.b 0x0006,[0x0002]
114: BSET OSCON,#0
0EE6 A80742 bset.b 0x0742,#0
115: #endasm
116: delay_ms(200);
0EE8 090BB6 repeat #2998
0EEA 000000 nop
117:
118: // #use delay(internal=16MHz)//For wifi Interface
119: enable_interrupts(GLOBAL);
0EEC A9E081 bclr.b 0x0081,#7
0EEE EF2042 clr.w 0x0042
0EF0 A8E081 bset.b 0x0081,#7
0EF2 060000 return
120: }
Puedo configurar el oscilador para que se ejecute a la frecuencia deseada en el código al inicio del programa, y ambas frecuencias funcionan. No puedo cambiar entre los relojes. La frecuencia del reloj no cambia cuando ejecuto esta rutina.
Si alguien tiene alguna experiencia con el cambio de reloj en estas partes, ciertamente aprecio la ayuda