Realtime Clock (RTC DS1307) am Raspberry Pi betreiben

    • Offizieller Beitrag

    Auf Ebay habe ich ein günstiges (1,80€ inkl. Versand) RealTimeClock Modul gefunden.
    In diesem Tutorial möchte ich euch zeigen wie ihr dieses Modul mit dem Raspberry Pi betreibt.


    RTC Modul

    Warum eine RTC?
    Eine Echtzeituhr (realtimeclock) misst die physikalische Uhrzeit. Eine RTC hat einen Quarz der den Takt der Uhr vorgibt. Ein Chip (hier DS1307) berechnet daraus sie aktuelle Uhrzeit.
    Normalerweise wird die aktuelle Uhrzeit über das Internet via ntp synchronisiert. Wenn jedoch kein Netzwerk zur Verfügung steht und man eine aktuelle Uhrzeit benötigt greift man zu einer RTC.
    Dieses Modul hat eine 3,6V Lithium Ion Batterie verbaut. Dadurch läuft dieses Modul, und somit auch die Uhrzeit, weiter wenn der Raspberry Pi ausgeschaltet ist.

    Was wird benötigt?

    Kommen wir nun zu der Anleitung:

    Schritt 1: Widerstände des RTC Moduls entlöten und anschließen.
    Damit das Modul mit dem Raspberry Pi funktioniert müssen zwei PullUp Widerstände (R2 und R3) entfernt werden.
    Diese entlöten wir mit Hilfe des Lötkolbens. Zusätzlich kann man noch eine Stiftleiste verlöten, damit man das Modul zum Beispiel auf einem Steckbrett/Breadboard nutzten kann.
    Wichtig! Die Widerstände müssen entlötet werden, da die 5V den Raspberry Pi schwer beschädigen könnten.

    angepasstest Modul (R2 und R3 ausgelötet sowie Stiftleiste hinzugefügt)

    Nun könnt ihr das Modul an den ausgeschalteten Raspberry Pi anschließen.

    Code
    #--------------------#
    | RPI GPIO  | RTC P1 |
    |-----------|--------|
    |Pin 2 5V   |   VCC  |
    |Pin 3 SDA  |   SDA  |
    |Pin 5 SCL  |   SCL  |
    |Pin 6 GND  |   GND  |
    #--------------------#



    Verkabelung

    Schritt 2: Software konfigurieren.
    Unter Umständen kann es nötig sein "Expand filesystem" auszuführen!

    Den Raspberry Pi nach Überprüfung der Verkabelung starten.
    Als erstes aktualisieren wir das System mit folgenden Befehlen:

    Code
    sudo apt-get update
    sudo apt-get upgrade

    WICHTIG: Als nächstes installieren wir das Paket "i2c-tools" und holen wir uns sudo Rechte für die nächsten Schritte:

    Code
    sudo apt-get install i2c-tools
    sudo bash
    cd


    Nun aktivieren wir I²C

    Code
    nano /etc/modprobe.d/raspi-blacklist.conf


    nun kommentieren wir "spi-bcm2708" und "i2c-bcm2708" aus. So sollte eure Datei nun aussehen:

    Code
    # blacklist spi and i2c by default (many users don't need them)
    
    
    #blacklist spi-bcm2708
    #blacklist i2c-bcm2708

    Als nächstes legen wir fest, welche Module beim starten automatisch geladen werden sollen.

    Code
    nano /etc/modules


    Dort tragen wir folgende Module ein:

    Code
    snd-bcm2835
    spi-bcm2708
    i2c-bcm2708
    i2c-dev
    rtc-ds1307

    Schritt 3: Testen
    Wir laden folgende Module:

    Code
    modprobe i2c_bcm2708
    modprobe i2c_dev
    modprobe rtc-ds1307

    Jetzt schauen wir ob die RTC am i2c Bus angezeigt wird.
    dazu geben wir folgenden Befehl ein:

    Code
    i2cdetect -y 1


    Für die Rev 1 gebt ihr "i2cdetect -y 0" ein.
    Ihr solltet folgendes sehen:

    Code
    root@raspberrypi:~# i2cdetect -y 0
         0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
    00:          -- -- -- -- -- -- -- -- -- -- -- -- --
    10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
    20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
    30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
    40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
    50: 50 -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
    60: -- -- -- -- -- -- -- -- 68 -- -- -- -- -- -- --
    70: -- -- -- -- -- -- -- --


    Die Uhr wurde als unter der Adresse 68 gefunden. Unter der Adresse 50 verbirgt sich ein nichtflüchtiger Speicher, der ebenfalls auf dem Modul verbaut ist. Dieser interessiert uns aber nicht weiter.

    Nun testen wir die Verbindung zur Uhr:
    Wenn das klappt sollte er euch die Sekunden, Minuten und Stunden wie folgt anzeigen

    Code
    root@raspberrypi:~# i2cget -y 1 0x68 0
    0x38
    root@raspberrypi:~# i2cget -y 1 0x68 1
    0x16
    root@raspberrypi:~# i2cget -y 1 0x68 2
    0x16

    Schritt 4: Uhr in das System einbinden und mit hwclock testen

    Code
    echo ds1307 0x68 > /sys/class/i2c-adapter/i2c-1/new_device
    • echo ds1307 0x68 > /sys/class/i2c-adapter/i2c-0/new_device für Rev 1


    Mit dem Befehl "hwclock -r" können wir nun die Zeit der RTC auslesen.

    Code
    root@raspberrypi:~# hwclock -r
    Tue 03 Sep 2013 16:23:17 UTC  -0.781864 seconds

    Falls die Uhrzeit nicht korrekt ist, könnt ihr mit dem Befehl "date" die Systemzeit anzeigen lassen und bei Bedarf mit "hwclock -w" die RTC Zeit auf die System zeit setzten. Mit "hwclock -r" könnt ihr es überprüfen.
    Am besten studiert ihr die manpage zu hwclock.

    Schritt 5: RTC Uhrzeit dauerhaft einbinden

    Code
    nano /etc/rc.local

    Ihr fügt vor exit 0 folgendes ein:

    Code
    echo ds1307 0x68 > /sys/class/i2c-adapter/i2c-1/new_device
    sudo hwclock -s
    • hwclock -s setzt die RTC Zeit als Systemzeit
    • echo ds1307 0x68 > /sys/class/i2c-adapter/i2c-0/new_device für Rev 1

    Nach einem Neustart "reboot" testet ihr die Uhr mit "sudo hwclock -r"

    Ab sofort sollte eure Systemzeit immer aktuell sein. Natürlich rate ich euch die korrekte Zeitzone einzustellen. Im Moment ist diese noch auf "UTC" eingestellt. über "sudo raspi-config" könnt ihr diese auf die korrekte Zeitzone einstellen.

    Well in my humble opinion, of course without offending anyone who thinks differently from my point of view, but also by looking into this matter in a different way and without fighting and by trying to make it clear and by considering each and every one's opinion, I honestly believe that I completely forgot what I was going to say.

    Einmal editiert, zuletzt von ps915 (30. April 2014 um 16:51)

  • Realtime Clock (RTC DS1307) am Raspberry Pi betreiben? Schau mal ob du hier fündig wirst!

    • Offizieller Beitrag

    Mir ist aufgefallen, dass folgender Befehl auf dem neusten Image (2013-12-20-wheezy-raspbian.img) nicht mehr funktioniert.


    Code
    root@raspberrypi:~# echo ds1307 0x68 > /sys/class/i2c-adapter/i2c-1/new_device
    bash: echo: Schreibfehler: Das Argument ist ungültig.


    oder

    Code
    root@raspberrypi:~# echo ds1307 0x68 > /sys/class/i2c-adapter/i2c-1/new_device
    bash: echo: write error: Invalid argument


    Hier ist das Problem ebenfalls aufgefallen, jedoch wurde noch keine Lösung gefunden.
    http://www.raspberrypi.org/phpBB3/viewtopic.php?f=44&t=25399
    und hier
    http://www.amescon.com/phpbb/viewtopic.php?f=2&t=577

    Hat jemand die selben Schwierigkeiten mit der RTC ds1307 und dem neustem Image?


    Gruß,
    ps915

    Edit: Auf dem Image 2013-09-25-wheezy-raspbian funktioniert der Befehl.

    Well in my humble opinion, of course without offending anyone who thinks differently from my point of view, but also by looking into this matter in a different way and without fighting and by trying to make it clear and by considering each and every one's opinion, I honestly believe that I completely forgot what I was going to say.

    Einmal editiert, zuletzt von ps915 (30. Dezember 2013 um 18:53)

  • Danke für das Tut! Ich bin da grade dran!

    Habe selbes "Problem"...

    beim ersten Mal ging der Behehl noch:

    [font="Monaco, Consolas, Courier, monospace"]echo ds1307 0x68 > /sys/class/i2c-adapter/i2c-1/new_device[/font]



    Es scheint aber eingetragen zu sein und zu funktionieren.

    Nach dem Reoot zeigt [font="Tahoma, Verdana, Arial, sans-serif"]sudo "hwclock -r" die richtige Zeit an.[/font]

    [font="Tahoma, Verdana, Arial, sans-serif"]Danke nochmals für das Tutorial![/font]

    [font="Tahoma, Verdana, Arial, sans-serif"]David[/font]

  • Hi,
    ich habe das ganze heute mal ausprobiert, leider erhalte ich folgende Fehlermeldung bei der Eingabe von hwclock -r:

    hwclock: Cannot access the Hardware Clock via any known method.
    hwclock: Use the --debug option to see the details of our search for an access method.


    Bei dem Befehl
    i2cget -y 1 0x68 0
    kommt:
    Error: Read failed

    Ich benutze das aktuelle Image. Bei i2cdetect wird mir die 68 ausgegeben. Kann das daran liegen dass ich die Uhr ohne Batterie betreibe?

    mfg
    balli

    Einmal editiert, zuletzt von ballibum (16. März 2014 um 19:30)


  • Da ich schon immer mal eine RTC am RasPi anschließen wollte, bietet sich dieses Tutorial gut an. Ich habe aber bereits eine andere Anwendung auf Pin5 (SCL) liegen: https://www.forum-raspberrypi.de/Thread-tutoria…incl-status-led

    Würden die beiden sich vertragen, obwohl sie auf dem selben Pin liegen? Oder sollte man das besser lassen?

    interessante Frage, betrifft alle I2C Anwendungen

    ich habe ja "hoch-und-runterfahren-mittels-taster" noch nicht und bin jetzt unsicher ob das zusammen geht, müsste ausprobiert werden.

    SCL ist ja der I2C Clock vom PI, kommt der immer da raus oder wird der erst mit I2C Aktivierung eingeschaltet ?

    Normalerweise ist das für einen Compi kein Problem den low Zustand Taster gedrückt zu erkennen, nur wenn der Port als Ausgang geschaltet ist was SCL ja tut -> Clock Ausgang zur Steuerung der I2C Slaves, dann wird ja ein Ausgang zwangsweise auf GND gelegt, das kann die Ports überlasten wenn die high 3,3V ausgeben wollen aber das jemand kurzschliesst. Irgendwo hat es auch geheissen kurz nach GND legen. Wer bestimmt was kurz ist, wer sorgt dafür das nicht lange GND geschaltet ist ? Was ist wenn der Taster klemmt oder hängt ? brennt dann der Port ab ?

    lasst die PIs & ESPs am Leben !
    Energiesparen:
    Das Gehirn kann in Standby gehen. Abschalten spart aber noch mehr Energie, was immer mehr nutzen. Dieter Nuhr
    (ich kann leider nicht schneller fahren, vor mir fährt ein GTi)

  • so nachgebaut

    RTC läuft, nur das mit dem shutdown script muss noch getestet werden und andere I2C am PI

    mache gelegentlich mal einen eigen Bauvorschlag dazu, momentan belegt ja die Uhr den ganzen I2C und so kann ich I2C nicht stacken, stapeln obwohl ich schon I2C Module besitze, Tastatur, LCD, andere RTC

    und das hier noch:

    expand filesystem vor dem Installieren ist wichtig und die Uhr mit sudo befragen

    Code
    pi@bastelPI ~ $ hwclock -r
    hwclock: Cannot access the Hardware Clock via any known method.
    hwclock: Use the --debug option to see the details of our search for an access method.
    pi@bastelPI ~ $ sudo hwclock -r
    Wed 30 Apr 2014 16:42:54 CEST  -0.303518 seconds
    pi@bastelPI ~ $

    lasst die PIs & ESPs am Leben !
    Energiesparen:
    Das Gehirn kann in Standby gehen. Abschalten spart aber noch mehr Energie, was immer mehr nutzen. Dieter Nuhr
    (ich kann leider nicht schneller fahren, vor mir fährt ein GTi)

    Einmal editiert, zuletzt von jar (30. April 2014 um 16:47)


  • Unter der Adresse 50 verbirgt sich ein nichtflüchtiger Speicher, der ebenfalls auf dem Modul verbaut ist. Dieser interessiert uns aber nicht weiter.

    kann man den auch einbinden ?

    http://www.gallot.be/?p=180

    so bin weiter mit dem eeprom
    aus
    http://www.gallot.be/?p=180

    aber die neue Bedienung weicht ab

    irgendwie klappt Lesen & Schreiben noch nicht

    lasst die PIs & ESPs am Leben !
    Energiesparen:
    Das Gehirn kann in Standby gehen. Abschalten spart aber noch mehr Energie, was immer mehr nutzen. Dieter Nuhr
    (ich kann leider nicht schneller fahren, vor mir fährt ein GTi)

    Einmal editiert, zuletzt von jar (1. Mai 2014 um 00:10)

  • das eeprom liegt auf /dev/i2c-1


    nur Lesen

    pi@bastelPI ~ $ sudo ./eeprom -d /dev/i2c-1 -a 0x50 -p 4 -f ./data

    und Schreiben klappt noch nicht so

    pi@bastelPI ~ $ sudo ./eeprom -d /dev/i2c-1 -a 0x50 -p 4 -w -y -f ./_data_

    lasst die PIs & ESPs am Leben !
    Energiesparen:
    Das Gehirn kann in Standby gehen. Abschalten spart aber noch mehr Energie, was immer mehr nutzen. Dieter Nuhr
    (ich kann leider nicht schneller fahren, vor mir fährt ein GTi)

    Einmal editiert, zuletzt von jar (1. Mai 2014 um 00:53)

  • so nun müssen die echten C-Progger ran

    ich denke hier liegt der Fehler:

    bestückt ist ja ein 24C32 und kein 24C16

    das Atmel Datenblatt sagt:

    Memory Organization
    AT24C32/64, 32K/64K SERIAL EEPROM:
    The 32K/64K is internally organized as 256
    pages of 32 bytes each. Random word addressing requires a 12/13 bit data word
    address.

    also müsste der Code geändert werden zu

    Zeile 50 ist auch doof, wieso ist da eine 256 Byte Konstante drin, ich würde das zu PAGESIZE interpretieren die ja nicht immer 256 Byte sind

    ich habe schon einzelne Bytes gespeichert und rücklesen können aber es läuft noch nicht rund

    aus

    Code
    www.forum-raspberrypi.de
    www.forum-raspberrypi.de
    www.forum-raspberrypi.de
    www.forum-raspberrypi.de
    www.forum-raspberrypi.de
    www.forum-raspberrypi.de
    www.forum-raspberrypi.de
    www.forum-raspberrypi.de
    www.forum-raspberrypi.de

    wird nach zurücklesen

    Code
    ÿww.forum-ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿraspberrypi.de
    www.forÿww.forum-ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿraspberrypi.de
    www.for

    lasst die PIs & ESPs am Leben !
    Energiesparen:
    Das Gehirn kann in Standby gehen. Abschalten spart aber noch mehr Energie, was immer mehr nutzen. Dieter Nuhr
    (ich kann leider nicht schneller fahren, vor mir fährt ein GTi)

    Einmal editiert, zuletzt von jar (1. Mai 2014 um 02:58)

  • bin ein Stück weitergekommen

    ich schreibe

    Code
    huhu jar

    und lese zurück

    Code
    ruhu jar



    so noch ein Versuch

    bin ein Stück weitergekommen

    ich schreibe

    Code
    ...huhu jar

    und lese zurück

    Code
    ÿ..huhu jar

    es sieht so aus als wenn ich ein Nullbyte vorschicken muss zur Synchronisierung und beim Lesen das wieder verwerfen muss

    quelltext



    komisch diesmal mit Zeilenende wurde sogar das Füllbyte richtig gelesen

    oben geschrieben unten gelesen mit ghex

    was mich wundert, gibt es bei Linux kein EOF ?

    Bilder

    lasst die PIs & ESPs am Leben !
    Energiesparen:
    Das Gehirn kann in Standby gehen. Abschalten spart aber noch mehr Energie, was immer mehr nutzen. Dieter Nuhr
    (ich kann leider nicht schneller fahren, vor mir fährt ein GTi)

    Einmal editiert, zuletzt von jar (1. Mai 2014 um 14:05)

  • Hallo Jar,

    bei Linux gibt es meines Wissens kein EOF-Zeichen wie in der Windows-Welt - zumindest habe ich noch keines in Dateien geschrieben oder ausgelesen / ausgewertet.

    Wenn eine Datei "ausgelesen wurde", dann scheitert der nächste Versuch, eine Zeile bzw. eine definierte Datenmenge zu laden. Im letzteren Fall ist die eingelesene Datenmenge kleiner als die angeforderte Datenmenge. Dies veranlasst den Programmierer, das Einlesen abzuschließen (Datei schließen) und mit dem Programm weiterzumachen.


    Beste Grüße

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

  • und wieder ein Stück weiter

    ich muss den code umschreiben das eeprom write selber je nach Datenmenge auf die pages selektiert

    :)

    irgendwann kann ich das ganze EEPROM 4kByte beschreiben und auslesen

    das EEPROM kann immerhin
    High Reliability
    – Endurance: 1 Million Write Cycles
    – Data Retention: 100 Years

    lasst die PIs & ESPs am Leben !
    Energiesparen:
    Das Gehirn kann in Standby gehen. Abschalten spart aber noch mehr Energie, was immer mehr nutzen. Dieter Nuhr
    (ich kann leider nicht schneller fahren, vor mir fährt ein GTi)

  • Hallo Jar,

    siehe PN.

    Gutes Gelingen und beste Grüße!

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.


  • ...Gutes Gelingen und beste Grüße!

    danke , ich blicke immer mehr durch und werden den Code schon umkoten :lol:

    soll das eeprom2.c doch ausrechnen auf welche Pages die Adressen im Eeprom liegen

    lasst die PIs & ESPs am Leben !
    Energiesparen:
    Das Gehirn kann in Standby gehen. Abschalten spart aber noch mehr Energie, was immer mehr nutzen. Dieter Nuhr
    (ich kann leider nicht schneller fahren, vor mir fährt ein GTi)


  • -> hier <- war mal eine Geschichte mit EEPROMS von mir ...
    Vielleicht hilft das weiter ...

    wow....das ist mir zu hoch, ich grübel gerade ob ich selber weitermache am eigenen Code oder ob ich Zeit damit verbringen soll deinen Code nicht zu verstehen :lol:

    lasst die PIs & ESPs am Leben !
    Energiesparen:
    Das Gehirn kann in Standby gehen. Abschalten spart aber noch mehr Energie, was immer mehr nutzen. Dieter Nuhr
    (ich kann leider nicht schneller fahren, vor mir fährt ein GTi)

  • Hi jar,

    evtl. reicht Dir das snippet hier:

    Spoiler anzeigen


    static int i2c_write( struct i2c_data_t *i2c_p )
    {
    int rc = E_I2C_SUCCESS;
    unsigned char databuf[256];

    I2C_TRACE_IN

    i2c_p->buf = databuf;
    i2c_p->len = 8; // max 32
    i2c_p->offset = 0;

    rc = i2c_smbus_write_i2c_block_data(i2c_p->i2c_devfd, i2c_p->offset,
    i2c_p->len, i2c_p->buf);

    if( rc >= 0 )
    {
    i2c_p->len = rc;
    rc = E_I2C_SUCCESS;
    }
    else
    {
    rc = E_I2C_FAILED;
    }

    I2C_TRACE_OUT(rc)

    return(rc);
    }

    Die Daten müssen blockweise gelesen werden.
    Wenn ich mich nicht irre steht die Blockgrösse im Datasheet des EEPROMS.

    cu,
    -ds-


  • Die Daten müssen blockweise gelesen werden.

    danke danke soweit war ich schon:
    Realtime Clock (RTC DS1307) am Raspberry Pi betreiben

    ich meinte eher (ich progge schon 35 Jahre -> 25 Jahre C)

    var1->var2 das habe ich in 25 Jahre C nicht in den Kopf bekommen können :lol:

    aber egal ich gucke mal weiter

    ggffs. binde ich in eeprom.c eigene i2c.c ein dann weiss ich wenigstens was da passiert

    mit Stream zu device i2c öffnen ist mir das zu undurchsichtig.

    lasst die PIs & ESPs am Leben !
    Energiesparen:
    Das Gehirn kann in Standby gehen. Abschalten spart aber noch mehr Energie, was immer mehr nutzen. Dieter Nuhr
    (ich kann leider nicht schneller fahren, vor mir fährt ein GTi)

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!