Cambio de reloj en PIC24

0

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

    
pregunta John Birckhead

1 respuesta

0

Gracias por cualquier persona que estaba buscando ayuda.

Como mencioné, estoy usando el compilador PICC de CCS en este proyecto. Yo debería haber sabido. Su función incorporada "setup_oscillator" maneja todos los códigos de desbloqueo y cambio de reloj. Muy bonito compilador.

Probé el código usando el compilador XC de Microchip usando la sugerencia de @Laszlo Valko y funciona, así que debo haber tenido un problema en mi sintaxis de ASM en PICC. No intenté cambiar directamente de LPRC a FRCPLL.

    
respondido por el John Birckhead

Lea otras preguntas en las etiquetas