Autor Tema: Alternar encendido y apagado de PLL utilizando oscilador interno.  (Leído 2191 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado manwenwe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2211
Hola, antes de todo quiero mandar un saludo cordial a todos los foreros :-/ LLevo 2 o 3 meses muy liado y sin aparecer por el foro. Espero que todo siga igual o mejor que antes XD.

Cuento mi duda: el caso es que necesito trabajar a altas frecuencias con mi PIC18F4620, pero al mismo tiempo tengo un hardware secundario que me limita la frecuencia de trabajo. Lo que necesitoes  ir alternado 2 frecuencias. En principio pensé en utilizar un cristal de 10 Mhz y PLL=4 (el PLL para este PIC es fijo a 4) pero con esta configuraión, si no me equivoco, no tengo ninguna opción de utilizar una segunda frecuencia, razonablemente alta(necesitaría entre 5Mhz y 25Mhz donde mi hardware externo si que funciona) puesto que el bit PLLEN(registro OSCTUNE) no se puede utilizar con HS y al mismo tiempo el registro OSCCON sólo me da la posibilidad de cambiar el reloj a INTRC(32khz) o a el oscilador del Timer1 que creo que también es de 32khz. Por favor, si algo de lo planteado hasta ahora es erroneo... espero que me corrijais :mrgreen:.

El caso es que he pensado que la mejor solución, mi solución de compromiso, es utilizar INTOSC a 8 Mhz e intentar ir variando el PLL a traves del bit PLLEN(registro OSCTUNE). Con esto trabajaría normalmente a 32Mhz y cuando necesitará usar el harware externo(repito: no me puedo comunicar con él cuando mi PIC está a más de 25Mhz) apagaría el PLL y trabajaría a 8Mhz. La idea creo que está bien. Ahora sólo necesito que funcione XD.

He conseguido arrancar a 32Mhz:

OSCCON = 0b11111100;
OSCTUNE = 0b01000000;

y despues bajar a 8Mhz:

OSCCON = 0b11111100;
OSCTUNE = 0;

pero cuando intento subir el reloj de nuevo a 32Mhz, no lo consigo.... creo que se me escapa algún concepto, pero no tengo muy claro cual es. Por esto he recurrido a vosotros: si alguien tiene alguna sugerencia o conoce el "modus operandi" para llevar a cabo mi idea, que sepa que le doy las gracias de antemano.

Igualmente y de nuevo, saludos a todos!!! espero no volver a tener que desconectarme de este mundillo en mucho tiempo :mrgreen: :mrgreen: :mrgreen:

Ojo por ojo y todo el mundo acabará ciego - Mahatma Gandhi -

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: Alternar encendido y apagado de PLL utilizando oscilador interno.
« Respuesta #1 en: 08 de Junio de 2007, 13:09:13 »
Para funcionar a 32MHz.

OSCCON  = 0b01110000;
OSCTUNE = 0b11000000;

Puede cambiar algún bit si es que usarás el modo sleep o idle, de todas formas creo que el bit 7 del osctune lo tenías en 0 y lo debieras tener en 1.

Luego de este seteo puedes verificar si el bit IOFS está seteado para estar seguro de que la frecuencia es estable.

Mi consejo es que solo toques el OSCTUNE, el OSCCON... no hace falta.

- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado manwenwe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2211
Re: Alternar encendido y apagado de PLL utilizando oscilador interno.
« Respuesta #2 en: 08 de Junio de 2007, 17:32:51 »
Gracias por tu respuesta Maunix, veo que sigues siendo el primero de la clase :mrgreen:. No he conseguido cambiar el PLL en tiempo real. De todas formas me di cuenta de que para habilitar/deshabilitar el PLL con INTOSC a 8Mhz conmutando de este modo entre 32Mhz y 8 Mhz.... es mejor cambiar la frecuencia de INTOSC entre 8Mhz y 4Mhz y teniendo en cuenta que el PLL fijo es x4, obtengo 32Mhz y 16Mhz(frecuencia con la que mi hardware externo sigue funcionando OK)... con lo que aún gano velocidad de ejecución  :mrgreen: :mrgreen: :mrgreen: :mrgreen: :mrgreen:.

Os comento que con esto último no he tenido ningún problema... sólo consiste en cambiar los bits IRCF2:IRCF0 del registro OSCCON... 111=8Mhz y 110=4Mhz; despues de cada cambio de frecuencia se han de dejar, como mínimo, 2 ciclos de reloj del oscilador anterior y entre 3 y 4 ciclos del nuevo reloj para que la señal se estabilice. Tampoco me he parado a contar los "Nops"... con lo siguiente funciona bien(en C18)...

OSCCON.IRFC0 = 1; // cambiamos a 32Mhz...
OSCCON.IRFC1 = 1;
OSCCON.IRFC2 = 1;
Delay10TCYx(1); //delay de 10 instrucción de reloj

.
.
.


OSCCON.IRFC0 = 0; // cambiamos a 16Mhz...
OSCCON.IRFC1 = 1;
OSCCON.IRFC2 = 1;
Delay10TCYx(1); //delay de 10 ciclos de instrucción

.
.
.

OSCCON.IRFC0 = 1; // cambiamos a 32Mhz...
OSCCON.IRFC1 = 1;
OSCCON.IRFC2 = 1;
Delay10TCYx(1); //delay de 10 ciclos de instrucción

etc.

Sólo cabe recordar, que se debe habilitar el PLL(OSCTUNE.PLLEN = 1) y que este PLL sólo funciona si INTOSC = 8Mhz o 4Mhz....

Espero que esto le sirva de algo a alguien en algún momento... vaya frase más fea que me ha quedado XD XD XD

Saludos a todos y gracias de nuevo maunix!
« Última modificación: 08 de Junio de 2007, 17:34:53 por manwenwe »
Ojo por ojo y todo el mundo acabará ciego - Mahatma Gandhi -