No necesita un RTC para construir un reloj: el chip ATmega tiene todo el hardware necesario para realizar las tareas del RTC. Aquí es cómo:
Obtenga un reloj de cristal de 32768 Hz: cómprelo o desarme un reloj antiguo. Estos cristales, diseñados específicamente para mantener el tiempo, tienen una deriva de temperatura extremadamente pequeña. También necesitarías uno de esos si quisieras usar un chip RTC.
Configure los fusibles de su ATmega para funcionar con el oscilador RC de 8 MHz. Esto hará que su millis()
función sea terriblemente inexacta, y también liberará los pines XTAL1 y XTAL2.
Conecte el cristal de reloj a los pines TOSC1 y TOSC2. Estos son los mismos pines que XTAL1 y XTAL2 (9 y 10 en el 328P). Los diferentes nombres se usan para significar diferentes funciones.
Configure el Temporizador / Contador 2 para operación asíncrona, modo de conteo normal, preescalador configurado en 128 y habilite la interrupción de desbordamiento del temporizador.
Ahora obtendrá una interrupción TIMER2_OVF a una velocidad muy constante de una vez por segundo. Solo necesita avanzar la pantalla del reloj un segundo en el ISR. Entre las interrupciones, puede poner el MCU en modo de suspensión muy profundo (modo de suspensión de ahorro de energía: nada funciona más que Temporizador / Contador 2) y funcionar durante años en un par de celdas AA. A menos que la pantalla tenga mucha energía, obviamente.
Hice exactamente esto para construir mi reloj de pared con una mano las 24 horas . Este enlace apunta ahora a la traducción al inglés de la documentación original en francés.
Calibración de cuarzo
Si no calibra su cuarzo, puede esperar una deriva significativa, generalmente unos segundos por semana . La tasa de deriva depende de la capacitancia parásita de las trazas que conectan el cristal a la MCU. En principio, podría eliminarse agregando un poco de capacitancia extra finamente ajustada. Vale la pena señalar que tendría el mismo problema de deriva con un RTC.
Si está satisfecho con este tipo de precisión, viva con ella y sea feliz. Sin embargo, si desea medir la deriva, notará que es muy estable. Luego puede compensarlo fácilmente en el software y lograr una precisión de unos segundos por año .
El algoritmo para corregir la deriva es muy simple. A partir de la deriva medida, calcula el retraso preciso entre las interrupciones, que debería estar muy cerca de 10 9 nanosegundos, luego:
#define ONE_SECOND 1000000000 // in nanoseconds
#define ONE_INTERRUPT 999993482 // for example
ISR(TIMER2_OVF_vect)
{
static uint32_t unaccounted_time;
unaccounted_time += ONE_INTERRUPT;
while (unaccounted_time >= ONE_SECOND) {
advance_display_by_one_second();
unaccounted_time -= ONE_SECOND;
}
}
En el ejemplo anterior, el cuarzo es un poco demasiado rápido, y el software lo compensa con un "tic" cada pocos días. Si el cuarzo fuera demasiado lento, el mismo código haría doble clic una vez cada pocos días.
Este tipo de calibración también podría realizarse para un RTC, pero sería significativamente más complejo porque el RTC informa el tiempo en una forma desglosada que no se presta naturalmente a operaciones aritméticas.