RTC DS3231 Probleme

  • Hi zusammen,


    ich habe seltsame Probleme mit einer RTC DS3231 an dem Raspberry PI 4.


    Ich habe alles entsprechend der Anleitung von Set RTC Time | Adding a Real Time Clock to Raspberry Pi | Adafruit Learning System eingestellt (auch wenn es hier eine Differenz in der /lib/udev/hwclock-set zwischen meinem Pi und der Anleitung gibt, aber ich glaube das ist hier (vorerst) nicht von Relevanz.


    Die RTC wird mittels i2cdetect -y 1 unter der Adresse 0x68 gefunden, also dort steht UU, was ja schon mal gut ist.


    Das Problem tritt beim Setzen der Uhrzeit in der RTC bzw. beim Auslesen auf.


    Ich setze die RTC Zeit mithilfe von


    Code
    sudo hwclock -w

    Der Befehl scheint fehlerfrei zu funktionieren.

    Direkt danach versuche ich zu prüfen, was die RTC nun für eine Zeit hat. Dazu nutze ich


    Code
    sudo hwclock -r

    Als Ergebnis erhalte ich dann wie erwartet die aktuelle Zeit. Soweit so gut.


    Versuche ich es dann aber direkt danach noch mal, kommt es mit selbem Befehl zu folgender Ausgabe:

    "hwclock: ioctl(RTC_RD_TIME) to /dev/rtc0 to read the time failed: Die Wartezeit für die Verbindung ist abgelaufen.


    Versuche ich es dann ein weiteres Mal, erhalte ich wieder eine Zeit, aber nicht die korrekte, sondern die aktuelle Zeit minus 9 Stunden.

    Ich vermute es hängt mit dem Fehler zusammen, den ich zuvor bekommen habe.


    Folgend ein Auszug aus der Konsole:


    Habt ihr ein solches Verhalten schonmal gesehen oder eine Idee, woran das liegen könnte?


    Ich freue mich auf Eure Ratschläge!


    Danke & Grüße

    patr1q

  • Habe gerade nochmal das Pi neugestartet.

    Das Verhalten tritt auch ohne diesen Fehler auf.


    Also sudo hwclock -w

    -> Setzt die richtige Zeit


    dann sudo hwclock -r

    -> Zeigt die richtige Zeit


    nochmal suddo hwclock -r

    -> Zeigt wieder eine Zeit um die 02:00~ Uhr an


    Also das Verhalten gibt es auch ohne einen Fehler dazwischen. Sehr seltsam.

  • Das hat vermutlich etwas mit der drift-Berechnung zu tun. Siehe < man hwclock >

    Schalte die Verwendung von /etc/adjtime einmal weg, beachte aber den gesamten Hinweis zu --noadjfile.


    Servus !

    RTFM = Read The Factory Manual, oder so

  • Das hat vermutlich etwas mit der drift-Berechnung zu tun. Siehe < man hwclock >

    Schalte die Verwendung von /etc/adjtime einmal weg, beachte aber den gesamten Hinweis zu --noadjfile.

    Hi, danke für den Tipp, allerdings hat er nicht geholfen.


    Habe es mit


    sudo hwclock --noadjfile --localtime


    versucht. Anschließend konnte ich weiterhin dasselbe Problem-Verhalten feststellen, wie bereits zuvor.

    Auch habe ich es mit


    sudo hwclock -w --noadjfile --localtime


    aber auch das ändert nichts an dem Problem.

    Was ich jedenfalls seltsam finde, ist dass die Uhrzeit, zu der immer in der RTC korrigiert wird immer nur 02:xx Uhr ist. Nach 02:59 geht es wieder mit 02:00 Uhr los.


    Noch eine andere Idee?

  • hwclock --test ?

    Geh einmal 2 Schritte zurück:

    RTC richtig angeschlossen

    Batterie funktioniert/Sicherungslasche entfernt, wenn vorhanden

    Batterie, oder Akku im RTC

    richtiges dtoverlay installiert

    fake-hwclock disabled /masked

    kein overlay-Filesystem aktiviert

    Neustart nach "halt" (statt reboot)


    Servus !

    RTFM = Read The Factory Manual, oder so

  • hwclock --test ?

    Da kam folgendes:


    Quote

    RTC richtig angeschlossen

    Ich gehe davon aus.


    Quote

    Batterie funktioniert/Sicherungslasche entfernt, wenn vorhanden

    Ja, schon zweite Batterie getestet, kommt dasselbe bei raus.


    Quote

    richtiges dtoverlay installiert

    Ja ich habe folgendes:

    Code
    dtparam=i2c_arm=on
    dtoverlay=i2c-rtc,ds3231


    Quote

    fake-hwclock disabled /masked

    Ja habe ich entsprechend der Anleitung (siehe #1) removed u. disabled.


    Quote

    kein overlay-Filesystem aktiviert

    Was genau ist damit gemeint? Ich kann damit nichts anfangen. Ich habe zumindest wissentlich nichts getan.


    Quote

    Neustart nach "halt" (statt reboot)

    Hat auch leider nichts gebracht :(

  • Code
    ioctL(4, RTC _UIE_ON, D): Das Argument. ist ungültig


    Ja habe ich entsprechend der Anleitung (siehe #1) removed u. disabled.

    Den Fehler hast Du Dir vermutlich durch die Anleitung (udev ?) selbst eingebaut. Wenn eine Anleitung kein Datum trägt, dann kann man wenigstens aus den Kommentaren(Datum) auf das Alter der Anleitung rückschliessen. In dem Fall stehts sogar ausdrücköich dabei: This guide was first published on Aug 31, 2012. It was last updated on Aug 31, 2012.


    Rd. 10 Jahre später brauchst Du weder etwas installieren, noch Pakete löschen, oder udev Regeln ändern.
    fake-hwclock.service und hwclock.service sind im Regelfall vorinstalliert, sollen aber nicht gleichzeitig benutzt werden. Deshalb ist bei enabletem fake-hwclock.service hwclock.service nicht nur disabled, sondern auch noch maskiert (=geblockt).

    sudo -i

    systemctl stop fake-hwclock.service

    systemctl disable fake-hwclock.service

    systemctl mask fake-hwclock.service

    systemctl unmask hwclock.service

    systemctl enable hwclock.service

    systemctl start hwclock.service

    exit

    exit

    macht das, was in < man systemctl > beschrieben ist.


    Servus !

    RTFM = Read The Factory Manual, oder so

  • ok. enable hwclock.service funktioniert nicht, habe möglicherweise was kaputt gemacht.

    Wer weiß, was ich jetzt schon mit diesen ganzen Anleitungen, die ich versucht habe, kaputt gemacht habe.

    Ich werde ein Image aufspielen vom Stand bevor ich mit der RTC rumgerätselt habe und es dann erneut versuchen.


    Update: Habe das Image bereits aufgespielt und direkt damit begonnen fake-hwclock.service zu stoppen, disablen und zu maskieren. Anschließend wollte ich hwclock.service unmasken, enablen und starten. unmask funktioniert ohne Fehler. enable wirft folgenden Fehler: Failed to enable unit: Unit file /lib/systemd/system/hwclock.service is masked. Habe es auf mehreren PI's getestet - verhält sich überall gleich.


    RTFM könntest du eine gängige und aktuelle Anleitung empfehlen?

    Ich habe eigentlich die Anleitung von irgendeinem Thread dieses Forums vom Jahr 2022 genommen, dachte daher die wäre aktuell, aber da war ich möglicherweise zu voreilig.


    LG

    Edited once, last by patr1q ().

  • ok. enable hwclock.service funktioniert nicht,

    Linux ist so höflich und sagt auch gleich dazu, warum Deine Eingabe fehlschlug.


    Wenn Du nunmehr eine Anleitung aus diesem Forum verwendet haben willst, dann wurde dort aber sicher diskutiert, dass das RTC Modul an die 3,3 V Stromversorgung des Pi anzuschliessen ist, und nicht an 5 V "arduino-like"


    Ich bin selbst nur (Linux)Anwender und kein Entwickler, oder Tutor und pflege keine Sammlung von Tutorials. Ich komme mit den mitinstallierten man Pages ganz gut zurecht.


    Die "Anleitung" für das RTC lautet:


    1. Gerätetreiber über dtoverlay einrichten [laut /boot/overlays/README]

    2. hwclock.service aktivieren und fake-hwclock.service deaktivieren. [laut man pages und/oder Linux Grundkurs]


    Servus !

    RTFM = Read The Factory Manual, oder so

  • Linux ist so höflich und sagt auch gleich dazu, warum Deine Eingabe fehlschlug.

    Ja, Linux sagt mir nach sudo systemctl enable hwclock.service, dass ich hwclock nicht aktivieren kann, da hwclock.service masked ist, was ich doch aber im unmittelbar zuvor ausgeführten Kommando sudo systemctl unmask hwclock.service zu ändern versuchte - was auch keinen Fehler oder irgendeinen Output anzeigte.


    Wenn Du nunmehr eine Anleitung aus diesem Forum verwendet haben willst, dann wurde dort aber sicher diskutiert, dass das RTC Modul an die 3,3 V Stromversorgung des Pi anzuschliessen ist, und nicht an 5 V "arduino-like"

    Danke für den Hinweis, aber das ist bei mir bereits an 3,3V verkabelt.

  • Hallo Patr1q,


    Quote

    Ja, Linux sagt mir nach sudo systemctl enable hwclock.service, dass ich hwclock nicht aktivieren kann, da hwclock.service masked ist, was ich doch aber im unmittelbar zuvor ausgeführten Kommando sudo systemctl unmask hwclock.service zu ändern versuchte - was auch keinen Fehler oder irgendeinen Output anzeigte.

    das wird wohl nicht gehen weil:


    Code
    # ls -l /usr/lib/systemd/system/hwclock.service
    lrwxrwxrwx 1 root root 9 27. Mär 07:42 /usr/lib/systemd/system/hwclock.service -> /dev/null

    Das ist ja nur eine Dummy-Service-Unit, was das soll, kann ich dir leider nicht sagen. (Hab so ein System hier nicht in Benutzung, ist jetzt nur aus dem Bullseye-Image ausgelesen)


    Deine Anleitung ist aber wohl relativ aktuell, die PDF-Version (links oben auf "Download PDF" klicken) sagt: Last updated on 2021-11-15 05:51:19 PM EST


    Zu dem ioctl - Fehler sagt die Anleitung ja :

    Quote

    hwclock: ioctl(RTC_RD_TIME) to /dev/rtc0 to read the time failed: Invalid argument

    If you are getting an error message like this when trying to read/write to the RTC, make sure you have a good coin cell battery installed.

    Vielleicht hast du ja nur eine Packung mit total überlagerten Knopfzellen gekauft und die sind alle nicht mehr gut. Hast du eine Möglichkeit mal zu messen?


    Sonst kann ich im Moment auch nicht weiterhelfen, aber vielleicht kommst du ja damit ein Stückchen voran.


    Gruß Martin

  • Hi zusammen,


    danke euch für Eure Ratschläge und Beiträge.

    Ich konnte das Problem identifizieren und habe eine Lösung gefunden.


    Bye.









    :P


    Kleiner Scherz. Ich lass euch natürlich auch wissen woran es lag.

    Ich hatte die RTC nicht allein am I2C Bus angeschlossen, sondern noch einen Sensor.

    Man kann ja in der Theorie mehrere Geräte an den I2C Pins anschließen, allerdings lag hier vermutlich irgendwo auf meiner Seite der Fehler.

    (Dazu gab es von mir auch schon einen anderen Thread hier, falls jemand sich für den Background interessiert)


    Nachdem ich keine Lösung für das komische Verhalten der RTC gefunden hatte, dachte ich ich versuche mal den Sensor wegzulassen.

    Und siehe da: es funktionierte direkt. Die Uhrzeit, die ich in die RTC gespeichert habe, blieb zuverlässig erhalten, ohne diese seltsamen Zeit-Änderungen.


    Da ich in dem Projekt aber nicht auf den Sensor verzichten kann, habe ich mir nochmal meinen anderen Thread angeschaut und den Ansatz, den RTFM vorgeschlagen hat, nämlich mit der RTC auf andere Pins auszuweichen, ausprobiert.


    Also dtoverlay=i2c-rtc-gpio,ds3231,i2c_gpio_sda=10,i2c_gpio_scl=9

    Damit konnte ich für die RTC die anderen Pins verwenden und die normalen Pins für den Sensor verwenden.


    Ich habe zwar nicht herausgefunden, was genau an dieser "Reihenschaltung" des Sensors und der RTC falsch war, aber wenn ich jetzt beide Geräte unabhängig voneinander mit unterschiedlichen Pins betreiben kann, ist es umso besser.


    Aber unter'm Strich ist heutzutage tatsächlich nicht mehr viel nötig, um die RTC regulär in Betrieb zu nehmen, wie auch RTFM bereits sagte.

    - Man muss nur das dtoverlay entsprechend konfigurieren (dtoverlay=i2c-rtc,ds3231)

    - und den fake-hwclock.service deinstallieren / entfernen / maskieren.

    - den hwclock.service wieder zu aktivieren ist wohl nicht nötig.


    Einmal die RTC mit sudo hwclock -w mit der (vorher richtig eingestellten) Systemzeit beschreiben und das wars.

    Das System behält nun auch ohne Internetverbindung die Uhrzeit nach Neustarts korrekt bei.