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 I
2C-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 I
2C-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 I
2C-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
I2cinitMit
I2cinit wird die Schnittstelle initialisiert, allerdings findet dann
noch kein Datenausstausch statt. Dies muss nur ein mal erfolgen.
Wichtige Befehle der I2C-Schnittstelle
I2cstart | Startet die Datenübertragung |
I2cstop | Beendet die Datenübertragung |
I2cwbyte | Der Attiny sendet ein Byte an den Sklaven |
I2crbyte | Der Attiny empfängt ein Byte vom Sklaven |
ACK | Teilt dem Sklaven mit, das er das nächste Byte übertragen soll |
NACK | Teilt 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
S = Makebcd(0) 'Sekunden
M = Makebcd(m) 'Minuten
H = 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.