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.

Zurück zur Startseite.