Die Microcontroller Firmware

Allgemeines zum Microcontroller

Als Microcontroller kommt ein Atmel ATMEGA168 zum Einsatz der mit 8 MHz getaktet wird. Er bietet ein sehr gutes Preisleistungsverhältnis und kann mit der Hochsprache C programmiert werden.

Der Controller verfügt über 16kB Flash Speicher, 512Byte EEPROM, 1024Byte SRAM und 23 Ein- bzw. Ausgänge.

Seit der Version 1.09 gibt es die Firmware auch für den atmega328p der auf einigen Arduino Boards verbaut ist.

Die Firmware

Die Firmware die auf dem Microcontroller läuft ist in C geschrieben. Als Entwicklungsumgebung dient WinAVR. WinAVR setzt auf dem gcc Port für Atmel Microcontroller auf.

Der Quellcode umfasst derzeit 2500 Zeilen Programmcode. Die Firmware Version ist V1.09. Kompiliert als Maschinencode hat sie eine Grösse von 14KByte.

Blockbild der wichtigsten Firmwarekomponenten

Funktionsbeschreibung der Firmware

Aufbau der Firmware

Intern arbeitet die Firmware mit 2 Uhren. Beide Uhren können unabhängig von einander gestartet und gestoppt werden. Wie das genutzt wird, wird später erklärt.

Die beiden Uhren sind:

  • Die eigentliche Uhr die die Nebenuhren steuert also die Zeit der Nebenuhren darstellt, ich nenne sie einfachheitshalber Steueruhr
  • Und die Synchronisationsuhr, sie dient beim stellen der Uhr als Referenzuhr
Eine Übersicht der Module:

Firmware Module Übersicht
Modul Kurzbeschreibung
Steueruhr Steuert die Nebenuhren, und hat deren Zeit
Synchronisationsuhr Wird zur synchronisation aktiv und regelt die Steueruhr nach
Spannungsausfallerkennung Sichert bei Spannungsausfall Daten ins EEPROM
Synchronisation Synchronisiert Steueruhr mit Synchronisationsuhr
DCF77 Wertet die Informationen eines DCF77 Empfängers aus und startet die Synchronisation
Serielles Userinterface Dient zum bedienen der Mutteruhr
LCD Displayausgabe Gibt den Status der Uhr via LCD Display aus.
LED Statusausgabe Gibt den Status der Uhr via LED aus.

Die Steueruhr
Hat die Aufgabe bei jedem Minutenwechsel den jeweiligen Ausgangspuls für die geraden bzw ungeraden Minuten zu erzeugen. Wird ein Stromausfall erkannt, wird die Uhr sofort gestoppt um sicherzustellen das die Zeit externen Nebenuhren immer mit der der Steueruhr übereinstimmt.

Die Synchronisationsuhr
Sie kommt dann ins Spiel wenn die Nebenuhren bzw. die Steueruhr umgestellt werden mu├č. Die Synchronisationsuhr wird von 3 Seiten gesetzt:

  • Wenn ein komplettes gültiges DCF77 Paket empfangen wurde.
  • Wenn das Kommando ast ausgeführt wird
  • Oder das Kommando nst ausgeführt wird
Trifft eines der 3 Ereignisse zu wird zusätzlich zum setzen der Synchronistationsuhr auch das Flag "Synchronisationsstart" gesetzt und die Synchronisation gestartet.

Stromausfallerkennung
Bei einem Wechsel des Eingangs der Spannungsausfallerkennung von Logisch HIGH->LOW. Wird wie oben beschrieben sofort die Steueruhr gestoppt. Diese bleibt solange angehalten bis der Eingang wieder auf HIGH Pegel liegt. Es wird zwar damit in kauf genommen das die Steueruhr nach geht hat aber den Vorteil das die Zeit auf der Steueruhr und auf den Nebenuhren immer identisch sind.

Wird ein Spannungsausfall erkannt werden folgende Informationen sofort ins EEPROM geschrieben:

  • Zeit der Steueruhr bzw. die der Nebenuhren
  • Wenn ein gültiges DCF Empfangspaket vorliegt, Datum und Uhrzeit
Die Steueruhrzeit wird bei Wiederkehr der Spannungsversorgung wieder aus dem EEPROM eingelesen.

Die Synchronisation
Wie oben schon erwähnt kann die Synchronisation durch 3 Varianten gestartet werden. Allen dreien ist gemeinsam das die Synchronisationuhr auf eine neue Zeit gesetzt wird sowie anschlie├čend das Flag zum starten des Synchronisationsvorgangs.

- Die Synchronisationsuhr dient also nach dem setzen für die Steueruhr als Referenz. Die Synchronisationsuhr läuft nach dem setzen per DCF77 oder mit dem Kommando nst weiter, d.h. Sie hat für den Zeitraum der Synchronisations die aktuelle Zeit -

Ist die Synchronisations gestartet wird im Sekundentakt die Differenz zwischen Steueruhr und Synchronisationsuhr berechnet. Jetzt mu├č zwischen:

  • Vorwärts- sowie
  • wartende Synchronisation
unterschieden werden.

Wartende Synchronisation
Die wartende Synchronisation kommt immer dann zum Zuge wenn die Zeit der Synchronisationsuhr bis zu 61 Minuten hinter der der Steueruhr ist, d.h. Die Steueruhr wird angehalten und wartet auf die Synchronisationsuhr, die wiederrum läuft weiter. Die Steueruhr würde also bis zu 1 Stunde auf die Synchronisationsuhr warten.

Ein praktisches Beispiel wäre die Umschaltung zwischen Winter- nach Sommerzeit, d.h. wenn die Uhren von 3Uhr nach 2Uhr zurück gestellt werden. Würde hier nicht gewartet werden müssten alle Nebenuhren um 11 Stunden vorgestellt werden. Die Uhrwerke der zumeist mechanischen Analogwerke werden dadurch geschont.

Vorwärts Synchronisation
In allen anderen Situationen wird die Steueruhr, und somit auch die Nebenuhren, solange weitergestellt bis die Zeit der Synchronisationsuhr erreicht ist. Der Unterschied von Steueruhr und Synchronisationsuhr wird jede Sekunde berechnet und die Steueruhr um jeweils 1 Minute weitergestellt bis beide Uhren die gleiche Zeit zeigen.

Im Anschlu├č an eine erfolgreiche Synchronisation werden die Synchronisationsuhr angehalten sowie das Synchronisationsflag zurück gesetzt.

Der 12 Stunden bzw 24. Stunden Modus
Es gibt noch einen Parameter der die Synchronisations beeinflu├čt: Der 12 Stunden bzw 24. Stunden Modus. Dieser wurde auch zur Schonung der Uhrwerke implementiert.

Sind an der Mutteruhr nur 12 Stunden Uhren, wie z.B. analoge Zeigeruhren, angeschlossen, erfolgt die Synchronisation auch nur auf 12 Stunden Basis, obwohl die beiden internen Uhr weiter im 24 Stunden Modus arbeiten. Lediglich die Synchronisation berechnet nur eine 12 Stundendiffernz. Das l├Ą├čt sich am besten anhand eines Beispiels erklären:

  • 12 Stunden Modus ist aktiv
  • Eine neue Zeit wird gesetzt, Synchronisationsuhr auf 16 Uhr(z.B. durch DCF77)
  • Steueruhr zeigt 2Uhr
  • Im 24 Stundenmodus müsste jetzt die Uhren um 14 Stunden vorgestellt werden
  • Im 12 Stundenmodus wird die Steueruhr auf 4 Uhr und gleiche Minuten synchronisiert und anschlie├čend auf der Steueruhr intern 12 Stunden addiert

Das ganze funktioniert auch im wartenden Modus, Beispiel:

  • 12 Stunden Modus ist aktiv
  • Eine neue Zeit wird gesetzt, Synchronisationsuhr auf 4 Uhr
  • Steueruhr steht auf 17Uhr
  • Im 24 Stundenmodus müsste jetzt die Steueruhr um 13 Stunden vorgestellt werden
  • Im 12 Stundenmodus wird die Steueruhr bis auf wartenend gesetzt bis die Synchronisationsuhr 5 Uhr und gleiche Minuten erreicht hat, anschlie├čend auf der Steueruhr nur intern 12 Stunden addiert und die Steueruhr wieder in gang gesetzt.
DCF77
Das Modul dient der Auswertung eines am Microcontroller angeschlossenen DCF77 Signal Empfängers. Es ist an- und abschaltbar, d.h. die Steueruhr liefe auch als "normale" Uhr ohne Funknachführung weiter, mit dem Nachteil die Uhr ist nur so genau wie Ihr Quarzbasis und es findet keine Sommer- und Winterzeitkorrektur statt.

Das Modul hat im wesentlichen folgende Aufgaben:

  • Das empfangene Datenpaket zu dekodieren
  • Das Überprüfen der empfangenen Daten, mittels der im DCF Protokoll bereitgestellten Mechanismen
  • Die Synchronisationsuhr zu setzen und die synchronisation zu starten
Ist ein DCF77 Datenpaket korrekt empfangen worden ist es genau für eine Minute gültig.

Serielles Userinterface
Es stellt die Schnittstelle zum Benutzer bereit. Es gibt 2 verschiedene um es anzusprechen:

  • Per Terminalemulator (PuTTY, minicom, Hyperterminal)
  • Per Windows Programm. Hier werden verkürzte Kommandos der Standard Befehle genutzt.
LCD Displayausgabe
Das Modul dient lediglich der Ausgabe von Statusinformationen über ein LCD Display(HD44800 kompatibel, 2x16 Zeichen).

Angezeigt werden:

  • Zeit auf Nebenuhren
  • Synchmodus 12/24Stunden
  • DCF aktiviert/deaktiviert
  • DCF Letzter Status (nur wenn DCF aktiviert)
  • DCF Status, gerade empfanges Bit(nur wenn DCF aktiviert und während des Empfangs)
  • DCF Datum/Zeit.(nur wenn DCF aktiviert und ein gültiges Paket empfangen wurden)
  • Synchronisationsstatus(nur wenn die Synchronisation aktiv ist)
LED Statusausgabe
Das Modul steuert die Status LED's an. LED's sind für folgende Stati vorhanden:

  • DCF Empfang
  • Letzter DCF Empfangsstatus
  • DCF Healthstatus
  • Nebenuhr werden gestellt