¿Con qué frecuencia debo consultar un RTC?

11

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

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

  1. Obtenga la fecha y la hora en el encendido y guárdela en la RAM, y luego a través del uso de la interrupción del temporizador incremente los valores de la RAM cada segundo, etc. El código usaría los valores en la RAM cuando sea necesario para saber la fecha / tiempo.
  2. A través del uso de una interrupción de temporizador, consulte el RTC cada segundo y copie la fecha y hora recibidas en la RAM. Nuevamente, el código usará los valores en la RAM cuando sea necesario para saber la fecha / hora.
  3. Cada vez que necesito averiguar la hora, consultar el RTC y usar su respuesta directamente.

¿Cuál sería el mejor enfoque?

    
pregunta user9993

4 respuestas

23

Yo usaría una cuarta opción.

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

  • Obtienes el tiempo del chip una vez al inicio de tu programa, y quizás ocasionalmente a partir de ese momento, tal vez una vez por hora.
  • La señal de interrupción luego activa una rutina de interrupción en tu MCU en la que incrementas el tiempo en un segundo.

Ese acuerdo le da la precisión al segundo del RTC sin la sobrecarga de leer activamente el RTC.

    
respondido por el Majenko
9

3º y 2º son más viables.

El enfoque

3º es el que uso en la mayoría de los casos. Su beneficio es que no tengo que preocuparme por duplicar el RTC en la RAM. Su posible defecto es que la interrogación del RTC a través del bus serie introduce un retraso. Si escribe datos una vez por segundo, es probable que este retraso no importe.

El enfoque

2do también es bueno. El mantenimiento de un reloj espejo puede introducir un error de hora normal, si el dispositivo se está ejecutando durante mucho tiempo. El reloj del espejo puede separarse del RTC. Si lees el RTC con regularidad, la deriva no se acumulará.
Sin embargo, recomendaría no realizar una comunicación en serie en la propia rutina de servicio de interrupción (ISR). Establezca una bandera en el ISR y realice la comunicación en serie en main ().

p.s. En todos los casos, estaba usando DS1307.

    
respondido por el Nick Alexeev
6

Algunos RTC (por ejemplo, MC68HC68T1 [que es cierto que casi nadie debería estar usando]) pausarán su conteo interno cuando se lean para dar una respuesta consistente. Deben leerse desde tan raramente como sea posible para minimizar la interrupción. Léalos una vez y luego use las interrupciones de temporizador para actualizar el valor de tiempo almacenado en la RAM de la MCU.

    
respondido por el Ignacio Vazquez-Abrams
5

Voy a suponer que el RTC es un chip separado con su propio cristal o un módulo integrado con su microcontrolador que, de nuevo, tiene una fuente de tiempo separada (como un cristal de 32 kHz) que el 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 necesita leer el RTC, debe averiguar cuál es el error máximo que puede tener su reloj principal. Por ejemplo, si el cristal principal se especifica a 20 ppm, es igual al 0.002%. Por lo tanto, un reloj basado únicamente en la fuente del reloj principal podría derivar 0.00002 * 3600 * 24 = 1.728 segundos por día.

Por lo tanto, si lee el RTC solo dos veces al día, e incrementa el tiempo una vez por segundo con una interrupción del temporizador, nunca estaría apagado más de un segundo, nunca más de un segundo en comparación con el RTC es decir.

Si, como asumí anteriormente, su RTC es un chip separado con su propio cristal o un módulo integrado con su 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 apagarse en 0,43 segundos por día, o 13 segundos por mes.

Para solucionar esto, deberá ajustar el RTC, donde escribirá un factor de corrección en un registro. Si lo hace, le permitirá obtener el error prácticamente a cero. Pero, por supuesto, tendrá que tener una tercera fuente de reloj externa para usar como referencia al realizar la sintonización. Una referencia extremadamente precisa en los EE. UU. Es la línea de CA de 60 Hz, que está garantizado para ser < em> exactamente 60 * 60 * 60 * 24 (5,184,000) ciclos en un período de 24 horas entre media noche sucesivas. Para que esto sea útil, debes calcular el tiempo durante las 24 horas completas, ya que los 60 Hz pueden desviarse entre medianoche.

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

Si, en cambio, sus tiempos RTC provienen de una fuente externa, como la hora de la red celular (llamada AT + CCLK?), o un servidor de tiempo de red que usa NTP, entonces puede usar el valor RTC tal como está, ya que no habrá nada para "sintonizar".

    
respondido por el tcrosley

Lea otras preguntas en las etiquetas