Eine Uhr mit dem IC PCF8583

In jedem PC ist eine Uhr für die Systemzeit eingebaut. Ein häufig verwendetes IC dafür ist die Realtime-Clock (RTC) PCF8583 mit I2C-Schnittstelle. Dieses IC verfügt nicht nur über eine RTC sondern noch über zusätzliches RAM, eine Watchdog-Funktion und einen programmierbaren Alarm. Wir nutzen hier nur die RTC-Funktion. Die eigendliche Uhr besteht aus einem Schwingkreis mit einem Quarz. Dieser schwingt sehr präzise auf etwas mehr als 32kHz. Daraus wird durch einen Frequenzteiler ein 1Hz-Signal gewonnen, dass die Uhr zur Zeitgewinnung nutzt.  Damit wird eine Genauigkeit von weniger als 1Sekunde Fehler pro Woche erreicht. Dies reicht für die meisten Anwendungen aus. Genauere RTCs verwenden einen Quarz mit mehreren Megaherz Takt.
Für die grundlegenden Funktionen gibt es eine fertige Vorlage RTC mit PCF8583.bas.

Das Programm besteht aus drei Teilen. Teil 1 dient zur Initialisierung der I2C-Schnittstelle und des LCD-Displays. Der zweite Teil stellt die Uhrzeit und das Datum. Im dritten Teil wird Uhrzeit und Datum auf dem LCD-Display ausgegeben.

Die Befehle für das LCD-Display werden hier nicht näher erläutert, weitere Infos sind hier zu finden.

Die I2C-Schnittstelle

Der Attiny2313 emuliert eine I2C-Schnittstelle softwaremäßig, daher muss dem Controller mitgeteilt werden, wie die Schnittstelleangeschlossen ist. Dazu dienen die Befehle

Config Scl = Portb.5
Config Sda = Portb.7
I2cinit


Mit I2cinit wird die Schnittstelle initialisiert, allerdings findet dann noch kein Datenausstausch statt. Dies muss nur ein mal erfolgen.

Wichtige Befehle der I2C-Schnittstelle
I2cstartStartet die Datenübertragung
I2cstopBeendet die Datenübertragung
I2cwbyteDer Attiny sendet ein Byte an den Sklaven
I2crbyteDer Attiny empfängt ein Byte vom Sklaven
ACKTeilt dem Sklaven mit, das er das nächste Byte übertragen soll
NACKTeilt dem Sklaven mit, das kein weiteres Byte übertragen werden soll

Uhrzeit stellen

Die RTC verwendet den BCD-Code um Zahlen zu speichern. Damit können zwei Zahlen in einem Byte gespeichert werden. BASCOM kann Zahlen aus dem normalen Dezimalcode in den BCD-Code umrechnen und auch die umgekehrte Operation ausführen. Dazu dienen die Befehle

Makebcd (A)  wandelt die in der Variabel A gespeicherte Zahl in den BCD-Code um
BCD (A)          wandelt die in A gespeicherte BCD-Zahl in eine normale Dezimalzahl um

= Makebcd(0)                                              'Sekunden
= Makebcd(m)                                              'Minuten
= Makebcd(h)                                              'Stunden
Tag = Makebcd(tag)                                          'Tag
Monat = Makebcd(monat)                                      'Monat

I2cstart
I2cwbyte &B10100000
I2cwbyte 0
I2cwbyte 8
I2cstop
I2cstart
I2cwbyte &B10100000
I2cwbyte 2

I2cwbyte S
I2cwbyte M
I2cwbyte H
I2cwbyte Tag
I2cwbyte Monat
I2cstop

Zuerst werden in den Variabeln H,M,S,Tag;Monat die Zeit im BCD-Format abgelegt. In unserem Fall werden alle Werte auf 0 gesetzt. Danach wird die Datenübertragung gestartet und die Schreibadresse der Uhr &B10100000 auf den Bus gelegt. Damit ist die Uhr empfangsbereit. Zuerst wird der Wert 0 und danach der Wert 8 übertragen. Dies bedeutet, daß die Uhr die Uhrzeit und das Datum empfangen kann. Die Werte 0 und 8 sind dem Datenblatt des PCF8583 entnommen. Grund für diese scheinbar etwas umständliche Vorgehensweise ist, dass das IC PCF8583 noch eine Vielzahl anderer Funktionen hat, die entweder ausgeschaltet oder eingeschaltet werden müssen, damit die Uhr für unsere Anwendung korrekt arbeitet.
Die Datenübertragung wird erst gestoppt und sofort wieder gestartet. Jetzt können die Daten übertragen werden. Dazu wird wieder die Schreibadresse auf den Bus gelegt und der Wert 2 an die Uhr gesendet. Der Wert 2 ist ebenfalls dem Datenblatt entnommen. Jetzt wird nacheinander S, M, H, Tag und Monat gesendet und die Übertragung mit I2cstop beendet. Danach läuft die Uhr automatisch los. 

Uhrzeit auslesen
Das Auslesen der Uhr ist vergleichweise einfach. Zuerst wird an die Schreibadresse der Wert 2 gesendet. Dies aktiviert das Uhrzeit. Danach wird die Leseadresse der Uhr angesprochen. Die Leseadresse ist immer um den Wert 1 größer als die Schreibadresse. Die Uhr sendet die Sekunden im BCD-Format. Mit Ack wird der Uhr mitgeteilt nun die Minuten zu senden usw. Hat die Uhr den Monat gesendet wird mit NACK die Übertragung beendet und mit I2Cstop der Bus freigegeben.

I2cstart
I2cwbyte &B10100000
I2cwbyte 2
I2cstart
I2cwbyte &B10100001
I2crbyte S , Ack
I2crbyte M , Ack
I2crbyte H , Ack
I2crbyte Tag , Ack
I2crbyte Monat , Nack
I2cstop

Lcd Bcd(s)


Mit LCD BCD(S) wird dann auf dem LCD-Display die Sekunden als normale Dezimalzahl ausgegeben.