Autor Tema: (SOLUCIONADO) Cálculo de tiempos C18 (CRYSTAL)  (Leído 11781 veces)

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

Desconectado _LAB_

  • PIC10
  • *
  • Mensajes: 36
(SOLUCIONADO) Cálculo de tiempos C18 (CRYSTAL)
« en: 23 de Enero de 2012, 03:26:47 »
Hola a todos!!!
Voy directo al grano!!  8)
Sucede que tengo una duda respecto a al uso de los cristales en C18, estoy usando un crystal externo de 16Mhz y mediante PLL lo llevo a 48Mhz pongo la configuracion de los PLL por si a alguien le sirve
Código: [Seleccionar]
//*************************************
#include <P18F24J50.h>
#include <delays.h>

#pragma config WDTEN = OFF //watchdog disable
#pragma config WDTPS = 1 //watchdog postscaler
#pragma config OSC = HSPLL          // HS crystal
#pragma config PLLDIV = 4           //divide x4 frec input 16Mhz
#pragma config CPUDIV = OSC1        //no Fosc divisor
#pragma config XINST = OFF   //Extended intruction disable
#pragma config DEBUG = OFF     //No debug
//minimiza tiempo de levantada del pic usando el osc interno mientras
#pragma config IESO = OFF //two-speed start-up
#pragma config LPT1OSC = OFF //low-power timer1 oscillator operation
#pragma config CP0 = OFF //code protection
//en caso de falla del osc principal, transpasa automaticamente al interno
#pragma config FCMEN = OFF //fail-safe clock monitor

Coloque toda la configuracion pues cambian dependiendo del PIC a usar.
Bueno sigo, la pregunta es ¿¿que frecuencia es la que se debe usar para calcular los tiempo, retardos, etc..??.
Hasta ahora me funciona con 16Mhz los calculos.
Pero, xk es así?? los calculos los hago con el crystal externo y corre internamente a 48Mhz??
La verdad me interesa saber si está corriendo a 48Mhz o tengo algo malo y lo hace a 16Mhz.
Bueno esa es mi duda. Agradezco cualquier comentario y sugerencia!!!
Saludos!!!
« Última modificación: 24 de Enero de 2012, 21:47:35 por _LAB_ »

Desconectado jukinch

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 608
Re: (AYUDA) Cálculo de tiempos C18 (CRYSTAL)
« Respuesta #1 en: 23 de Enero de 2012, 08:54:21 »
Hola _LAB._:
                Te aclaro que nunca usé un micro como el tuyo y puede que no sea correcto lo que te informo pero viendo el datasheet debería ser así.
                En la gama de los pic 18f que soportan usb podés generar dos velocidades de trabajo una para el módulo usb y otra para la CPU del micro.
                Es decir, podés alimentar con una misma frecuencia de cristal tanto el pll (para que este genere los 48mhz que necesita el USB) como también hacer trabajar la cpu del micro con una velocidad diferente a la del módulo usb.

Fijate en la página 36 del datasheet el diagrama de configuración.

Las 3 directivas que más abajo te transcribo hacen la selección de las frecuencias:

#pragma config OSC = HSPLL          // HS crystal
selecciona el modo de oscilador: en tu caso: cristal externo de alta velocidad y haciendo funcionar al pll.

#pragma config PLLDIV = 4           //divide x4 frec input 16Mhz
divide por 4 la frecuencia del cristal de entrada para que al pll le lleguen los 4mhz que necesita para funcionar y generar así los 96mhz que luego son divididos por 2 para llegar a los 48mhz del módulo usb.

#pragma config CPUDIV = OSC1        //no Fosc divisor
Este es un postcaler que permite dividir la frecuencia que viene directamente del cristal o que viene del pll, dependiendo si el pll está activo o no.
            En tu caso como viene del Pll  (96mhz/2=48mhz) los 48 mhz no son divididos por lo que el CPU del micro debería estar trabajando a 48mhz.

Mirá en el datasheet en la página 41 el cuadro que muestra las distintas configuraciones y las velocidades de trabajo del cpu. Y en tu caso podés ver la del cristal de 16mhz. En la cual dice que el CPU  trabaja a 48mhz.
            Contá un poco más el tema de los cálculos que has hecho para ver si están bien. Podés usar también el stopwatch del mplab para verificar el tiempo transcurrido en un retardo para corroborarlo.
               Saludos.
                    Jukinch          




« Última modificación: 23 de Enero de 2012, 14:55:12 por jukinch »
"Divide las dificultades que examinas en tantas partes como sea posible para su mejor solución." -René Descartes

Desconectado _LAB_

  • PIC10
  • *
  • Mensajes: 36
Re: (AYUDA) Cálculo de tiempos C18 (CRYSTAL)
« Respuesta #2 en: 23 de Enero de 2012, 23:01:29 »
Hola. Gracias por contestar jukinch.
Bueno todo lo que dijiste lo tengo recontra leido...
Mi problema suerge pork bueno segun la configuracion que puse y veo que segun lo que leiste tb estaras de acuerdo conmigo pongo un crystal de 16Mhz y como resultado la maquina me estaría trabajando a 48Mhz.
Mis dudas suergen pork bueno siempre en los calculos que he realizado en C18 he debido usar el crystal externo es decir 16Mhz si ocupo los 48Mhz no funciona la lógica hasta ahora he realizado conversiones ADC, uso de Timer y delays pero todos los calculo con 16Mhz estoy controlando unos servos y las interrupciones las revise con el osciloscopio y efectivamete la frecuencia sale bien si considero los calculos con 16Mhz.
Así:
Tmr0 a 16bits
20ms = 4/Fosc*prescaler*(2^16-Load_tmr0)
use>
Fosc = 16Mhz
prescaler = 64
y me da Load_tmr0 = 64286
esto funciono bien...
Bueno el problema era que no podia hacer funcionar el puerto usart de este PIC.....
Pero hoy en la noche (hace menos de 30min) lo logre jejejeje :mrgreen:...
Bueno y finalmente creo k para los calculos necesariamente C18 usa la frecuencia del crystal, ahora me gustaria comprobar si realmente mi pic esta corriendo a los 48Mhz internos. Alguien sabe como lograr esto?
Cualquier duda respecto a los calculos de tiempos y otros puedo ayudar!!!

Desconectado jukinch

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 608
Re: (AYUDA) Cálculo de tiempos C18 (CRYSTAL)
« Respuesta #3 en: 24 de Enero de 2012, 08:19:10 »
... ahora me gustaria comprobar si realmente mi pic esta corriendo a los 48Mhz internos. Alguien sabe como lograr esto?
Cualquier duda respecto a los calculos de tiempos y otros puedo ayudar!!!

          Probaste usar el stopwatch del Mplab?

mirá este hilo. Te puede ayudar. http://www.todopic.com.ar/foros/index.php?topic=20918.msg160003;topicseen#msg160003
               Saludos.
                     Jukinch
"Divide las dificultades que examinas en tantas partes como sea posible para su mejor solución." -René Descartes

Desconectado _LAB_

  • PIC10
  • *
  • Mensajes: 36
Re: (AYUDA) Cálculo de tiempos C18 (CRYSTAL)
« Respuesta #4 en: 24 de Enero de 2012, 09:45:50 »
Si si lo ocupo pero debo colocarlo a 16Mhz, lo que resulta lógico si hago todos los calculos a esta velocidad....
Es por ello que tengo la duda si realmente mi pic corre a los 48Mhz internos!!!! :5]

Desconectado jukinch

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 608
Re: (AYUDA) Cálculo de tiempos C18 (CRYSTAL)
« Respuesta #5 en: 24 de Enero de 2012, 09:58:03 »
Probá hacer una prueba real con las librerías de retardos para un lapso de tiempo conocido y luego con el osciloscopio lo controlás.

librería delays.h.
En ella tenés  4 funciones:
Delay10TCYx(i)      -> 10.Tcy.i     genera una demora de 10 ciclos de instrucciones * i
Delay100TCYx(i)   -> 100.Tcy.i      genera una demora de 100 ciclos de instrucciones  * i
Delay1KTCYx(i)      -> 1000.Tcy.i   genera una demora de 1000 ciclos de instrucciones * i
Delay10KTCYx(i)   -> 10000.Tcy.i    genera una demora de 10000 ciclos de instrucciones  * i

i puede tomar un valor de 1 a 255. (ojo Si se toma valor 0 i es 256)

Para calcular el tiempo debés tener en cuenta la frecuencia a la que trabaja el pic

TCY se calcula como 4/fosc

donde fosc = frecuencia de oscilador

Ejemplo  de 4mhz

En este caso 4*10^6(4MHz),

 por lo tanto TCY 4/4000000 = 1/10^6 = 0,000001sec

        1 TCY = 0,000001seg
1.000.000 TCY= 1 seg

para calcular un segundo

  1seg * 1 TCY
------------------- = 1.000.000 TCYs
0,000001seg


calculo del valor de i usando la función Delay10KTCYx(i)= i equivale a 10000 TCYs

1.000.000 TCYs
------------------- = 100i
   10.000 TCY

Delay10KTCYx(100); //dura 1 seg


ejemplo con frecuencia de 20mhz

TCY se calcula como 4/fosc
En este caso 20*10^6(20MHz), por lo tanto TCY = 4/20*10^6 = 0,0000002
        1 TCY = = 0,0000002seg

para calcular un segundo

  1seg * 1 TCY
------------------- = 5.000.000 TCYs
0,0000002seg

calculo del valor de i usando la función Delay10KTCYx(i)= i equivale a 10000 TCYs

5.000.000 TCYs
------------------- = 500i
   10.000 TCY

divido 500 entre 255 para separar el tiempo en n Delay10KTCYx(i) ya que i solo puede tomar valores de 1 a 255


Delay10KTCYx(255); // usando los dos delay llego al segundo
Delay10KTCYx(245); //

"Divide las dificultades que examinas en tantas partes como sea posible para su mejor solución." -René Descartes

Desconectado _LAB_

  • PIC10
  • *
  • Mensajes: 36
Re: (AYUDA) Cálculo de tiempos C18 (CRYSTAL)
« Respuesta #6 en: 24 de Enero de 2012, 20:59:53 »
Hola jukinch!!!
Gracias por contestar!!!
Hice todo lo que dijiste pero las pruebas y calculos usando un osc externo de 16Mhz (tal como el inicio) y supuestamente llevandolo a los 48Mhz no funcionan como ya suponia!!!
Los calculos que hice fueron:

Considerando osc 48Mhz:
Delay10KTC = 10000*4/(48*10^6)=0.00083333
1sg/0.00083333=1200/5=240
Esto no andubo ni cerca

Usando osc a 16Mhz:
Delay10KTC = 10000*4/(16*10^6)=0.0025
1sg/0.0025=400/2=200
Asi funciono!!!

Resumiendo... Sigo con el problema que al parecer el PIC trabaja a 16Mhz y no a los 48Mhz
Entonces Que estoy configurando mal?
Lei el tema de los fuses de configuracion que entrega C18 y bueno aki los posibles>
PLL Prescaler Selection bits:
 PLLDIV = 12          Divide by 12 (48 MHz oscillator input) 
PLLDIV = 10           Divide by 10 (40 MHz oscillator input) 
PLLDIV = 6             Divide by 6 (24 MHz oscillator input) 
PLLDIV = 5             Divide by 5 (20 MHz oscillator input) 
PLLDIV = 4             Divide by 4 (16 MHz oscillator input) 
PLLDIV = 3             Divide by 3 (12 MHz oscillator input) 
PLLDIV = 2             Divide by 2 (8 MHz oscillator input) 
PLLDIV = 1             No prescale (4 MHz oscillator input drives PLL directly)
---------------------------------------------------------------------------------------
CPU System Clock Postscaler:
 CPUDIV = OSC4_PLL6          CPU system clock divide by 6 
CPUDIV = OSC3_PLL3           CPU system clock divide by 3 
CPUDIV = OSC2_PLL2           CPU system clock divide by 2 
CPUDIV = OSC1                    No CPU system clock divide 
---------------------------------------------------------------------------------------
Oscillator:
OSC = INTOSC           INTOSC 
OSC = INTOSCO         INTOSCO (CLKO-RA6) 
OSC = INTOSCPLL       INTOSCPLL 
OSC = INTOSCPLLO     INTOSCPLLO (CLKO-RA6) 
OSC = HS                   HS, USB-HS 
OSC = HSPLL              HS+PLL, USB-HS+PLL 
OSC = EC                   EC (CLKO-RA6), USB-EC 
OSC = ECPLL              EC+PLL (CLKO-RA6), USB-EC+PLL 

Creo que esos son los importantes
Ahora yo siempre he usado
OSC = HSPLL
PLLDIV = 4
CPUDIV = OSC1

En la data segun veo estaria trabajando a los 48Mhz.
Ahora las unicas dudas que tendria seria el PLLEN (multiplexor) se habilita al usar HSPLL
y respecto al otro el FOSC y OSCCON nose que pasara con ellos!!
Si alguien sabe que estoy haciendo mal por favor
jukinch nose si se te ocurre algo....
Bueno gracias por las respuestas y espero que alguien me ayude a encontrar la solucion a mi dilema!!!
 



Desconectado _LAB_

  • PIC10
  • *
  • Mensajes: 36
Re: (AYUDA) Cálculo de tiempos C18 (CRYSTAL)
« Respuesta #7 en: 24 de Enero de 2012, 21:25:01 »
Acabo de descibrir algo interesante resulta que el registro OSCTUNE controla algunos aspectos del oscilador
Especificamente para mi interes el registro PLLEN> sin embargo en la simulacion revisando los registros veo que este registro se mantiene siempre en cero es decir nunca habilita el PLL....
Raro que sucedera???
Voy a intentar habilitar el PLL "manualmente" sin embargo no puedo ver los registros de configuracion donde esta alojada la configuracion del PLLDIV,CPDIV y FOSC...
Si alguien sabe como ver estos registros... que sea tan amable de avisar !!!! gracias!!!
« Última modificación: 24 de Enero de 2012, 21:35:39 por _LAB_ »

Desconectado _LAB_

  • PIC10
  • *
  • Mensajes: 36
Re: (AYUDA) Cálculo de tiempos C18 (CRYSTAL)
« Respuesta #8 en: 24 de Enero de 2012, 21:47:09 »
Enhorabuena jjajajaja!!!! :-/
Era eso el registro no era modificado automaticamente al activar el HSPLL por lo que nunca habia habilitado el PLL y nada sabemos lo que pasaba!!!
Muchas gracias jukinch por ayudarme!!!!
Me sirvieron tus consejos!!
Saludos!!!!

Desconectado jukinch

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 608
Re: (SOLUCIONADO) Cálculo de tiempos C18 (CRYSTAL)
« Respuesta #9 en: 25 de Enero de 2012, 00:00:03 »
Que bueno que encontraste solución. Ahora a programar ese pic ;-)
             Saludos
                     Jukinch
"Divide las dificultades que examinas en tantas partes como sea posible para su mejor solución." -René Descartes


 

anything