NTP-Werkstatt-Uhr




Fertiges GerätFertiges Gerät


Teil 1 Digitaluhr mit I2C-Componenten




Für meine Werkstatt suchte ich eine Uhr mit grossen Ziffern, die ich auch von größer Entfernung lesen kann. Nach dem Studium diverser Elektronik-Kataloge erschienen mir die angebotenen Produkte entweder zu teuer oder nicht ausreichend, so dass ich selber zum Lötkolben gegriffen habe.
Geplant war ursprünlich:

Der Einsatz eines DCF-Modul war dann doch nicht möglich, da in der Werkstatt kein Empfang ist. Die 6stellige Anzeige konnte ich mir auch knicken, da ich kein bezahlbares Gehäse in der entsprechenden Größe gefunden habe.

Als Temperatursensor hatte ich noch einen LM75 übrig, als RTC-Baustein einen PCF8583. Der RTC wird von einem 32khz-Quartz getaktet und wird von einem 5V-Goldcap gestützt. Das Display wollte ich dieses Mal wegen der Belastung des Prozessors nicht im direkten Multiplexbetrieb wie beim S88-Modul ansteuern, sondern ebenfalls einen I2C-Baustein einsetzen. Aufgrund der für die 7-Segment-Anzeigen notwendige Spannung von 12V (4LED in Serie pro Element, 9V sind zu wenig!) und des Preises habe ich zum SAA1064 gegriffen.

I2C-BaugruppeI2C-Baugruppe

Als Prozessor wird ein ATMEGA8 aus der Bastelkiste mit 8Mhz-Quarz eingesetzt, von dem im Wesentlichen nur die I2C-Pins und 2Pins für den Doppelpunkt benötigt werden. Die serielle Schnittstelle kann über ein RS232-Pegelwandler-Modul nach draussen geführt werden. Die Programmierung erfolgte in BASCOM.
Für die I2C-Ansteuerung habe ich meine I2C-PHP-Library nach Bascom portiert und an die Syntax der vorhandenen I2C-Befehle angepasst.
Die Software fragt in einer Endlosschleife den RTC ab und setzt damit die Systemzeit permanant neu. Jede Sekunde wird der LM75 ausgelesen und das Display aktualisiert. Dabei werden die DezimalPunkte der 7-Segmentanzeigen nacheinander aktiviert, so dass sich ein fortlaufender Punkt ergibt. Zusätzlich blinkt der Doppelpunkt
ܢer die serielle Schnittstelle wird jede Sekunde die aktuelle Zeit sowie die Temperatur ausgegeben. Mittels einfacher Befehle kann man darüber auch die Datum/Zeit setzen sowie auslesen.

Prozessor-BaugruppeProzessor-Baugruppe

Als Netzteil sollte zunächst ein Netz-Trafo mit 12V/1A-Ausgang zum Einsatz kommen. Da ich den Platz auf der Platine dann aber frei haben wollte und wegen der Problematik mit Netzspannung im Gerät habe ich mich dann für eine Spannungsversorgung mit einem normalen 12V Steckernetzteil entschieden, wodurch die in Teil2 beschriebenen Erweiterung erst möglich wurde. Die 12V werden zur Ansteuerung des SAA1064 direkt verwendet, die übrigen Bausteine wurden zunächst über einen Standard 78S05 Linearregeler versorgt. Der Prozessorteil benötigt ca. 50mA. , das Display im Peak ca. 350mA. Das NetIO-Board braucht ca. 200mA. Wegen der hohen Wärmeentwicklung am 78S05 wurde dieser durch den Step-Down-Wandler MiniPowerSupply von Ulrich Radig ersetzt.

Schaltplan PowerunitSchaltplan Powerunit

Als Gehäuse wurde das Serie7000 Gehäuse von ELV verwendet. Dort kann man sich Ober- und Unterschalen (sind Baugleich) getrennt bestellen, die in Transparent, weiss und schwarz erhältlich sind. Im Innenraum ist Platz für eine 250x150mm Leiterplatte. Die nutzbare Bauhöhe ist ca. 80mm. Ich habe eine 500mm x 100mm Streifenleiterplatte geteilt und daraus eine Trägerplatine mit dem Prozessorteil und aus dem Rest getrennte Display-Module für jeweils 2 Digits plus einen kleinen Streifen für die Platine mit den Doppelpunkt geschnitten. Diese Platinen werden dann mittels 40mm Abstandsbolzen auf die Trägerplatine gesetzt. Die elektrische Verbindung erfolgt über Flachbandkabel.

Uhr-BaugruppenUhr-Baugruppen
Uhr-Baugruppen LeiterseiteUhr-Baugruppen Leiterseite

Teil 2 Umbau zur NTP-Uhr

Wie weiter oben beschrieben war es nicht möglich, einen DCF-Empfänger zur Zeitsynchronisation einzusetzen. Da ich auch nicht über die Werkzeuge verfüge, um den RTC-Takt mittels Trimmer genau einzustellen, kam der Wunsch nach Synchronisation mittels NTP auf. Dazu suchte ich ein kostengünstiges Netzwerkmodul, das ich auch selber Programmieren konnte. Wieder landete ich bei Ulrich Radig und dessen AVR-Webmodulen, die zudem als Bausatz angeboten werden. Als erstes probierte ich das Ethernet ATMega32/644 Experimentierboard. Leider passte es nicht mehr in das Gehäue und hatte auch keine Befestigungspunkte. Selbst Leiterplattenschienen fanden keinen halt.
Als nächstes versuchte ich es mit dem kleineren AVR Webmodul. Das hätte wunderbar rein gepasst, aber es arbeitet mit 3V-Logik und konnte deswegen die vorhandene I2C-Bausteine nicht direkt ansteuern. Die nächste Idee, den I2C-Prozessor und das AVR-Webmodul über die serielle Schnittstelle zu koppeln habe ich auch aufgegeben, weil der augelötete ATMEGA644 nur eine USART hat und mir die Programmierung einer Software-USART in C zu heikel erschien(Interrupt-Nutzung).
Durch einen Thread im Bascom-Forum wurde ich auf das Pollin AVR-NetIO Modul aufmerksam gemacht, wofür auch Quellcode für die Ethernet-Anbindung in BASCOM existiert (siehe diesen Thread). Leider wird der Quellcode für die Original-Software des NetIO vom Hersteller nicht freigegeben.
Das NetIO-Modul hat die Netzwerk-Anschlüsse auch an der schmalen Seite, wodurch es auch sehr gut unter ein Display-Modul passt.

Eigentlich hatte ich es mir einfacher vorgestellt, den vorhandenen Netzwerk-Code in das Uhrenprogramm einzupassen, aber dann wurden es doch einige Wochenenden, wo ich den Code nach meinen Vorstellungen aufgeräumt, besser dokumentiert und segmentiert habe. Nicht zuletzt war ein tiefer Blick in die TCP-Grundlagen notwendig, um den Aufbau der Packete zu verstehen, um darus mögliche Optimierungen ableiten zu können.
Die Netzwerk-Konfigurationsdaten habe ich ins EERPROM verbannt. Damit kann man recht einfach mehrere Uhren installieren. Wichtig ist insbesondere, das die eigene MAC-Adresse sowie die IP-Adresse, Netmask, Gateway, NTP-Server an die eigenen Umstände angepaßt werden.
Wenn die Uhr startet, wird als Erstes die Zeit vom RTC geholt. Die Systemuhr wird über einen Timerinterupt betrieben, der eine Variable bis zur vollen Sekunde hochzählt. Nach dem Initialisieren des Netzwerkcontrolers wird ein ARP-Request auf die Gateway-IP-Adresse gemacht. Anschliessend wird ein NTP-Request-Packet über den Gateway an den Zeitserver geschickt. Jetzt ist die Main-Loop erreicht, worin regelmäßig nachgesehen wird, ob der Netzwerkcontroler ein neues Packet bereit hält. Ist darin die erwartete Antwort des NTP-Servers enthalten, wird die System-Zeit und die RTC-Zeit neu gesetzt. Die Sommerzeit wird anhand des Datums berücksichtigt. Die Uhr antwortet auch auf Ping-Requests. Andere Packete werden verworfen. Die urspünglich geplante DHCP-Unterstützung habe ich wieder rausgenommen, da ich es nicht brauche und der Code mich noch einige Wochen gekostet hätte. Außerdem konnte ich so die max. Puffergröße wesentlich kleiner setzen, so das viel SRAM gespart wurde
Zu jeder vollen Sekunde wird die Display-Anzeige aktualisiert. Vor jeder vollen Minute wird die aktuelle Zeit und Temperatur über die serielle Schnittstelle ausgegeben. Vor jeder vollen Stunde wird ein neuer NTP-Request abgesetzt, bei dessen Eintreffen die Zeit wie beschrieben neu gesetzt wird.
Zusälich habe ich den MCS-Bootloader implementiert, um die Firmware von aussen über den seriellen Port des NetIO-M32 updaten zu können.

Anschlussbelegung NetIO-ModulAnschlussbelegung NetIO-Modul

Der physikalische Anschluss an die vorhandene I2C-Uhr ist einfach. Der ATMEGA8 fliegt raus und wird nicht mehr gebraucht. ܢÜber den NetIO-Extension-Stecker wird das Board von der Uhr mit 5V von der MiniPS mitversorgt (der 7805-Regler auf der NetIO-Platine muss nicht bestückt werden, auch nicht die Schraubklemmen und den 25pol Anschluss), 2 Pins werden SDA und SCL (Software I2C, d.h. die Bascom i2clib kann nicht mehr benutzt werden), weiter 2 Pins steuern den Doppelpunkt. Fertig. Das Modul wird im hinteren Teil auf 15mm Abstandshalter auf die Trägerplatine geschraubt und im vorderen Teil an der Frontplatte befestigt.

abgespecktes NetIO-Modulabgespecktes NetIO-Modul
NTP-Uhr-BaugruppenNTP-Uhr-Baugruppen

Die Ausschnitte in der Frontplatte wurden mit einer Dremel gefräst. Falls jemand eine gute Idee hat, wie man Gehäuse- und Frontplattenausschnitte sauber und gerade mit Werkstattmitteln hinkriegt, bin ich für jede Info dankbar.

NTP-Uhr-FrontplatteNTP-Uhr-Frontplatte

Fazit

Gedacht war die Uhr als preiswerte Zeitanzeige für die Werkstatt.
Die Zeitanzeige habe ich realisiert. Beim Anschalter der Stromversorgung in der Werkstatt habe ich eine gut sichtbare Zeitanzeige.
Wenn ich alle Kosten für Bauelemente, Module, Gehäuse, Versandkosten sowie hinterher nicht mehr verwendete Testhardware zusammenrechne, ist es die wohl teuerste Uhr in unserem Haus geworden. Gänzlich negativ fällt die Rechnung unter Einbeziehung der Arbeitszeit (viele Wochenenden) aus. Aber dafür habe ich die dieses Projekt hier auch veröffentlicht. Den Bascom-Code stelle ich wie üblich auf Anfrage Interessenten zur rein privaten Nutzung zur Verfügung.
Der Funktionsumfang kann noch erweitert werden. Momentan sind erst 62% Flash-Speicher belegt. Denkbar wäre z.B. die Konfiguration über UDP (statt seriell) zu implementieren. Auch die unfertige DHCP-Implementierung wartet noch auf Vervollständigung. Aber dazu fehlt mir gerade die Zeit.

Download:
Schaltplan, Board und Quellcode auf GitHub (zur privaten Nutzung)

Index
Disclaimer
© 2006+ Thomas Dreßler
Alle Rechte vorbehalten
letzte Änderung 19.03.2015