RTC - DS1307

Das Tiny RTC Modul bzw der DS1307 ist eine Echtzeituhr die man über die I2C Schnittstelle ansprechen kann.

Da ich in der Vergangenheit einige Probleme mit dem DS1307 hatte will ich euch mal ein paar Infos die mir weiter geholfen haben zusammen schreiben.
Die meisten Problem lagen daran, dass ich beim ersten mal das Datenblatt nicht richtig gelesen hatte, oder einfach zu schnell fertig werden wollte. 🙂
Also immer das Datenblatt vollständig lesen.

tiny_rtc

Die avr gcc Bibliothek die ich geschrieben habe könnte ihr am Ende des Artikels herunter laden und steht wie die Internetseite selbst unter der angegebenen Creative Commons Lizens.

Allgemeines

Ich nutze den DS1307 da er sehr günstig zu beschaffen ist. Bei Ebay bekommt man das IC mit einer kleinen externen Beschaltung plus Quarz als Arduino Version für kleines Geld. Die Genauigkeit lässt allerdings zu wünschen übrig. Meine Erfahrungen sind bisher Abweichungen zwischen einer und zwei Sekunden pro 24 Stunden. Dabei ist zu beachten, dass dies aber nur bei konstanter Raumtemperatur gilt. Bei großen Temperaturschwankungen sind die Abweichungen leider um einiges größer.

Der größte Vorteil in meinen Augen ist die Batterie die dabei ist. So läuft die Zeit weiter, wenn der Controller aus geschaltet ist, oder die Betriebsspannung fehlt. Beim starten des µCs kann man die Uhrzeit einfach wieder auslesen und damit arbeiten. Die Batterie sollte ca 10 Jahre lang halten.

Darüber hinaus ist auf dem Modul auch noch ein 32KBit EEprom von Atmel (AT24C32) verschaltet der auch direkt an die I2C Schnittstelle mit angeschlossen ist.
Falls ihr in eurem Projekt schon ein EEprom verwendet, solltet ihr auf jeden Fall darauf achten, dass es nicht die gleiche Adresse wie das Eeprom auf dem RTC Modul hat.

Anschluss

Das IC wird einfach an die I2C Schnittstelle angeschlossen. Auf dem Tiny RTC Modul sind schon Pull-Up-Widerstände für den SDA und die SCL Leitung dabei. Ich selber löte diese aber oft aus, da ich an anderer Stelle schon die Pull-Up-Widerstände installiert habe. Die Widerstände sind R2 und R3.

Register

Im Register steht die Uhrzeit, der Wochentag und das Datum. Die einzelnen Werte können über folgende Adressen ausgelesen werden. Die Werte sind im BCD code gespeichert.

AdresseInhaltBeschreibung
0x00Sekunden und CH BitBit 0-6 für die Sekunden (0..59)
Mit Bit 8 lässt sich die Uhr ein und ausschalten.
0x01MinutenBit 0-6 für die Minuten (0..59)
0x02StundenBit 0-6 für die Stunden. 12/24h Umschaltbar
0x03WochentagBit 0-2 für den Wochentag
0-7 (0..7)
0x04TagBit 0-5 für den Tag (0..31)
0x05MonatBit 0-4 für den Monat (0..12)
0x06JahrBit 0-7 für das Jahr (0..99)
0x07EinstellungenHier kann man zB. den SQW Output einstellen (Rechtecktakt)
0x08–0x3F RAM56 x 8 Bit

Bei der Sekunde ist darauf zu achten, dass das höchstrangige Bit (CH Bit) zum ein und ausschalten gedacht ist. Wenn CH auf 1 gesetzte wird, dann zählt der DS1307 die Uhrzeit nicht mehr weiter hoch. Dies sollte bei dem Beschreiben einer neuen Uhrzeit stets auf 1 gesetzt sein. Anschließend kann man es wieder auf 0 Setzen und somit wieder einschalten.
Beim Auslesen der Sekunde sollte man dann darauf achten, dieses bit natürlich nicht zu dem Sekundenwert gehört.

Download

Über mein Gitbucket System als git Repository:
https://gitbucket.pgollor.de/avr/rtc

Die Bibliothek benötigt die I2Cmaster library von Peter Fleury.

13 Antworten auf RTC - DS1307

  1. shyd sagt:

    Hi,
    vielen Dank für die Lib, sie ist nun Teil meines Projektes! Sehr schön, dass du auch das 1Hz Signal generierst.
    Drei kleine Fehler sind mir noch aufgefallen:
    1. rtc.c, Zeile 135: es fehlt eine 0 bei dem OR, du hast dort nur 7 statt 8 Bit
    2. uint8_t rtc_init(void) liefert 1, wenn die RTC erreichbar ist, nicht 0
    3. rtc.h: Bei void rtc_setup(...) fehlen die Bezeichner

    Zu erwähnen wäre vielleicht noch, dass man 2000 zum Jahr addieren muss, damit die Uhr richtig (inkl. Schaltjahrerkennung) läuft.

    Gruß
    Dennis

    • shyd sagt:

      Ich muss noch erwähnen, dass deine Lib bei mir mit dem DS1338Z-33+ läuft.

    • Kalle sagt:

      Danke für die Info. Ich werde mir das direkt die Tage mal anschauen. Manchmal verliert man den Blick auf das "kleine" wenn man zu viel damit arbeitet. 🙂

    • Kalle sagt:

      Moin Dennis,

      ich habe mal eine aktuelle Version ins SVN hochgeladen. Dort sind die Sachen schon länger gefixt die du angemerkt hattest. Bis auf das Problem des Vertauschens von 0 und 1. Das ist leider noch so. Habe nur im Moment nicht so viel Zeit. Das sollte aber schnell änderbar sein.

      Hatte einfach vergessen, die Lib mal zu aktualisieren.

      LG
      Kalle

  2. Thomas sagt:

    Hallo,

    ich wollte meine erste Versuche mit dem RTC machen. Dazu habe ich die o.g. Dateien in mein Projekt (ATMega88) eingebunden. Beim Compilieren erhalte ich folgende Fehlermeldung:

    ../../../../Beispielprogramme/RTC/rtc/rtc/rtc.c:214: error: 'for' loop initial declaration used outside C99 mode

    In der 214. Zeile von rtc.c steht folgende For-Deklaration:

    for (int i = 0; i < 100; i++)

    Ich finde aber keinen Fehler. Kann mir bitte jemand weiterhelfen?

    Viele Grüße
    Thomas

    • Kalle sagt:

      Moin Thomas,
      die Antwort steht schon direkt in deiner Fehlermeldung. Die Deklaration von Variablen in For Schleifen wird erst ab dem c99 Standard unterstützt. Das heisst du musst deinem Compiler mit einer Option (bei gcc "-std=c99") angeben, dass du den c99 Standard nutzen möchtest.
      C99

      LG
      Kalle

    • Johann sagt:

      ...Oder Du läßt das "int" im Schleifenkopf weg und deklarierst die Zählvariable im Programm- bzw. Prozedurenkopf...:-)

  3. Thomas sagt:

    Vielen Dank!

    LG
    Thomas

  4. Jch sagt:

    Hallo,
    Ich bin Anfänger und will den RTC mit einem ATmega 16 zum laufen kriegen.
    Ich habe ein neues Projekt angelegt und die I2C und rtc files eingebunden.
    Letzte woche habe ich es irgendwie geschafft, dass ich mir den Finger an einem der beiden ICs verbrannt habe. Leider ging dieses Projekt verloren und jetzt will ich es nochmal neu machen, aber es scheitert schon am "verschachteln" der 2 verschiedenen Codes.
    Kann mir jemand mal nen Tipp geben, wie ich die Codes miteinander verknüpfen muss?

    Ich hoffe, dass ich dann das auslesen, eine Zeitschaltuhrfunktion und ans Display weiterschicken selber hinbekomme.

    Grüße

    Jch

  5. Frank sagt:

    Hallo Kalle,
    vielen Dank für die Tipps.
    Ich kann noch dazu beitragen, dass das DS1307 ohne Batterie nicht arbeitet.
    Wenn die Batterie fehlt, dann muss man Pin 3 auf GND legen, damit es klappt.
    Gruß
    Frank

  6. Boris sagt:

    Hallo Kalle

    Die links zu:
    "rtc.zip" und "https://svn.pgollor.de/avr/rtc/"

    funktionieren nicht mehr. Kannst Du diese links fixen oder mir das zip-file per email schicken?

    Gruß und Danke
    Boris

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *