Autor Tema: problema con oscilador de dspic33f  (Leído 2589 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado hector90210

  • PIC10
  • *
  • Mensajes: 20
problema con oscilador de dspic33f
« en: 04 de Febrero de 2015, 03:32:29 »
Hola a todos. de antemano agradezco su colaboración.

Tengo un dspic33fj256gp710 con un cristal externo de 8Mhz el cual he  tratado de configurar para que trabaje a 40mhz. pero al parecer el micro sin importar la configuracion de los registros FOSCSEL  FOSC siempre trabaja a la misma velociad, supongo que es la velocidad inicial FRC. he configurado el tmr1 para generar una interrupcion a un periodo de 32767 con el clock interno y este siempre la produce aproximaente a los dos segundos. he tratado con todas las combinaciones posibles de configuracion pero cuando el programa funciona siempre lo hace ha la misma velocidad. he ensayado  configurando para iniciar con  Sosc y arranca sin nisiguera tener
este cristal conectado,lo que me indica que el compilador siempre esta colocando los mismos fuses

cuando anexo esta parte de codigo el oscilador nunca cambia a XT con PLL y nunca suichea por lo que se queda en esta linea tanto en modo debugger como en release

// Configure Oscillator to operate the device at 40Mhz
// Fosc= Fin*M/(N1*N2), Fcy=Fosc/2
// Fosc= 8M*40/(2*2)=40Mhz for 8M input clock

   PLLFBD= 38;   // M=40
   CLKDIVbits.PLLPOST=0;      // N1=2
   CLKDIVbits.PLLPRE=0;      // N2=2
        CLKDIVbits.DOZE=0;
// Disable Watch Dog Timer
   RCONbits.SWDTEN=0;


//OSCCONH Unlock Sequence
        __builtin_write_OSCCONH(0x78);
       __builtin_write_OSCCONH(0x9A);

// Clock switching to incorporate PLL
   __builtin_write_OSCCONH(0x01);      // Initiate Clock Switch to Primary

//OSCCONL Unlock Sequence
        __builtin_write_OSCCONL(0x46);
        __builtin_write_OSCCONL(0x57);

// Oscillator with PLL (NOSC=0b011)
   __builtin_write_OSCCONL(0x03);      // Start clock switching




 //       while(OSCCONbits.COSC != 0b011);   // Wait for Clock switch to occur      Aqui se queda el programa


// Wait for PLL to lock
 //       while(OSCCONbits.LOCK!=1) {};

he tratado configurando los registros de esta forma

FOSCSEL(FNOSC_FRC) // PRI, PRIPLL
_FOSC(FCKSM_CSDCMD & OSCIOFNC_OFF & POSCMD_XT)
_FWDT(FWDTEN_OFF)
_FICD(JTAGEN_OFF & ICS_PGD1)

y tambien asi con el codigo que se genera

 int FBS __attribute__((space(prog), address(0xF80000))) = 0xCF ;

 int FSS __attribute__((space(prog), address(0xF80002))) = 0xCF ;

 int FGS __attribute__((space(prog), address(0xF80004))) = 0x7 ;

 int FOSCSEL __attribute__((space(prog), address(0xF80006))) = 0xFF78 ;

 int FOSC __attribute__((space(prog), address(0xF80008))) = 0xFFBD ;

 int FWDT __attribute__((space(prog), address(0xF8000A))) = 0xFF7F ;

 int FPOR __attribute__((space(prog), address(0xF8000C))) = 0xFFFF ;

 int FICD __attribute__((space(prog), address(0xF8000E))) = 0xFFDF ;


He verificado que el cristal este funcionando y en efecto lo esta. pero no se si haya algun otro defecto de hardware que ocasione que esto suceda.

si a alguien le ha sucedido algo parecido o alguien me puede guiar para solucinar este problema lo agrdecere profundamente.

Desconectado hector90210

  • PIC10
  • *
  • Mensajes: 20
Re: problema con oscilador de dspic33f
« Respuesta #1 en: 05 de Febrero de 2015, 03:38:41 »
definitivamente no quiere funcionar con oscilador externo. Ya he cambiado el cristal por otros y de diferentes valores para lo cual hago sus respectivas configuraciones y nada. siempre se queda en esta linea:

while (OSCCONbits.COSC != 0b011);

puede estar malo los puertos de entrada OSCI  y OSCO?

alguna idea. A alguien le ha pasado algo parecido?

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: problema con oscilador de dspic33f
« Respuesta #2 en: 05 de Febrero de 2015, 09:32:31 »
Primer que nada, no se mucho de los dsPIC a pesar que tengo uno pero solo lo use para encender un led y nada mas ( un desperdicio), de todas formas voy a intentar ayudarte con lo que lea de los datasheet.

Lei que el oscilador que va a estar funcionando al momento del reset ( y tambien el contenido de OSCCON ) depende de los fuses, por lo que me imagino que si en los fuses pones que el oscilador primario es externo, que usas el PLL (si es que no modificas los valores del PLL, sino conviene que lo inicies sin PLL), deberias estar funcionando sin realizar un cambio de fuente de reloj(Solo del PLL si fuera necesario).
Lo unico que aconseja de comenzar con el interno es si el cristal se encuentra fuera del rango de 4 a 8 Mhz, la otra que me pregunto es si tenes habilitado el switching en los fuses. En fin si configuras para tener como reloj primario el XT y esta en rango, solo deberias tener en cuenta el PLL.

Si aun asi insistis por usar el interno como arranque + switch (no me refiero al IESO, sino poner como primario al reloj interno y luego cambiarlo) deberias hacer paso a paso lo que exige microchip que veo que hiciste hasta casi el final (Aunque por ahi varia el codigo). Voy a suponer que tenes configurado el oscilador interno en los fuses y switch habilitado. Y el PLL deshabilitado para poder cambiar los valores del mismo.

Citar
//OSCCONH Unlock Sequence
        __builtin_write_OSCCONH(0x78);
       __builtin_write_OSCCONH(0x9A);

// Clock switching to incorporate PLL
   __builtin_write_OSCCONH(0x01);      // Initiate Clock Switch to Primary

//OSCCONL Unlock Sequence
        __builtin_write_OSCCONL(0x46);
        __builtin_write_OSCCONL(0x57);

// Oscillator with PLL (NOSC=0b011)
   __builtin_write_OSCCONL(0x03);      // Start clock switching

Veo estas poniendo un 0x01 en OSCCONH, es decir que el nuevo valor del oscilador ( NOSC ) es 0x01. Lo cual lo configuras como: 001 = Fast RC Oscillator with PLL (FRCPLL) , es decir el interno.
Pero luego.... te pones a preguntar por el nuevo valor ( Actual ) del oscilador y pretendes que sea otro valor es decir 0x3.
Cuando el cambio se realiza, NOSC pasa a COSC. Si ambos son iguales ( NOSC y COSC ) el cambio se aborta.

Otra de las cosas es que desde el PDF MPLAB® XC16 C Compiler User’s Guide

__builtin_write_OSCCONH
Citar
Assembler Operator/
Machine Instruction*:
mov #0x78, w0
mov #0x9A, w1
mov #_OSCCON+1, w2
mov.b w0, [w2]
mov.b w1, [w2]
mov.b value, [w2]

Si te fijas en el ASM de esta instruccion este procede a escribir los valores para el unlock, y luego termina escribiendo el valor que le pones dentro al registro OSCCONx por lo tanto tu codigo se reduciria a:

Código: [Seleccionar]
//Aqui configuracion del PLL  comenzando con el PLL desactivado

 if(OSCCONbits.COSC!=0x3)  //Pregunto si el actual oscilador es el externo si es el externo no tiene caso realizar el switching.
{
 __builtin_write_OSCCONH(0x03); //Cargo 0x03 a OSCCONH = NOSC para el oscilador primario
 __builtin_write_OSCCONL(0x01);  // Cargo 0x01 a OSCCONL habilito el bit OSWEN para el cambio del clock
 while (OSCCONbits.OSWEN);       // Espero que se ponga en 0 para saber que se cambio
}
 while (!OSCCONbits.LOCK); // Si es 0 que se quede en el loop

Codigo sacado leyendo la seccion de switch de:
dsPIC33F/PIC24H Family Reference Manual - Section 7. Oscillator - 7.11
« Última modificación: 05 de Febrero de 2015, 13:22:01 por KILLERJC »

Desconectado hector90210

  • PIC10
  • *
  • Mensajes: 20
Re: problema con oscilador de dspic33f
« Respuesta #3 en: 06 de Febrero de 2015, 00:31:32 »
Muchisimas gracias KILLERJC por quererme ayudar, te cuento que estoy feliz :-/, porque ya encontre el problema, y es increible lo que me sucedio, ya llevaba mas de ocho dias lidiando con este problema y ya me estaba volviendo loco. esto es para un proyecto muy importante para mi.Paso a describir lo que me paso por si le sirve de ayuda a alguien mas.
El problema era de hardware, bueno, todo el diseño del pcb esta bien pero leyendo en muchos foros todos los que tenian un problema similar al mio terminaban solucionadolo con algo en el harware entonces empece a cambiar cristales y capacitores sin ningun fruto con lo lioso que es trabajar de afan dispositivos mst. intente con todas las combinaciones posibles de configuraciones de cristal y de pll y nada.
el dia que solde el dspic que es un tqfp de 100 pines verifique que todo estuviera bien y asi fue. el problema vino despues cuanado solde una memoria talvez utilice un flux de mala calidad o no se que paso aqui pero este fuel el que origino el problema. lo pude encontrar porque   
empece a verificar nuevamente la soldadura de cada uno de los pines del dspic y todo se veia perfecto pero vaya sorpresa cuando entre  los pines de alimentacion el multimetro me estaba mostrando una resistencia muy baja, casi continuidad. me dio mucha tristeza porque pense que era problema del dspic el cual es el unico que tengo y que en colombia  hay que traerlos por encargo seria 15 o 20 dias mas de espera, no queria bajar este micro para probar si me daba continuidad desmontado lo que me parecia raro era que el funcionaba entonces empece a desmontar algunos capacitores de desacoplo pero seguia mostrandome la resistencia. empece a mirar con lupa todo cuando por azar vi que algo brillo entre los pines de la memoria que tambien es smd y lo limpie con solvente y cepillo de dientes era seguramente residuo del flux que alegria  me dio cuando volvi a medir continuidad y esta ya no estaba. eso me dio una gran señal. de inmediato volvia a montar el crital de 8mhz y a programar y corro sin ningun problema  weeeepaaaaaaa. :-/ creo que el residuo de flux formo una pelicula resistiva debajo de la memoria entre los pines de alimentacion lo que seguramente hacia que el dspic fallara la inquietud que me queda en porque si el voltaje de la fuente no cayo este no funcionaba con oscilador interno. Esta es otra maravillosa falla de esas que nos dan dolor de cabeza por causas de fuente y lo mas curioso por algo que uno ve insignificante.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: problema con oscilador de dspic33f
« Respuesta #4 en: 06 de Febrero de 2015, 02:37:27 »
Bueno menos mal que lo solucionaste :)


 

anything