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 |