Tiny-RTC-I2C Modul initialisieren und auslesen
Verfasst: Do 31. Jan 2013, 18:17
Mal wieder in China gibt es für wenige Euro einen interessanten Baustein: ein Real-Time-Clock-Modul (RTC). Der Clou: Auf der briefmarkengroßen Platine befinden sich neben dem eigentlichen Clock-IC (DS1307) mitsamt seiner äußeren Beschaltung auch noch ein EEPROM-Baustein. Damit die Uhr auch autark arbeiten kann, befindet sich auf der Rückseite ein wiederaufladbarer Litium-Ionen-Akku. Außerdem kann die Platine auch noch um einen 1-Wire-Temperatursensor erweitert werden.
Hier soll es nur um den Uhrenbaustein gehen. Seine I2C-Adresse ist 208 (write) bzw. 209 (read). Der Baustein besitzt ein RAM von 64 Bytes, von dem die Uhr selbst nur die ersten 8 benutzt; die restlichen stehen zur freien Verfügung. Bevor der Baustein eingesetzt werden kann, muss die Uhr gestellt werden. Das folgende Programm stellt die Uhr und gibt anschließend den Inhalt des RAMs über die serielle Schnittstelle aus.
In meinem Beitrag zum Ultraschallsensor SRF02 habe ich ausführlich beschrieben, wie man mit solchen I2C-Bausteinen umgeht. Deswegen möchte ich hier auf eine weitergehende Kommentierung verzichten.
Hier soll es nur um den Uhrenbaustein gehen. Seine I2C-Adresse ist 208 (write) bzw. 209 (read). Der Baustein besitzt ein RAM von 64 Bytes, von dem die Uhr selbst nur die ersten 8 benutzt; die restlichen stehen zur freien Verfügung. Bevor der Baustein eingesetzt werden kann, muss die Uhr gestellt werden. Das folgende Programm stellt die Uhr und gibt anschließend den Inhalt des RAMs über die serielle Schnittstelle aus.
Code: Alles auswählen
' Datei für Attiny-Platine von E. Eube, G. Heinrichs und U. Ihlefeldt
' Initialisieren des RTC (Zeit, Datum und HC-Bit)
' Lesen aller Register des RTC-Bausteins DS1307
' Ausgabe über Terminal
'----------------------------------------------------------------------------
$regfile = "attiny2313.dat" 'Attiny2313
$crystal = 4000000 '4 MHz
$baud = 9600
'**********************************************************
'******************* Deklarationen ************************
Declare Sub Ramlesen
Declare Sub Init
Dim I2cadr0 As Byte 'Adresse von DS1307 (write)
Dim I2cadr1 As Byte 'Adresse von DS1307 (read)
Dim Wert As Byte
Dim Gefunden As Byte
Dim Ramadr As Byte
'****************** Initialisierung ***********************
Ddrb = &B11111111 'Port B als Ausgangsport
Ddrd = &B01110000 'D4, D5, D6 als Ausgang; Rest als Eingang
Portd = &B10001111 'Eingänge auf high legen
i2cadr0 = 208 'i2cadresse im write-Modus
i2cadr1 = i2cadr0 + 1 'i2cadresse im read-Modus
Config Scl = Portb.7
Config Sda = Portb.5
'**********************************************************
'******************** Hauptprogramm ***********************
' Init nur bei der ersten Inbetriebnahme
Call Init
Wait 3
'i2cadressieren (write)
I2cstart
I2cwbyte i2cadr0
Gefunden = Not Err
If Gefunden = 1 Then
I2cwbyte 0 'Regpointer DS1307-RAM
I2cstop
Waitms 100
Call Ramlesen
End If
End
'**********************************************************
'******************* Unterprogramme ***********************
Sub Ramlesen
I2cstart
'i2cadressieren (read)
I2cwbyte i2cadr1
For Ramadr = 0 To 62
'Lesen
I2crbyte Wert , Ack 'Nach Ack wird automatisch das nächste Register ausgelesen
Printbin Wert
Next Ramadr
I2crbyte Wert , Nack
Printbin Wert
I2cstop
End Sub
Sub Init
I2cstart
I2cwbyte i2cadr0
Gefunden = Not Err
If Gefunden = 1 Then
Wert = 0
I2cwbyte Wert 'Regpointer DS1307-RAM
I2cwbyte Wert 'CH-Bit zurücksetzen; Sekunden auf 0
Wert = 4 * 16 ' 40 Minuten
Wert = Wert + 7 ' 7 Minuten dazu
I2cwbyte Wert
Wert = 2 * 16 '20 Stunden
Wert = Wert + 0 ' dazu 0 Stunden
' Wert = Wert + &B1000000 ' 12-Stunden-Modus
I2cwbyte Wert
Wert = 6 'Samstag
I2cwbyte Wert
Wert = 1 * 16 'Tag 10
Wert = Wert + 2 'dazu Tag 2
I2cwbyte Wert
Wert = 0 * 16
Wert = Wert + 1 'Monat
I2cwbyte Wert
Wert = 1 * 16 'Jahr 10
Wert = Wert + 3 'dazu Jahr 3
I2cwbyte Wert
I2cstop
End If
End Sub