Seite 1 von 1

Tiny-RTC-I2C Modul initialisieren und auslesen

Verfasst: Do 31. Jan 2013, 18:17
von Heinrichs
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.

rtc2.jpg
Tiny-RTC-Modul
rtc2.jpg (32.65 KiB) 12237 mal betrachtet

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

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.