11 votos

¿Con qué frecuencia debo consultar un CTR?

Todavía no he utilizado un RTC, así que no estoy completamente seguro de la forma "normal" de leer un reloj de tiempo real. Hay algunos enfoques diferentes que he pensado, pero esperaba algún consejo al respecto.

Estas son las formas en que he pensado leer y aprovechar el tiempo hasta ahora:

  1. Obtiene la fecha y la hora al encender y la guarda en la RAM, y luego mediante el uso de la interrupción del temporizador incrementa los valores de la RAM cada segundo, etc. El código entonces usaría los valores en la RAM cada vez que necesitara saber la fecha/hora.
  2. Mediante el uso de una interrupción del temporizador, consultar el RTC cada segundo y copiar la fecha y hora recibidas a la RAM. De nuevo, el código utilizaría los valores en la RAM cada vez que necesitara saber la fecha/hora.
  3. Cada vez que necesito saber la hora, consulto el RTC y uso su respuesta directamente.

¿Cuál sería el mejor enfoque?

23voto

user4245 Puntos 324

Yo utilizaría una cuarta opción.

La mayoría de los chips RTC tienen la opción de emitir un pulso de 1 segundo. Deberías conectar ese pulso a una entrada habilitada para interrupciones en tu MCU.

  • Obtendrá la hora del chip una vez al comienzo de su programa y, a partir de entonces, ocasionalmente, tal vez una vez por hora.
  • La señal de interrupción activa entonces una rutina de interrupción en su MCU en la que se incrementa el tiempo en un segundo.

Esa disposición le da la precisión a la segunda del RTC sin la sobrecarga de leer activamente el RTC.

9voto

Nick Alexeev Puntos 20994

La 3ª y la 2ª son más viables.

es lo que utilizo en la mayoría de los casos. Su ventaja es que no tengo que preocuparme de reflejar el RTC en la RAM. Su potencial inconveniente es que interrogar al RTC a través del bus serie introduce un retraso. Si estás escribiendo datos una vez por segundo, este retraso probablemente no importará.

2do. también es bueno. El mantenimiento de un reloj espejo puede introducir un error de cronometraje, si el dispositivo está funcionando durante mucho tiempo. El reloj espejo puede desviarse del RTC. Si usted lee el RTC regularmente, entonces la deriva no se acumulará.
Sin embargo, yo aconsejaría no hacer la comunicación en serie en la propia rutina de servicio de interrupción (ISR). Establezca una bandera en la ISR y haga la comunicación en serie en el main().

p.d. En todos los casos, utilizaba el DS1307.

6voto

chrisbunney Puntos 228

Algunos RTCs (por ejemplo, el MC68HC68T1 [que hay que admitir que casi nadie debería usar ya]) pausarán su recuento interno cuando se lea de ellos para dar una respuesta consistente. Deben ser leídos desde lo menos posible para minimizar las molestias. Lee de ellos una vez y luego utiliza las interrupciones del temporizador para actualizar el valor del tiempo almacenado en la RAM del MCU.

5voto

Matt McMinn Puntos 6067

Voy a suponer que el RTC es un chip separado con su propio cristal, o un módulo integrado con tu microcontrolador que de nuevo tiene una fuente de tiempo separada (como un cristal de 32 kHz) del reloj principal. Y la fuente de tiempo para el RTC es más precisa que la del microcontrolador.

Para determinar la frecuencia con la que hay que leer el RTC, hay que averiguar cuál es el error máximo que puede tener el reloj principal. Por ejemplo, si el cristal principal tiene una especificación de 20 ppm, eso es lo mismo que el 0,002%. Así que un reloj basado sólo en la fuente de reloj principal podría derivar 0,00002 * 3600 * 24 = 1,728 segundos al día.

Así que si lees el RTC sólo dos veces al día, y en el medio incrementas la hora una vez por segundo usando una interrupción del temporizador, nunca estarás fuera más de un segundo - nunca estarás fuera más de un segundo en comparación con el RTC.

Si, como he supuesto antes, tu RTC es un chip independiente con su propio cristal, o un módulo integrado con tu microcontrolador, eso no significa que sea correcto. Un RTC también puede tener un error. Por ejemplo, si utiliza un cristal de 32 kHz con una tolerancia de 5 ppm (que son un poco más caros que los de 10 ppm), podría tener un error de 0,43 segundos al día - o 13 segundos al mes.

Para evitar esto, necesitarás afinar el RTC, donde escribes un factor de corrección en un registro. Hacerlo te permitirá conseguir el error prácticamente a cero. Pero, por supuesto, tendrás que tener un tercer externo fuente de reloj para usar como referencia al hacer la sintonía. Una referencia extremadamente precisa en los Estados Unidos es la línea de CA de 60 Hz, que es garantizado para ser exactamente 60*60*60*24 (5.184.000) ciclos en un periodo de 24 horas entre medias noches sucesivas. Para que esto sea útil, hay que cronometrar las 24 horas completas, ya que los 60 Hz pueden desviarse un poco entre medias noches.

Otra excelente referencia de tiempo sería utilizar el GPS (con una precisión de 10 ns), si uno ya tuviera hardware GPS en su proyecto.

Si en lugar de ello su hora RTC proviene de una fuente externa, como la hora de la red celular (llamada AT+CCLK?), o un servidor de hora de red que utilice NTP, entonces puede utilizar el valor RTC tal cual, ya que no habrá nada que "afinar".

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X