TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: _LAB_ 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
//*************************************
#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!!!
-
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 (http://ww1.microchip.com/downloads/en/DeviceDoc/39931d.pdf) 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 (http://ww1.microchip.com/downloads/en/DeviceDoc/39931d.pdf) 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
-
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!!!
-
... 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
-
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]
-
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); //
-
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!!!
-
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!!!
-
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!!!!
-
Que bueno que encontraste solución. Ahora a programar ese pic ;-)
Saludos
Jukinch