Autor Tema: Temporizador y frecuencia del oscilador  (Leído 4059 veces)

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

Desconectado gabrielnbr89

  • PIC10
  • *
  • Mensajes: 10
Temporizador y frecuencia del oscilador
« en: 31 de Octubre de 2014, 01:50:38 »
Hola gente! Tengo un gran problema con el tema de la frecuencia del oscilador del PIC y el temporizador por ese motivo. Miren, tengo una placa en la que uso el PIC con bootloader. La placa usa un cristal. No podia recordar la frecuencia a la que trabajaba el oscilador por lo que acudi al Datasheet del PIC (uso el PIC 18f4550). En la seccion "oscillator types" detalla el uso de resonadores y cristales, para estos ultimos indica que con condensadores de 22pf (como tengo en la placa) se tendría una frecuencia de 8Mhz. Pero a prueba y error pude hacer lo siguiente:
Descubrí que realizando 6 Delays seguidos (Los delays los hago con la función correspondiente a la librería delays.h) definidos como: Delay10KTCYx(200) obtengo un retardo de 1 segundo aproximadamente. De donde deduzco:
Según entiendo la función delay describe la siguiente ecuación:
Para mi caso 10000*(4/Fosc)*200=tiempo de retardo. Como en mi caso realizo 6 delays consecutivos:
6*10000*(4/Fosc)*200=1seg. Despejando Fosc tengo: Fosc=48Mhz. y no 8Mhz como esperaba.
Por otro lado con el uso del temporizador:
Configuro T0CON=0b10000111. De forma que el temporizador queda configurado en 16 bits con preescaler de 1:256. Según entiendo: tiempo=(4/Fosc)*65535*256. Y pude medir el tiempo en 1.4seg. De nuevo, despejando Fosc: Fosc=47934171.43 lo cual es aproximadamente 48Mhz como en el caso anterior, y de nuevo no es 8Mhz como esperaba...
Hay algo que estoy haciendo mal? estan mal mis calculos? O son malas las experiencias que realice? o interpreté mal lo que dice el datasheet con respecto a los osciladores?
Muchas gracias por su tiempo y espero puedan ayudarme! SALUDOS!

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Temporizador y frecuencia del oscilador
« Respuesta #1 en: 31 de Octubre de 2014, 03:23:42 »
http://ww1.microchip.com/downloads/en/devicedoc/39632c.pdf

Si observas el datasheet. En la seccion de 2.0 Oscillator Configurations, pagina 24.

Vas a ver que la entrada del cristal, es dividida por un valor dado por los registros PLLDIV (PLL Prescaler), este valor si o si tiene que dar como resultado 4Mhz, de esa forma alimenta un PLL que lo sube a 96Mhz, desde alli se separa en 2 caminos, el primero que lo divide por 2 y alimenta al USB y el segundo que va a un divisor, siendo el minimo por 2 CPUDIV (PLL Postscaler), es decir tus 48Mhz que luego termina siendo tu frencuencia en la CPU Y en los perifericos.

Si quisieras otra frecuencia que proviene del cristal directamente ( podes usar el divisor llamado oscillator postscaler, seteado con CPUDIV ) y eligiendo FOSC para decirle de donde queres que venga la señal del reloj. Ahora ... por que bajarle la frecuencia ? :P

La mayoria de los registros son de los registros CONFIGxx (Configuration Bits)
« Última modificación: 31 de Octubre de 2014, 03:30:36 por KILLERJC »

Desconectado gabrielnbr89

  • PIC10
  • *
  • Mensajes: 10
Re: Temporizador y frecuencia del oscilador
« Respuesta #2 en: 31 de Octubre de 2014, 11:52:00 »
Buenisimo! ((:-)) ahora entiendo. La respuesta estaba ante mis ojos! Ahora una pregunta: veo también que el micro dispone de un oscilador interno. Se que éste no permite el uso del USB (ahora gracias a KILLERJC veo que éste oscilador interno no tiene ningún vínculo con la fuente del clock USB  :lol: ) supongo que por eso desde un principio tengo el oscilador externo ya que uso el bootloader para programar el micro. Pero yo nunca configuro en mi programa los osciladores. Al tener un oscilador externo en OSC1 y OSC2 automáticamante toma a éste como el principal? o queda configurado asi por el bootloader?

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Temporizador y frecuencia del oscilador
« Respuesta #3 en: 31 de Octubre de 2014, 12:18:22 »
Buenisimo! ((:-)) ahora entiendo. La respuesta estaba ante mis ojos! Ahora una pregunta: veo también que el micro dispone de un oscilador interno. Se que éste no permite el uso del USB (ahora gracias a KILLERJC veo que éste oscilador interno no tiene ningún vínculo con la fuente del clock USB  :lol: ) supongo que por eso desde un principio tengo el oscilador externo ya que uso el bootloader para programar el micro. Pero yo nunca configuro en mi programa los osciladores. Al tener un oscilador externo en OSC1 y OSC2 automáticamante toma a éste como el principal? o queda configurado asi por el bootloader?

Creo que no te queda otra que usar oscilador externo en tu caso, ya que como viste no podes alimentar el USB sin cristal.
En la seccion 25.1 pagina 286 tenes los bits de configuracion, como podras ver las direcciones de memoria son muy grandes y nada que ver con la memoria de programa, en los PICs de menos gama del que tenes estos se pueden cambiar unicamente cuando se programa, si observas en el PICkit2 al cargar el hex aparece el valor de la palabra de configuracion. En el 18F4550 permite la escritura del mismo a traves de tablas, ahi explica en el datasheet como hacerlo, tambien vienen definido los valores que vienen de fabrica, una vez programados ya cambian a lo que tenes. y no van a cambiar hasta que se le programe otra cosa. No se si el bootloader tenga la capacidad para cambiarlo.

EDIT:

http://ww1.microchip.com/downloads/en/AppNotes/00851b.pdf

Esto responde a mi pregunta:
Seccion configuration bits PIC18F, en resumen el bootloader puede cambiar los bits, pero dejaria de funcionar.
Con lo que responde a tu pregunta, no los asigna el bootloader, y tampoco se asignan automaticamente. Solo en el codigo
« Última modificación: 31 de Octubre de 2014, 13:28:49 por KILLERJC »

Desconectado gabrielnbr89

  • PIC10
  • *
  • Mensajes: 10
Re: Temporizador y frecuencia del oscilador
« Respuesta #4 en: 10 de Noviembre de 2014, 19:43:08 »
A ver, intento pasar en limpio todo esto. Espero que me tengas paciencia ya que se me hace un poco dificil todavia entender algunas cosas. Se que para depurar dudas aqui no queda otra que leer, leer y seguir leyendo, asi que hice mi tarea y me puse a leer en base a tu respuesta. Lo que entiendo es lo siguiente: El PIC por defecto trae ciertos valores en cada registro, es decir que mientras éstos no se modifiquen, se mantiene todo como de fábrica.
Cuando decis:

"En la seccion 25.1 pagina 286 tenes los bits de configuracion, como podras ver las direcciones de memoria son muy grandes y nada que ver con la memoria de programa"

Supongo que te referís a que las direcciones de memoria de los registros de configuracion están fuera del espacio de memoria que el PIC reserva para mi uso, o digamos, para mi código.

También dijiste:
"si observas en el PICkit2 al cargar el hex aparece el valor de la palabra de configuracion."

A que valores te referís? En la parte inferior de toda la tabla aparece: "Configuration memory:" pero sólo aparecen valores cuando se realiza la lectrua del dispositivo, no en la escritura. Y aquí algo interesante. Lei en la hoja de datos del PICDEM FS USB DEMOSTRATION BOARD los valores de estos registros, y para el registro CONFIG1L que contiene la configuracion del oscilador el valor es 0x24 o en binario 00100100 lo que corresponde a: la señal del PLL de 96Mhz/2 y no a la señal del cristal (tal como dijimos antes) con el prescaler en FOSC/5 para resultar en 4MHZ para la entrada del pll (de nuevo, tal como dijimos antes) y el CPUDIV dividiendo en 2 la frecuencia del PLL de 96 MHZ, resultando en 48 MHZ el reloj de CPU. Y el registro CONFIG1H=0xE o en binario 00001110 lo que corresponde a HSPLL el cual no entiendo muy bien como trabaja porque me resulta confuso en el diagrama de bloques de la seccion "Oscillator Configuration" de la hoja de datos del PIC pero creo que selecciona en el MUX la entrada que viene desde el PLL de 96 MHZ pasando por el postscaller, de ser asi todo o que dijimos antes tiene sentido. Lo mas interesante es que al leer el PIC con la herramienta PICDEM FS USB DEMO TOOL que viene con el PICKIT2  veo que las dos palabras (CONFIG1L y CONFIG1H) tienen los valores indicados anteriormente. Entonces busque busque y busque hasta encontrar el código fuente del bootloader y me doy con que ahi mismo configura estos registros con las directivas #pragma (En c).

LUEGO: Aclaro que no tengo el PICKIT2 sino que compre un PIC18f4550 y mi profesor le puso el bootloader con su programador, luego hice una placa de pruebas en impreso para practicar y poder programar ya que no dispongo de un programador en casa. Todos los software y demas los baje de la pagina de microchip.

FINALMENTE: supngo que al comilar el código y al grabar el archivo .hex correspondiente al bootloader en mi pic, se configuraron estos registros tal como lo indica el archivo que contiene el codigo. Luego cuando yo construyo mi programa no configuro nada de eso y cuando grabo mi programa a traves de la herramienta que me permite hacerlo con el bootloader y el bootloader cede el control del PIC a mi programa continúa funcionando con la misma configuracion que se Seteó aquella vez que se grabó el bootloader en mi PIC.

Supongo estar en lo cierto al decir lo anterior, de no ser así espero las correcciones, estoy aqui para aprender y espero no haber dicho solo bobadas jeje. Gracias por el tiempo! SALUDOS!!
« Última modificación: 10 de Noviembre de 2014, 19:45:30 por gabrielnbr89 »

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Temporizador y frecuencia del oscilador
« Respuesta #5 en: 10 de Noviembre de 2014, 20:46:40 »
Supongo que te referís a que las direcciones de memoria de los registros de configuracion están fuera del espacio de memoria que el PIC reserva para mi uso, o digamos, para mi código.

Correcto

Citar
También dijiste:
"si observas en el PICkit2 al cargar el hex aparece el valor de la palabra de configuracion."

Es la costumrbe de usar pickit2, por eso lo nombre, ya que si programabas con este:

Si hacias click en Configuration modificabas los bits

Citar
Y el registro CONFIG1H=0xE o en binario 00001110 lo que corresponde a HSPLL el cual no entiendo muy bien como trabaja

Es un multiplexor, vos seleccionas el tipo de entrada, lo mejor para esos casos es mirar para que sirven exactamente los bits de los registros CONFIG1L y CONFIG1H
Del datasheet 111x = HS oscillator, PLL enabled (HSPLL), HS cristal mayor a 4Mhz, si tuvieras un cristal de 4Mhz deberias usar 001x = XT oscillator, PLL enabled (XTPLL). tambien se puede desactivar el PLL. desde ese registro. Pero mejor dejalo como esta xD

Citar
FINALMENTE: supngo que al comilar el código y al grabar el archivo .hex correspondiente al bootloader en mi pic, se configuraron estos registros tal como lo indica el archivo que contiene el codigo.

Exactamente, mientras tu codigo no modifique esos registros no va a haber problema. y vas a seguir programando tranquilamente. Eso si, con la frencuencia esa, como CONFIG1H contiene el TIPO de oscilador y CONFIG1L los preescalers, podrias modificar CONFIG1L sin problema, si es que queres una frecuencia menor ( sacrificando velocidad para un delay por ejemplo). La unica precaucion es que posea 4Mhz la salida del primer divisor. Si por algun motivo deja de funcionar pedis que te graben de vuelta el bootloader xD.
« Última modificación: 10 de Noviembre de 2014, 20:53:54 por KILLERJC »

Desconectado gabrielnbr89

  • PIC10
  • *
  • Mensajes: 10
Re: Temporizador y frecuencia del oscilador
« Respuesta #6 en: 10 de Noviembre de 2014, 21:16:47 »
Aho claro! es que para programar mi PIC uso el soft que viene como herramienta para la placa de pruebas para el uso con bootloader pero ya entiendo a lo que te referís. Muchísimas gracias por tu ayuda! voy a seguir incursionando con esto y cualquier otra duda, aqui voy a estar escribiendo!
SALUDOS!!!


 

anything