TODOPIC

Microcontroladores PIC => dsPIC => Mensaje iniciado por: Nocturno en 10 de Diciembre de 2006, 16:30:41

Título: dsPIC33F - Capítulo 1: El OSCILADOR
Publicado por: Nocturno en 10 de Diciembre de 2006, 16:30:41
Tras llevarme los últimos días cacharreando con el oscilador de mi primer dsPIC33F (un 33FJ64MC706 montado sobre dsRRBOARD (http://www.elrebujito.es/modules.php?name=News&file=article&sid=191&mode=&order=0&thold=0)) voy a escribir lo que he descubierto sobre esa pequeña maravilla.

El oscilador de dicho micro más bien debería llamarse, el conjunto de osciladores, porque como podéis ver en este esquema dispone de un montón de alternativas para hacer funcionar el corazón de nuestro magnífico dsPIC33F.
(http://www.elrebujito.es/images/oscilador-33F.jpg)

Los modos de funcionamiento que pone a nuestra disposición son:

Lo mejor de todo es que nuestra pequeña maravilla nos permite cambiar dinámicamente en plena ejecución entre las distintas modalidades de oscilador, lo que convierte a nuestro micro en un arma muy versátil en aplicaciones donde el control de tiempos sea crítico o donde haya que cuidar mucho el consumo.

A este respecto, también pone a nuestra disposición un post-divisor que sólo afecta a la CPU, al que los chicos de Microchip han bautizado como DOZE. La característica de este divisor es que permite marcar un ritmo a la CPU hasta 256 veces inferior al del clock principal, con lo que el consumo baja en esa relación, pero manteniendo los periféricos a todo trapo.
¿Que para qué sirve?, pues imagina un entorno donde las comunicaciones entre nuestro micro y otros dispositivos (RAM, ADC,...) vayan a toda leche, pero sin embargo la capacidad de gestión no sea crítica.

El módulo PLL aporta una flexibilidad extraordinaria, puesto que de una frecuencia de origen es capaz de obtener 512*32*3 = 49152 combinaciones distintas.

Para colmo, el oscilador interno que por defecto trabaja a 7,37 MHz puede "tunearse" desde 6,48MHz hasta 8,22MHz en micropasos de aproximadamente 30KHz.

Pues estas características, y algunas más que descubriréis en la datasheet son capaces de hacer volar a nuestro micro a 55MIPS. Sí, he dicho bien, el límite teórico es de 40MIPS pero el mío ha estado trabajando toda una mañana a 55MIPS sin despeinarse.

Además, me quedo muy tranquilo porque tiene un bit que le protege contra subidas de temperatura. Por fin podemos hacer overclocking sin miedo a freir nuestros micros.

Os recomiendo lo probéis, seguro que no os decepciona. Si os da miedo enfrentaros a la datasheet, he preparado un asistente de configuración que genera el código automáticamente para configurar nuestro oscilador en C30. Podéis entrar en el asistente aquí: Asistente para la configuración del oscilador de la familia dsPIC33F (http://www.elrebujito.es/modules.php?name=Content&pa=showpage&pid=5)

Aquí algunos ejemplos:
OSCILADOR INTERNO + PLL VOLANDO A 41MIPS
(http://www.elrebujito.es/images/oscilador-33f-mips41.43.jpg)
(http://www.elrebujito.es/images/oscilador-33F-41mips.jpg)

OSCILADOR INTERNO DIV 32 A 128Khz
(http://www.elrebujito.es/images/oscilador-33F-mips0.128.jpg)
(http://www.elrebujito.es/images/oscilador-33F-128khz.jpg)

Espero que lo disfrutéis por lo menos la mitad que yo.
Título: Re: dsPIC33F - Capítulo 1: El OSCILADOR
Publicado por: RedPic en 10 de Diciembre de 2006, 17:46:10
Simplemente: ¡¡¡ I M P R E S I O N A N T E !!!

Gracias Manolo por tu magnifico aporte. A ver si de una vez me lanzo a los dsPIC ... creo que por ahí tengo alguno ... uf qué reto.  :mrgreen:

Título: Re: dsPIC33F - Capítulo 1: El OSCILADOR
Publicado por: BrunoF en 10 de Diciembre de 2006, 18:18:31
 :-/ :-/¡Felicitaciones Manolo! :-/ :-/

Sigues asombrandonos como de costumbre.

¡Hombre!, esperad, esperad, que te nos alejas a años luz de distancia y nosotros intentando alcanzarte en sulqui (http://www.elbosquedesanmarcos.com.ar/pages/sulqui_JPG.htm).

En realidad no viajamos sobre el sulqui. Somos los que lo van tirando(léase: los caballos) :mrgreen: :mrgreen:
Título: Re: dsPIC33F - Capítulo 1: El OSCILADOR
Publicado por: Menta en 14 de Diciembre de 2006, 00:43:25
Pues! que está realmente espectacular. Lo he visto en tu página manolo y obviamente le puse 5 estrellas
Voy a ver si estreno el equipo insolador que me armé --> con la placa de la dsRRBOARD y una vez que la tenga hecha, me meto con los dsPics. (Espero no tirar muchas placas  :D que por cierto aun no consigo en mi ciudad)
Como ves sigo tus pasos... o al menos intento....

Dices que 55MIPS!!!!  sin despeinarse!!!!   voy a ver el tema ese del bit de temperatura...

Sería factible hacer un sistema donde el dsPic corriese a la máxima velocidad posible....  por ejemplo: Yo no quiero que el chip pase de 40ºC, y quiero la mayor velocidad posible. Eso se puede o no? O sólo hasta la temperatura que el fabricante estipula?
Título: Re: dsPIC33F - Capítulo 1: El OSCILADOR
Publicado por: Nocturno en 14 de Diciembre de 2006, 02:01:11
El bit de temperatura sólo protege al micro al umbral indicado por Microchip; no es configurable.
Lo de hacer algo para que corra al máximo deberás hacerlo tú en pruebas y luego dejarlo configurado.

De todas formas, sí me gustaría indicar que la tarea que yo le encargué al dsPIC a 55 MIPS era muy simple; generar un parpadeo por el PORTB. Quizás en tareas más exigentes o manejando otros periféricos pueda tener algún efecto secundario esa alta velocidad.
Título: Re: dsPIC33F - Capítulo 1: El OSCILADOR
Publicado por: cyberian en 08 de Junio de 2011, 14:03:06
Hola Nocturno, he adquirido algunos dsPIC33FJ128MC804, TQFP44, ya me he armado una plaquetita de desarrollo, y le puse un cristal de 10MHz, con 2 capacitores de 15pF, a 10mm de distancia del dsPIC. El circuito básico que armé es el que aparece en el datasheet, puse un capacitor de tantalio de 10uF en VCAP.
Logré hacerlo funcionar a 40MIPS, PERO CON EL OSCILADOR INTERNO. La forma que uso para probar que estoy trabajando a 40MIPS, es la siguiente. Interrumpo el dspic y conmuto un pin. (TRABAJO EN C30). El timer 1 desborda dada 65535 incrementos, con el osciloscopio mido el tiempo de desborde, me da 1.58ms, esto lo que tarda el dspic en contar 16bits, entonces el timpo por bit es 1.58ms/65536=24ns=>41MIPS.
Yo quiero usar el cirstar para llegar a los 40MIPS, no el oscilador interno, y no hay caso, no lo puedo configurar. La verdad que hago todo con componentes SMD, y no quiero desoldar el cristar para ver si está roto, o la patita del dspic no funciona. Po favor, me podrías asistir en la configuración del oscilador para usar el cristal de 10MHZ.
Mi código de prueba. La punta de prueba del osciloscopio la conecto al pin B9. El código así como está funciona bárbaro. Uso MPLAB 8.7 y C30 v3.25. Pickit 3. Agradezco mucho tu ayuda.

#include <p33fj128mc804.h>      /* DSPIC a utilizar */
#include <timer.h>

_FBS( RBS_NO_RAM & BSS_NO_FLASH & BWRP_WRPROTECT_OFF )
_FSS( RSS_NO_RAM & SSS_NO_FLASH & SWRP_WRPROTECT_OFF )
_FGS( GSS_OFF & GCP_OFF & GWRP_OFF )
_FOSCSEL( FNOSC_PRI & IESO_ON )
_FOSC( FCKSM_CSECMD & IOL1WAY_OFF & OSCIOFNC_OFF & POSCMD_XT )
_FWDT( FWDTEN_OFF & WINDIS_OFF & WDTPRE_PR128 & WDTPOST_PS32768 )
_FPOR( PWMPIN_ON & HPOL_ON & LPOL_ON & ALTI2C_OFF & FPWRT_PWR128 )
_FICD( JTAGEN_OFF & ICS_PGD3 )

void __attribute__((__interrupt__, auto_psv)) _T1Interrupt (void);
void InitTIMER1(void);

int main(void)
{

   // Configuro el oscilador para operar el dispositivo a 40MIPS
   // Fosc= Fin*M/(N1*N2), Fcy=Fosc/2
   // Fosc= 7.37M*43/(2*2)=79.22Mhz para ~40MIPS
   PLLFBD=43;                           // M=43
   CLKDIVbits.PLLPOST=0;                  // N1=2
   CLKDIVbits.PLLPRE=0;                  // N2=2
   OSCTUN=0;                           // Sintonizo el oscilador FRC, si lo uso

   // Desabilito el  Watch Dog
   RCONbits.SWDTEN=0;
   // Intercambio de clock para incorporar el PLL
   __builtin_write_OSCCONH(0x01);            // Configuro el cambio a
                                    // FRC con PLL (NOSC=0b001)
   __builtin_write_OSCCONL(0x01);            // Inicio el cambio de reloj
   while (OSCCONbits.COSC != 0b001);         // Espero a que termine el cambio de clock

   // Espero mientras de traba el PLL
   while(OSCCONbits.LOCK!=1) {};

   /* Configuración de puertos */
   TRISBbits.TRISB9=0;                      // Pin RB9 como salida

   /* Programa principal */
   InitTIMER1();

   while(1);
    return 0;
}

void __attribute__((__interrupt__, auto_psv)) _T1Interrupt (void)
{
   IFS0bits.T1IF = 0;
    LATBbits.LATB9=~LATBbits.LATB9;
    WriteTimer1(0);
   return;
}

void InitTIMER1(void)
{
   ConfigIntTimer1(T1_INT_PRIOR_6 & T1_INT_ON);
   WriteTimer1(0);
   OpenTimer1(T1_ON & T1_IDLE_STOP & T1_GATE_OFF & T1_PS_1_1 & T1_SYNC_EXT_OFF &
            T1_SOURCE_INT, 0xFFFF);
}
Título: Re: dsPIC33F - Capítulo 1: El OSCILADOR
Publicado por: Suky en 08 de Junio de 2011, 14:17:07
Tenes que colocar oscilador primario, y HS.

Así lo hago en un dspic33FJ64GP802 :

Código: [Seleccionar]
_FOSCSEL(FNOSC_PRIPLL & IESO_OFF)
_FOSC(FCKSM_CSECMD & IOL1WAY_OFF & OSCIOFNC_OFF & POSCMD_XT) // Conmutación de Clock habilitada, Fail-Safe Clock des-habilitado, OSC2 Clout, Cristal XT.


Código: [Seleccionar]
// Configuramos PLL para trabajar a 40 MIPS con Cristal de 4MHz.-
PLLFBD = 0x004E; // M=80.
  CLKDIV = 0x0000; //N1=2, N2=2.
// Cambiamos clock para incroporar PLL.-
__builtin_write_OSCCONH(0b011); // Indicamos cambio a clock primario con PLL.-
__builtin_write_OSCCONL(0x01); // Iniciamos cambio.-
while(OSCCONbits.OSWEN == 1) {}; // Esperamos a que se termine el cambio de clock.


En tu caso como es de 10MHz debes colocar HS en lugar de XT.

Saludos!
Título: Re: dsPIC33F - Capítulo 1: El OSCILADOR
Publicado por: cyberian en 08 de Junio de 2011, 20:41:46
Gracias suky, ahora lo pruebo y te comento.
Título: Re: dsPIC33F - Capítulo 1: El OSCILADOR
Publicado por: cyberian en 08 de Junio de 2011, 22:41:27
Muchas gracias Suky, había hecho un código similar al tuyo y no tuve resultados, ahora copié tu código y tampoco.
El problema estaba en la soldadura, al soldar el TQFP, me quedó unido con una puntita de estaño una patita del cristal al Vss que está al lado. La quité con un alfiler y salió volando.
Muchas gracias, porque ahora tu código de funciona de 10!. Hay diferencias, al menos el la pantalla del osciloscopio, con el cristal es 40us más rápido.  :D
He notado que se puede "overclokear" este dsPIC, lo puedo hacer funcionar á más de 40 MIPS, hay algún riesgo en eso??? No quiero romperlo y tener que desoldar y soldar este micro es un dolor. Además de la pérdida.
Me quedo contento. :-/
Título: Re:dsPIC33F - Capítulo 1: El OSCILADOR
Publicado por: cicloide2 en 19 de Septiembre de 2021, 16:30:01
Tras llevarme los últimos días cacharreando con el oscilador de mi primer dsPIC33F (un 33FJ64MC706 montado sobre dsRRBOARD (http://www.elrebujito.es/modules.php?name=News&file=article&sid=191&mode=&order=0&thold=0)) voy a escribir lo que he descubierto sobre esa pequeña maravilla.

El oscilador de dicho micro más bien debería llamarse, el conjunto de osciladores, porque como podéis ver en este esquema dispone de un montón de alternativas para hacer funcionar el corazón de nuestro magnífico dsPIC33F.
(http://www.elrebujito.es/images/oscilador-33F.jpg)

Los modos de funcionamiento que pone a nuestra disposición son:
  • Oscilador Interno: que puede entrar directo al micro, con división por 16, con división por N o a través del módulo PLL
  • Oscilador Primario: con configuraciones HS, XT y EC, que también puede entrar directo al micro o a través del PLL
  • Oscilador Interno de bajo consumo: es un oscilador especial que funciona a una frecuencia de 32KHz a piñón fijo
  • Oscilador Secundario: podemos meter otro oscilador por la patilla del timer y utilizarlo como motor del micro aunque en este caso no disponemos de PLL

Lo mejor de todo es que nuestra pequeña maravilla nos permite cambiar dinámicamente en plena ejecución entre las distintas modalidades de oscilador, lo que convierte a nuestro micro en un arma muy versátil en aplicaciones donde el control de tiempos sea crítico o donde haya que cuidar mucho el consumo.

A este respecto, también pone a nuestra disposición un post-divisor que sólo afecta a la CPU, al que los chicos de Microchip han bautizado como DOZE. La característica de este divisor es que permite marcar un ritmo a la CPU hasta 256 veces inferior al del clock principal, con lo que el consumo baja en esa relación, pero manteniendo los periféricos a todo trapo.
¿Que para qué sirve?, pues imagina un entorno donde las comunicaciones entre nuestro micro y otros dispositivos (RAM, ADC,...) vayan a toda leche, pero sin embargo la capacidad de gestión no sea crítica.

El módulo PLL aporta una flexibilidad extraordinaria, puesto que de una frecuencia de origen es capaz de obtener 512*32*3 = 49152 combinaciones distintas.

Para colmo, el oscilador interno que por defecto trabaja a 7,37 MHz puede "tunearse" desde 6,48MHz hasta 8,22MHz en micropasos de aproximadamente 30KHz.

Pues estas características, y algunas más que descubriréis en la datasheet son capaces de hacer volar a nuestro micro a 55MIPS. Sí, he dicho bien, el límite teórico es de 40MIPS pero el mío ha estado trabajando toda una mañana a 55MIPS sin despeinarse.

Además, me quedo muy tranquilo porque tiene un bit que le protege contra subidas de temperatura. Por fin podemos hacer overclocking sin miedo a freir nuestros micros.

Os recomiendo lo probéis, seguro que no os decepciona. Si os da miedo enfrentaros a la datasheet, he preparado un asistente de configuración que genera el código automáticamente para configurar nuestro oscilador en C30. Podéis entrar en el asistente aquí: Asistente para la configuración del oscilador de la familia dsPIC33F (http://www.elrebujito.es/modules.php?name=Content&pa=showpage&pid=5)

Aquí algunos ejemplos:
OSCILADOR INTERNO + PLL VOLANDO A 41MIPS
(http://www.elrebujito.es/images/oscilador-33f-mips41.43.jpg)
(http://www.elrebujito.es/images/oscilador-33F-41mips.jpg)

OSCILADOR INTERNO DIV 32 A 128Khz
(http://www.elrebujito.es/images/oscilador-33F-mips0.128.jpg)
(http://www.elrebujito.es/images/oscilador-33F-128khz.jpg)

Espero que lo disfrutéis por lo menos la mitad que yo.