GREETBoard RTC Modul – Der Prototyp (Version 0.2)

Die Abkürzung RTC steht für „Real Time Clock“, was sich am Besten mit „Echtzeit-Uhr“ übersetzen lässt. Diese Bausteine werden verwendet, wenn zeit- und/oder datumsabhängige Steuerungsaufgaben übernommen werden sollen. Mikrocontroller sind für solche Aufgaben leider nicht genau genug. Eine Zeitsteuerung würde binnen weniger Tage etliche Minuten falsch gehen. Für eine Heizungs- oder Rolladensteuerung wäre dies völlig unbrauchbar.

Das GREETBoard Projekt ist eine Lernplattform, mit der ich mich der Welt der Mikrocontroller nähern möchte. Zentraler Bestandteil ist das Hauptmodul GREETBoard ATMega128, dass den Mikrocontroller und die wichtigsten Grundfunktionen zur Verfügung stellt. Zusätzliche Module können an das Hauptmodul angeschlossen werden und dieses so um Funktionen erweitern.

Der DS1307

Es gibt eine Menge verschiedener Real Time Clock Bausteine mit vielen verschiedenen Features. Daher musste ich mich am Anfang erstmal orientieren und festlegen, was ich eigentlich haben wollte. Eine hohe Priorität war die Kommunikation über den I²C-Bus. Damit belegt ich nicht einen der Ports des ATMega1284 und das zukünftige Modul fügt sich harmonisch in die Reihe der bestehenden I²C-Module ein. Außerdem sollte es möglichst kein SMD IC sein, sodass auch Löt-Laien keine Probleme bekommen. Ach ja, der Preis sollte nicht utopisch hoch sein.

Mit diesen Anforderungen im Hinterkopf blieb ich recht schnell beim DS1307 von Dallas Semiconductors hängen. Es ist per I²C ansteuer- und auslesbar, es ist im 8-pin DIP Gehäuse zu haben und der Preis ist nicht sehr hoch.

Der Baustein hat gerade mal 8 Beinchen und ist echt klein, obwohl es nicht die SMD-Variante ist. Nur ein kleiner Uhrenquarz von 32.768 kHz wird benötigt (X1/X2), der zwar Beinchen hat aber trotzdem auf die Platine aufgelegt und dort festgelötet wird. Das ist zwar wie SMD, aber super-einfach zu löten. Damit die interne Uhr auch ohne Spannungsversorgung weiter läuft, ist eine Batterie notwendig. Diese wird mit ihrem + Anschluss an den Pin 3 gehängt; Minus liegt einfach auf GND. Dadurch muss die RTC nicht nach jedem Neustart wieder gestellt werden. Die I²C-Kommunikation läuft über die Pins 5 und 6. Sehr interessant ist der Ausgang SQW/OUT, an dem der DS1307 ein rechteckförmiges Taktsignal ausgeben kann. Damit könnte er auch als Impulsgeber verwendet werden. Für meinen Zweck benötige ich diese Funktion nicht, aber wer weiß was später noch so kommt 😉 Wird die RTC verwendet (also ausgelesen, beschrieben, o.ä.), ist der Pin 8 für die Spannungsversorgung (5V) zuständig. Das bedeutet, dass der DS1307 keine Spannungsversorgung benötigt (abgesehen von der Batterie), damit die Zeit intern weiter läuft.

GREETBoard I2CRTC - Pinbelegung des DS1307

GREETBoard I2CRTC – Pinbelegung des DS1307

Schaltung

Die Grundschaltung ist sehr überschaubar, da neben dem IC nur eine Batterie und ein Uhrenquarz benötigt wird. Bei meiner Version verpasse ich dem DS1307 aber noch einen 100nF Kondensator und zwei Pull-Up-Widerstände, inkl. Jumper, für den I2C-Bus. Das war es schon! Natürlich benötigt das Modul einen Pfostenstecker für den I2C-Anschluss.

GREETBoard I2CRTC - Schaltplan - Version 0.2

GREETBoard I2CRTC – Schaltplan – Version 0.2

Die Register des DS1307

Die Daten des DS1307, wie Zeit und Datum, sind in verschiedenen internen Registern abgelegt. Diese Register werden in les- und beschreibbare Register kopiert, sobald der DS1307 per I2C angesprochen wird. Damit wird verhindert die Register erneut auszulesen, im Falles einer Veränderung der Werte während des Lesevorgangs. Die Uhr läuft im ursprünglichen Register, sozusagen im Hintergrund, ungestört weiter.

Der Inhalt der Register sind im BCD-Code  abgelegt. BCD steht für Binary-Coded Decimal, also eine binär-codierte Dezimalzahl. Wie diese aufgebaut und in reine Dezimalzahlen umgerechnet werden, habe ich in einem vorherigen Artikel beschrieben.

Empfängt der DS1307 ein Schreib-Startsignal über den I2C-Bus, können die Register Byte für Byte mit BCD-Daten gefüllt werden. Es ist aber auch möglich die entsprechende Adresse direkt anzusprechen, z.B. wenn nur der Tag geändert werden soll. Die I2C-Kommunikation endet mit einem Stop-Befehl.

i2c_start_wait(I2C_RTC+I2C_WRITE);
i2c_write(addr);
i2c_write(val);
i2c_stop();

Das ganze geht natürlich auch als Lesevorgang indem „I2C_WRITE“ gegen „I2C_READ“ getauscht wird.

GREETBoard I2C-RTC - Register des DS1307

GREETBoard I2C-RTC – Register des DS1307

Jetzt aber mal zu den einzelnen Daten in den verschiedenen Registern

CH – CLOCK HOLD  (0 = Ein / 1 = Aus)
Dies ist der Schalter für den internen Oszillator. Bei der Initialisierung des RTC muss der eingeschaltet werden!

12/24  (0 = 24 Stunden  / 1 = 12 Stunden)
Bit für die Umstellung zwischen dem 12- und 24-Stundenmodus. Wenn aktiviert, zeigt Bit 5 an ob es sich gerade um eine AM (0) oder PM (1) Uhrzeit handelt.

10 Sekunde/Minute/usw
Die „10“ soll verdeutlichen, dass in diesen Bits die Zehnerstelle gespeichert wird. Wird z.B. 24 Sekunden gelesen, so beinhalten die ersten vier Bits eine BCD-codierte „4“ und Bit 4-6 die BCD-codierte „2“. Das gilt für alle Bits mit der „10“ im Titel.

Das Control Register

Das letzte Byte (07×0) ist für das Verhalten des Ausgangs SQW/Out verantwortlich.

OUT
Wenn das Rechtecksignal deaktiviert ist (SQWE = 0), dann bestimmt dieses Bit ob der Ausgang SQW/OUT High (Out = 1) oder Low (Out = 0) ist.

SQWE
Mit einer logischen 1 wird das Rechtecksignal am Ausgang SQW/OUT aktiviert. Die Frequenz kann mit den Bits RS0 und RS1 eingestellt werden

RS1 und RS2
Diesen beiden Bits stellen die möglichen Frequenzen des Rechtecksignals ein

RS1   RS2   Frequenz
 0     0         1Hz
 0     1     4,096kHz
 1     0     8,192kHz
 1     1    32,768kHz

Layout

Tja, beim Entwerfen der Platine haben sich ein paar dumme Fehler eingeschlichen! Zum Einen habe ich vergessen, die Kupferfläche der Bestückungsseite GND zuzuweisen. Dadurch wurde der Minus-Kontakt der Batterie nicht automatisch mit den GND-Kontakten der übrigen Bauteile verbunden. Auf dem Bild kann man eventuell erkennen, dass das Pad ringsrum keinen Anschluss an die Kupferfläche hat. Auf der Lötseite habe ich es aber richtig gemacht. Gleichzeitig hatte ich dieses Pad so eingestellt, dass es auch auf der Lötseite keinen Lötstopplack erhalten soll. Damit hatte ich auf beiden Seiten einen großen „Kupferfleck“ auf der Platine. Dadurch kann der Batteriehalter auf der Rückseite verlötet werden. Der letzte Fehler wurde von mir erzeugt und vom Platinenhersteller korrigiert – die Lage des Quarzes. Ursprünglich sollte er auf der Bestückungsseite verlötet werden. Gut zu erkennen ist das Rechteck mit der kHz-Angabe daneben. Unwissend wie ich war, habe ich die Lötpads auf der Lötseite platziert, den Bestückungsdruck UND die Freistellung für den Lötstopplack auf der Bestückungsseite. Glücklicherweise wurde das erkennt und die Pads auf der richtigen Seite freigestellt. Dadurch liegt der Quarz auf der falschen Seite, ist aber funktionsfähig.

Das folgende Bild zeigt das Layout des Versuchs-Boards. Dort habe ich aber bereits den Quarz etwas verändert. Die ursprüngliche Fassung habe ich leider überschrieben 🙁

GREETBoard I2C-RTC - Ursprüngliches Board Layout

GREETBoard I2C-RTC – Ursprüngliches Board Layout

Ausblick

Nach einigen Wirrungen im Platinendesign hat das RTC-Modul schlussendlich hervorragend funktioniert. Daher habe ich die Ansteuerung der Real Time Clock in einem separaten Artikel erklärt. Sie kann auch für die Version 1.0 unverändert übernommen werden.

Bis zum nächsten Mal,
Euer Timo

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.