Wer in seiner Applikation ständig die aktuelle
Uhrzeit bzw. das aktuelle Datum benötigt, allerdings nicht auf DCF77-Empfänger
oder eine selbst programmierte Routine im MC zurückgreifen möchte, der braucht
eine RTC (Real Time Clock).
Davon sind auf dem Markt diverse Bausteine verfügbar, welche alle ihre eigenen
Vorzüge und Nachteile haben. Jeder große Halbleiterhersteller stellt mindestens
einen solchen Schaltkreis zur Verfügung. Das Hauptkriterium lag für mich in der
Anschlussform. Ich wollte auf keine Fall viele Pins opfern, bevorzugte also eine
komplett serielle Kommunikation.
Die Wahl viel auf den DS1302 von Dallas.
Dieser hat ein serielles Interface, stellt die Standard-Zeitgrößen (Uhrzeit + Datum) zur Verfügung, benötigt für seinen Betrieb allerdings einen externen Uhrenquarz als Taktgeber sowie nach Möglichkeit eine Batterie (Knopfzelle o.ä.) als Reserve-Spannungsversorgung, sollte die zentrale Spannungsversorgung einmal unterbrochen werden. Man möchte dann ja nicht jedes mal neu die aktuelle Zeit einstellen. Wer das möchte, kann sich die Batterie sparen :-)
Da er als PDIP verfügbar ist, sollte die Integration in die Applikation kein Problem darstellen.
Ein paar Worte zu den wenigen Anschlüssen:
SCLK, I/O und /RST dienen der seriellen Kommunikation. X1 und X2 stellen die
Anschlusspins für den externen Uhrenquarz (32,768KHz) dar. Es werden keine
externen Kapazitäten zusätzlich benötigt. VCC1, VCC2 und GND
dienen der Spannungsversorgung. VCC2 stellt hier die primäre Spannungsversorgung
(5V) dar. An VCC1 kann eine Batterie angeschlossen werden. Fällt VCC2 aus, so
bedient sich der RTC-Schaltkreis aus dieser. Aufgrund seiner geringen
Leistungsaufnahme (300nA bei 2V) dürfte diese ziemlich lange reichen.
Zusätzlich bringt der DS1302 noch 31 Bytes statischen RAM mit, welcher zum
Zwischenspeichern wichtiger Werte genutzt werden kann, welche eine Unterbrechung
der Spannungsversorgung überstehen sollen. Alternativ kann man natürlich auch
den internen EEPROM eines AVRs nehmen, muss aber mit der begrenzten Zahl an
Schreibzyklen und geringeren Zugriffsgeschwindigkeiten leben.
Um der RTC mitzuteilen, was man eigentlich von ihr möchte, gibt es ein Befehlsbyte.
1 | RAM/CK | A4 | A3 | A2 | A1 | A0 | R/W |
Das MSB (most significant bit) kann man als Startbit betrachten, es muss immer eins sein. Das 6. Bit legt fest, ob ein Zugriff auf den RAM oder die RTC stattfinden soll. Die Bits A4:0 legen fest, welche Speicherzellen angesprochen werden sollen. Das LSB (least significant bit) legt fest, ob ein Lese- oder Schreibzugriff durchgeführt werden soll.
Die Kommunikation wird über /RST gesteuert. Vor dem Start jeglicher Kommunikation muss man diesen Pin auf H-Pegel legen. Gleichzeitig stellt er eine Möglichkeit zur Verfügung, die Übertragung nach dem Transfer eines oder mehrerer Bytes zu beenden, indem man ihn wieder auf L-Pegel setzt.
Die Übertragung der auf das Befehlsbytes folgenden Bytes erfolgt mit dem LSB voran.
BURST-MODE:
Dieser Modus dient dazu, die Daten blockweise an den Baustein zu senden.
Ausgewählt wird er, indem im Befehlsbyte A4:0 gleich eins sind (entspricht einer
31). In der Uhr gibt es keinen Speicherplatz an den Adressen 9-31, im RAM
existiert die Adresse 31 nicht. Somit müssen zum Schreiben der Uhr-Register
mindestens die ersten 8 Register beschrieben werden, damit ein erfolgreicher
Zugriff erfolgt. RAM-Daten werden wie gesendet sofort übernommen, hier gibt es
keine Beschränkung.
Zeit und Datum sind in den ersten sieben RTC-Registern zu finden. Sie liegen im BCD-Format vor. Den Inhalt aller Register und deren Aufbau hier zu erläutern würde den Rahmen sprengen, dazu findet man im Datenblatt der RTC auf Seite 7 eine sehr übersichtliche Zusammenstellung.
Wichtig könnten jedoch noch die folgenden Informationen sein. Der Schaltkreis
verfügt zusätzlich über die Möglichkeit, komplett gestoppt zu werden, um den
Leistungsbedarf auf ein Minimum zu reduzieren. Man kann zwischen dem AM/PM und
dem 24h-Modus wählen. Im Kontrollregister kann ein Schreibschutz für den
Baustein aktiviert werden.
Ein weiteres Feature ist, dass die Möglichkeit besteht eine simple Ladeschaltung
für eine an VCC1 angeschlossene Batterie (oder auch Kondensator) zu aktivieren.
Es können intern dafür Dioden zwischen VCC2 und VCC1 ausgewählt werden (entweder
eine oder zwei zur Spannungsreduzierung) sowie einer von drei Serienwiderständen
(2K, 4K, 8K). Mit diesen Hilfsmitteln kann der Ladestrom eingestellt werden.
Für die zu schreibende Software ist noch wichtig, dass der maximale Takt bei 2MHz liegt, dies ist beim Timing zu berücksichtigen.
Wer noch mehr zu diesem Schaltkreis wissen möchte, den kann ich nur auf das Datenblatt verweisen. Zur Demonstration der Kommunikation habe ich natürlich wieder ein paar Routinen bereitgestellt, deren Anwendung in einem Beispielprojekt demonstriert wird. Dieses kann entweder hier herunter geladen oder über die Rubrik Programme bezogen werden (Low-Level).
Zusätzlich steht jetzt unter Programme ein Projekt zur Verfügung, in welchem auch Funktionen zum direkten Eintragen sowie Auslesen von Daten (also Sekunden, Minuten, ..., Jahr) vorhanden sind.