Autor Tema: Implementar reloj preciso en un 16f628a con CCS  (Leído 2909 veces)

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

Desconectado rafaelrg06

  • PIC12
  • **
  • Mensajes: 54
Implementar reloj preciso en un 16f628a con CCS
« en: 18 de Febrero de 2015, 19:33:34 »
Hola a los amigos del foro:
Estoy tratando de hacer un reloj con un PIC 16f628A, y necesito que sea preciso. Hace un tiempo leí en algún lugar que se puede usar un cuarzo de 32.768Khz para crear bases de tiempo muy precisas, pero no tengo ni idea de como lograrlo. ¿Alguien podría ayudarme en esto?
Uso para programar C con CCS.

Desconectado elreypic2

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1297
Re: Implementar reloj preciso en un 16f628a con CCS
« Respuesta #1 en: 18 de Febrero de 2015, 20:09:31 »
Que tal rafaelrg06,

No mencionas la precisión que necesitas. Un cristal de ese valor tiene una tolerancia nominal de ±20ppm. Lo que significa que un cristal de 32.768 KHz tendra una desviación de frecuencia de:

δf=±20ppmX32768Hz/1000000 = ±0.65536Hz;

Esto significa que el cristal tiene un rango de frecuencias de 37.768KHz±0.65536Hz.
Si vas a usar un lenguaje de alto nivel como C, vas a tener que usar el TMR1 del PIC16F628 para realizar una base de tiempo de 1 segundo. Esto es solamente para generar la base de tiempo. Para ejecutar el codigo y consevar la precisión vas a necesitar usar un cristal de 20MHz para que el tiempo de ejecucion de la instrucción sea de 200nS para instrucciones de 1 ciclo. y de 400ns para instrucciones de 2 ciclos.

Saludos y espero que esto te sirva como inicio para tu proyecto.

Elreypic.

Desconectado rafaelrg06

  • PIC12
  • **
  • Mensajes: 54
Re: Implementar reloj en un 16f628a con CCS
« Respuesta #2 en: 19 de Febrero de 2015, 09:47:47 »
Hola amigo:
 Pienso que la precisión que necesito debe ser similar a la de un reloj convencional (porque precisamente es eso lo que quiero hacer). Yo tengo el algoritmo del resto del reloj, pero lo que me falta esclarecer es la creación de la base de tiempo, que es lo fundamental en este proyecto. ¿Conoces de algún algoritmo que me pueda ayudar a crear la base de tiempo de 1 segundo?

Desconectado elreypic2

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1297
Re: Implementar reloj preciso en un 16f628a con CCS
« Respuesta #3 en: 19 de Febrero de 2015, 11:27:37 »
Que tal rafaelrg06,

Como te mencioné la forma de generar la base de tiempo es usando el timer1 del PIC. Este timer es de 16 bits lo que quiere decir que puede realizar un conteo de 0000h hasta FFFFh (0 hasta 65535). Lo que tienes que hacer es conectar el cristal de 32.768KHz en los pines del Timer1 del PIC (RB6 y RB7 con sus respectivos capacitores dependiendo del tipo de cristal). Entonces configuras el timer1 para que realice su conteo desde esos pines. Como te puedes dar cuenta el cristal producirá 32768 ciclos en un segundo, lo que quiere decir que debes inicializar el timer 1 en la mitad, esto es 32768 (8000h). Entonces enciendes el timer 1 y cuando este se desborde tendras una base de tiempo de un segundo. Puedes usar interrupciones para que cuando se desborde incrementes el valor del segundero en tu reloj. Si usas un cristal de 20MHz para la ejecucion del codigo del micro, puedes hacer todo eso muy rapidamente y asi no afectaras la base de tiempo del timer 1.
Cuando se genera la interrupcion, vuelves a setear el timer1 en 32768 (8000h) y luego te quedan unos 30 microsegundos para realizar las operaciones necesarias de tu algoritmo del reloj. Si estas usando un cristal de 20MHz esto quiere decir que el ciclo instruccion (en lenguaje esnamblador) es de 200ns, esto quiere decir que puedes ejecutar hasta 150 intrucciones de ciclo simple, lo que es bastante para ejecutar tu algoritmo del reloj. En Lenguaje C, la complicacion es que no sabes el tiempo de ejecucion de cada sentencia, pero de igual manera tu precision se vera afectada muy poco o nada.

Saludos y espero que esto te sirva.

elreypic.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Implementar reloj preciso en un 16f628a con CCS
« Respuesta #4 en: 19 de Febrero de 2015, 13:47:44 »
Puede ser que se pueda usar el modulo CCP asi cargar los valores para el match en los registros del CCP y asi no tocar el timer1, de esa forma el timer 1 esta siempre corriendo, cuando ocurre la coincidencia entra a la interrupcion del CCP, se le suma los 32768 al valor que habia en el CCP y se guarda de nuevo. de esta forma el timer 1 jamas para su marcha ni hay necesidad de contar instrucciones.

Es decir la base de tiempo no se ve afectada. Lo unico que cambiarias es con lo que lo comparas que es del modulo CCP y tenes una interrupcion que te sirve tambien. Con lo cual no hay problema si lo haces en C y tendrias hasta 1 segundo para hacer todos los calculos y lo que quieras hasta el proximo match del compare.

Incluso creo que el CCP trae la opcion de limpiar el timer1 ante una interrupcion. lo que si no se si esto significa una perdida de un ciclo en la cuenta del timer. De esa forma ni siquiera tendrias que sumar y solo dejarlo en 32768 ( o 32767 segun )

Es una idea nomas. Si en algo le estoy errando me diran
« Última modificación: 19 de Febrero de 2015, 13:53:02 por KILLERJC »

Desconectado rafaelrg06

  • PIC12
  • **
  • Mensajes: 54
Re: Implementar reloj preciso en un 16f628a con CCS
« Respuesta #5 en: 19 de Febrero de 2015, 14:09:16 »
Hola amigo reypic2:
Tu explicación era exactamente lo que necesitaba, te doy sinceramente muchas gracias y felicitaciones. Ya estoy armando el código.

Con respecto a usar el módulo CCP no se bien porque creo que ese módulo en modo comparación o en modo captura (alguno de los módulos que necesitaré para esta tarea) se apoyan en el timer1 para funcionar (al menos en el 16f628a). Aún así no tengo mucha experiencia con ese módulo y no se bien como usarlo para esto, creo que usando el timer 1 directamente me va a funcionar mejor. de cualquier forma muchisimas gracias por tu respuesta.

Gracias a todos!!!!!!!!

Desconectado elreypic2

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1297
Re: Implementar reloj preciso en un 16f628a con CCS
« Respuesta #6 en: 19 de Febrero de 2015, 17:23:48 »
Como bien lo menciona KILLERJC, el uso del modulo de comparacion resolvera cualquier problema de perdida. Es mejor opcion que la de solo usar el Timer1. No lo mencione ya que me parecio que te sera mas facil usar solamente el timer1. Pero despues puedes intentar el uso del modulo de comparacion.

Saludos,

elreypic.

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5883
    • Picuino
Re: Implementar reloj preciso en un 16f628a con CCS
« Respuesta #7 en: 19 de Febrero de 2015, 17:49:04 »
Hay dos parámetros a tener en cuenta.
La precisión viene dada por la desviación de la frecuencia del oscilador. Sobre todo va a variar por la temperatura y el tiempo. La temperatura puedes compensarla por software para mejorar la precisión.

Otro parámetro importante es la exactitud. Los relojes de verdad no cuentan 32768 pulsos por segundo. Cuentan un poco más o un poco menos para ajustar la falta de exactitud del oscilador.

Un saludo.

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5883
    • Picuino
Re: Implementar reloj preciso en un 16f628a con CCS
« Respuesta #8 en: 19 de Febrero de 2015, 18:14:29 »
Para ajustar tanto la precisión como la exactitud de tu oscilador te recomiendo que uses como referencia un receptor GPS.

Saludos.