Echt Zeit Uhr DS1307 (RTC)

Ich finde eine Uhr braucht man immer, also auch in jedem Mikrocontroller System. Für Datenlogger und ähnliches so wie so. Und da finde ich den DS1307 geradezu ideal. Er kostet bei Reichelt zum Beispiel 2,35 Euro (Stand 06/2007), hat eine Uhr, einen Kalender und 64Byte statischen RAM, wo von 56Byte für den Anwender frei sind (8 Byte braucht die Uhr).
Mit einem CR2032 Batterie geht das Ding mindestens 30 Jahre, was will man mehr. Angesprochen wird der DS1307 Baustein über den I2C (TWI) Bus.

Den DS1307 gibt es in einem 8 Pin Gehäuse. Dabei muss an Pin 1 und 2 noch ein miniatur Uhrenquarz mit 32,768 kHz direkt angeschlossen werden, er sorgt für die erforderliche Genauigkeit der Uhr. An Pin 3 wird eine 3 Volt Litiumbatterie angeschlossen, sie versorgt den Baustein wenn die Betriebsspannung abgeschalten ist. Dabei soll die Stromaufnahme bei Batterie Pufferbetrieb maximal 500 nA betragen. Über Pin 5 SDA und Pin 6 SCL wird der RTC mit dem Mikroprozessor verbunden.

Register des DS1307

Adresse Inhalt
00H Sekunden Bit 0..6 Sekunden im BCD Format, Bit 7 0/1 Uhr läuft/Uhr angehalten
01H Minuten Bit 0..6 Minuten im BCD Format
02H Stunden Bit 6=0/1=12/24 Stunden, Bit 0..4/5 Stunden bis 12/24, Bit 5 im 12 Stundenmodus AM/PM
03H Tag der Woche Bit 0..2 Wochentag
04H Tag Bit 0..5 Tag des Monats
05H Monat Bit 0..4 Monat des Jahres
06H Jahr Bit 0..7 Jahr (00-99)
07H Control Steuert Pin 7 des Chip’s als Ausgang für einen Rechtecktakt
08H RAM Byte 1 1. frei benutzbares Byte
~~~~~ ~~~~~~
3FH RAM Byte 56 56. frei benutzbares Byte

myAVR mit LCD und DS1307 Bascombeispiel

Download: myavr-lcd-ds1307.zip

$regfile = "m8def.dat"
$crystal = 3686411
 
' Einstellen des LCD Display's von myAVR in BASCOM
'Config Portd = Output
Config Lcdpin=Pin, Db4=Portd.4, Db5=Portd.5, Db6=Portd.6, Db7=Portd.7, E=Portd.3, Rs=Portd.2
Config Lcd = 16 * 2
 
' Einstellen der TWI (I2C) Schnittstelle in BASCOM
Config Sda = Portc.4
Config Scl = Portc.5
' Address des DS1307 $D0=schreiben $D1=lesen
Const Ds1307w = &HD0
Const Ds1307r = &HD1
 
' Einstellen der Datum-/Zeitfunktion in BASCOM dabei werden automatisch
' die Variablen _year,_month,_day,_hour,_min,_sec im BCD Format angelegt
Config Clock = User
' Datumsformat deutsch Tag.Monat.Jahr und als Trennzeichen den Punkt
Config Date = Dmy , Separator = .
 
Cls
Cursor Off
 
' Nur zum stellen der Uhr Kommentar entfernen
'Time$ = "17:30:59"
'Date$ = "24.08.07"
 
Lcd " *** myAVR ***"
 
Do
 Locate 2 , 1 : Lcd Mid(date$ , 1 , 6) ; " " ; Time$
 Waitms 1000
Loop
 
End
 
' Benutzer definierte Routinen die von der datetime.lib im BASCOM genutzt werden
Dim Weekday As Byte
Getdatetime:
  I2cstart                     ' Start
  I2cwbyte Ds1307w             ' DS1307 schreiben
  I2cwbyte 0                   ' DS1307 Adresszeiger auf 0 stellen
 
  I2cstart                     ' Start
  I2cwbyte Ds1307r             ' DS1307 lesen (ab vorher eingestellter Adresse 0)
  I2crbyte _sec , Ack          ' Sekunden
  I2crbyte _min , Ack          ' Minuten
  I2crbyte _hour , Ack         ' Stunden
  I2crbyte Weekday , Ack       ' Wochentag (in Dummy gelesen da von date$/time$ nicht genutzt)
  I2crbyte _day , Ack          ' Tag
  I2crbyte _month , Ack        ' Monat
  I2crbyte _year , Nack        ' Jahr
  I2cstop
  _sec = Makedec(_sec) : _min = Makedec(_min) : _hour = Makedec(_hour)
  _day = Makedec(_day) : _month = Makedec(_month) : _year = Makedec(_year)
Return
 
Setdate:
  _day = Makebcd(_day) : _month = Makebcd(_month) : _year = Makebcd(_year)
  I2cstart                     ' Start
  I2cwbyte Ds1307w             ' DS1307 schreiben
  I2cwbyte 4                   ' DS1307 Adresszeiger auf 4 (Byte 5) stellen
  I2cwbyte _day                ' Tag schreiben
  I2cwbyte _month              ' Monat schreiben
  I2cwbyte _year               ' Jahr schreiben
  I2cstop
Return
 
Settime:
  _sec = Makebcd(_sec) : _min = Makebcd(_min) : _hour = Makebcd(_hour)
  I2cstart                     ' Start
  I2cwbyte Ds1307w             ' DS1307 schreiben
  I2cwbyte 0                   ' DS1307 Adresszeiger auf 0 stellen
  I2cwbyte _sec                ' Sekunden schreiben
  I2cwbyte _min                ' Minuten schreiben
  I2cwbyte _hour               ' Stunden schreiben
  I2cstop
Return