Sie benötigen keine Echtzeituhr, um eine Uhr zu bauen: Der ATmega-Chip verfügt über die gesamte Hardware, die zur Erfüllung der Aufgaben der Echtzeituhr selbst erforderlich ist. Hier ist, wie:
Holen Sie sich einen 32768 Hz-Uhrenkristall: Kaufen Sie ihn oder bauen Sie eine alte Uhr auseinander. Diese speziell für die Zeitmessung entwickelten Kristalle weisen eine extrem geringe Temperaturdrift auf. Sie würden auch eine davon benötigen, wenn Sie einen RTC-Chip verwenden möchten.
Konfigurieren Sie die Sicherungen Ihres ATmega so, dass der 8-MHz-RC-Oszillator ausgeschaltet ist. Dies wird Ihre millis()
Funktion fürchterlich ungenau machen und auch die Pins XTAL1 und XTAL2 freigeben.
Verbinden Sie den Uhrenkristall mit den Pins TOSC1 und TOSC2. Dies sind die gleichen Pins wie bei XTAL1 und XTAL2 (9 und 10 beim 328P). Die verschiedenen Namen bedeuten unterschiedliche Funktionen.
Konfigurieren Sie den Timer / Zähler 2 für asynchronen Betrieb, normalen Zählmodus, Prescaler auf 128 und aktivieren Sie den Timer-Überlauf-Interrupt.
Jetzt erhalten Sie einen TIMER2_OVF-Interrupt mit einer sehr konstanten Rate von einmal pro Sekunde. Sie müssen die Uhrzeitanzeige im ISR nur um eine Sekunde vorstellen. Zwischen den Interrupts können Sie die MCU in einen sehr tiefen Schlaf versetzen (Energiesparmodus: nur Timer / Counter 2) und jahrelang auf ein paar AA-Zellen laufen lassen. Es sei denn, das Display ist offensichtlich stromhungrig.
Genau das habe ich getan, um meine 24-Stunden-Einhand-Wanduhr zu bauen . Dieser Link verweist nun auf die englische Übersetzung der Originaldokumentation in Französisch.
Quarzkalibrierung
Wenn Sie Ihren Quarz nicht kalibrieren, können Sie eine signifikante Abweichung erwarten, in der Regel einige Sekunden pro Woche . Die Driftrate hängt von der Streukapazität der Leiterbahnen ab, die den Kristall mit der MCU verbinden. Im Prinzip könnte es durch Hinzufügen einer zusätzlichen, fein abgestimmten Kapazität entfernt werden. Es ist erwähnenswert, dass Sie das gleiche Driftproblem mit einer RTC haben würden.
Wenn Sie mit dieser Genauigkeit zufrieden sind, dann leben Sie damit und seien Sie glücklich. Wenn Sie jedoch die Drift messen möchten, werden Sie feststellen, dass sie sehr stabil ist. Sie können dies dann in der Software problemlos kompensieren und eine Genauigkeit von wenigen Sekunden pro Jahr erzielen .
Der Algorithmus zur Korrektur der Drift ist sehr einfach. Aus der gemessenen Drift ermitteln Sie die genaue Verzögerung zwischen den Interrupts, die ungefähr 10 9 Nanosekunden betragen sollte. Dann gilt Folgendes:
#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;
}
}
Im obigen Beispiel ist der Quarz etwas zu schnell, und die Software gleicht dies aus, indem alle paar Tage ein Häkchen „fehlt“. Wenn der Quarz zu langsam wäre, würde derselbe Code stattdessen alle paar Tage ein Mal doppelt angeklickt.
Diese Art der Kalibrierung könnte auch für eine RTC durchgeführt werden, ist jedoch erheblich komplexer, da die RTC die Zeit in einer aufgeschlüsselten Form anzeigt, die sich für arithmetische Operationen naturgemäß nicht eignet.