Wie installiere ich Real Time Clock (RTC) auf Raspbian?

9

Ich habe:

  • Raspberry Pi mit 2015-05-05-raspbian-wheezy
  • ds1307 angeschlossen (es ist eine Adafruit-Platine, Pullup-Widerstände nicht installiert).

Wie mache ich:

  • Treiber konfigurieren
  • Stellen Sie sicher, dass der Pi beim Start tatsächlich die RTC-Zeit verwendet.

Ich habe den ersten Teil gemacht, soweit ich das beurteilen kann, aber mit dem zweiten kein Glück. Viele der dortigen Informationen, einschließlich der Adafruit-Anweisungen, sind aus diesem Grund veraltet: https://www.raspberrypi.org/forums/viewtopic.php?t=97314

Also, erster Schritt: Sie aktivieren das I2c und die Treiber in raspi-config, fügen dtoverlay=i2c-rtc,ds1307sie am Ende von /boot/config.txt hinzu, und Sie haben Treiber und hwclockarbeiten anscheinend jetzt für mich (i2cdetect kann nicht mehr ausgeführt werden) dazu später).

Sie müssen jetzt fake-hwclock entfernen und so einrichten, dass der RTC beim Start tatsächlich gelesen wird. Ich habe versucht, diesen Rat zu befolgen - der weitgehend mit anderen Dingen übereinstimmt, die ich gesehen habe und der sehr neu ist - https://www.raspberrypi.org/forums/viewtopic.php?p=842661#p842661

(das ist für eine andere RTC, aber ich folge nur dem zweiten Teil über das Entfernen von Fake-Hwclock und so weiter).

Aber kein Glück, und die 'zu kommentierenden Zeilen' existieren auf meinem Pi nicht. Mein Pi kommt mit 1. Januar 1970 00:00 und hwclock -rsagt, dass die RTC beschädigt ist. Auch wenn ich mich seit dem Einstellen der RTC und dem Neustart des Pi nicht ausgeschaltet habe, scheint es, dass es durch den Start beschädigt wurde.

Ich konnte i2cdetect auch überhaupt nicht ausführen. Es beschwert sich, dass die Geräte / dev / i2c (etwas) nicht existieren - und tatsächlich nicht ...


Zwischenupdate

OK, ich habe festgestellt, dass:

  • Die Beschädigung bezieht sich nur auf die Uhrzeit- / Datumsinformationen. Wenn ich i2cset verwende, um das NVRAM mit einem Muster zu füllen, werden diese Informationen beim Neustart nicht geändert, aber das Jahr geht auf 0x66
  • Wenn ich das ,ds1307aus der Zeile dtoverlay=i2c-rtc,ds1307in config.txt entferne, wird das System gestartet, ohne die RTC zu beschädigen! Dies unterstützt die Idee, dass der Treiber selbst die Daten beschädigt. Ich habe mir den Treibercode angesehen, und er geht durch die Zeit und ändert Dinge, die er nicht mag (z. B. ändert er das 12-Stunden- bis 24-Stunden-Format). Vielleicht liegt das Problem darin, dass der Treiber zu einem Zeitpunkt installiert wird, an dem der I2C-Port nicht betriebsbereit ist (möglicherweise weil die Uhren nicht bereit sind?).
  • Wenn ich dies nach dem Start sudo sh -c 'echo ds1307 0x68 > /sys/class/i2c-adapter/i2c-1/new_device'mache: Der Treiber rtc_ds1307 wird geladen und / dev / rtc0 wird angezeigt. Und die Zeit ist noch in Ordnung. Und das kann als Grundlage für das Modifizieren der Init-Skripte verwendet werden
  • Noch ein lustiges Detail: Wenn ich es hwclock -sdirekt nach dem Schreiben in /sys/..../new_device in einem Skript verwende, schlägt es fehl. Es muss ein sleep 0.5oder etwas dazwischen geben.

Es scheint also, dass ich jetzt ein System habe, das heruntergefahren und gestartet werden kann und die richtige Zeit hat - ich werde dies bald richtig aufschreiben.

Greggo
quelle
Korruption kann (oder auch nicht) damit zusammenhängen, dass ntpdate ausgeführt wird ... raspberrypi.org/forums/viewtopic.php?p=690492#p690492
greggo
Ich habe dtparam=i2c1=onzu config.txt wie für micksulley im Januar arbeitete raspberrypi.org/forums/viewtopic.php?f=28&t=97639 - Reboot. Immer noch kein / dev / i2c *, immer noch kein i2cdetect.
Greggo
@goldilocks - danke, ein wichtiges Puzzleteil. i2cdetect funktioniert jetzt und 1: 0x68 wird als UU angezeigt. Ich werde später heute noch ein paar andere Sachen ausprobieren.
Greggo
1
note sudo invoke-rc.d hwclock.sh startmacht nichts, es wird beendet, weil es /run/udevexistiert. Aber sudo invoke-rc.d hwclock.sh showliest die Uhr, und sudo invoke-rc.d hwclock.sh stopkopiert die Systemuhr auf Hardware - Uhr.
Greggo

Antworten:

6

Hier ist, wie ich es zum Laufen gebracht habe.

Fast alles hier muss als Superuser erledigt werden, also benutze 'sudo bash' oder setze sudo vor alles (falls nicht bereits gezeigt).

Die folgenden grundlegenden Schritte sind erforderlich:

  • Sorgen Sie dafür, dass die 'i2c'-Treiber vorhanden sind, falls nicht bereits vorhanden.
  • Es gibt einen zusätzlichen Treiber für rtc_ds1307
  • entferne fake-hwclock. Dies ist ein Subsystem, das normalerweise verwendet wird, wenn Sie kein Netzwerk haben, um die Zeit bereitzustellen. Es spart die Systemzeit in einer Datei, wenn das System heruntergefahren wird, und lädt sie beim Start aus derselben Datei. Die Zeit ist also nicht richtig, aber zumindest geht sie bei jedem Neustart nicht auf Null zurück (1. Januar 1970). Wenn die RTC installiert ist, beginnt die Zeit auch ohne Netzwerk einigermaßen korrekt.
  • Sorgen Sie dafür, dass das System beim Start die Uhrzeit aus der RTC liest.

Bitte beachten Sie, dass dies für das Image 2015-05-05-raspian-wheezy auf einer Version 2.0 'Pi 1' und einem am Erweiterungsanschluss angebrachten ds1307 rtc gilt. Einige oder viele davon sollten für andere Situationen gelten (aber wahrscheinlich nicht für ältere Raspianer). Es ist möglich, dass das Problem mit der beschädigten RTC spezifisch für den ds1307-Treiber ist, sodass es für andere Chips einfacher sein könnte. Und dieses Problem wird möglicherweise in einer zukünftigen Version behoben.

Diese Anweisungen gelten auch für die Leiterplatte Modell 2, auf der der I2C-Bus Nr. 1 verwendet wird. Wenn Sie eine rev1-Platine haben (die keinen 8-poligen P5-Anschluss in der Nähe von P1 hat), schließen Sie die RTC an den I2C-Bus Nr. 0 an. Wenn Sie also /i2c-1/unten sehen, verwenden Sie /i2c-0/stattdessen.

Führen Sie zunächst raspi-config aus. Unter 'Erweiterte Optionen' finden Sie eine Einstellung zum Aktivieren des I2C und zum Laden von I2C-Treibern. Aktiviere sie.

Jetzt können Sie im Prinzip eine Zeile am unteren Rand von /boot/config.txt: dtoverlay=i2c-rtc,ds1307einfügen, die das Laufwerk ds1307 lädt. Aber - wie mehrere festgestellt haben - das Laden des Treibers wird den Inhalt der Uhr beschädigen und seinen Zweck zunichte machen. Ich habe keine Ahnung warum, aber ich habe mir die Treiberquelle angesehen und festgestellt, dass sie beim Start die Uhr liest und dann, wenn sie Dinge findet, die sie nicht mag (wie ein 12-Stunden-Format anstelle von 24), diese 'korrigiert' diese Einstellungen mit Schreibvorgängen. Ich vermute also, dass der Treiber möglicherweise zu früh nach dem Start des I2C geladen wird und die Uhren möglicherweise nicht richtig eingerichtet sind oder so, und die Kommunikation ist beschädigt. In jedem Fall funktioniert das nicht mit der Konfiguration, die ich habe, und so werden wir den Treiber später laden.

Zu diesem Zeitpunkt können Sie neu starten, und bei Verwendung lsmod | grep i2csollte der i2c_bcm2708Treiber geladen sein (wie in raspi-config gefordert).

Führen Sie als Nächstes diesen Befehl aus:

echo ds1307 0x68 > /sys/class/i2c-adapter/i2c-1/new_device

oder (falls noch nicht Superuser):

sudo sh -c 'echo ds1307 0x68 > /sys/class/i2c-adapter/i2c-1/new_device'

(Funktioniert sudo echonicht, da dies der >Superuser sein muss).

Dies sollte dazu führen, dass der rtc_ds1307Treiber geladen wird, und erstellt ein Gerät /dev/rtc0. Sie sollten jetzt in der Lage sein hwclock:

sudo hwclock -r

... Hier wird die Uhrzeit von der RTC angezeigt. Es kann durchaus zu einem Fehler kommen, da Ihre Uhr noch nicht richtig initialisiert wurde. In jedem Fall werden wir es jetzt einstellen.

(1) Stellen Sie sicher, dass die Systemuhr mit eingestellt ist date. Wenn Sie sich in einem Netzwerk befinden, sollte es bereits festgelegt sein. Wenn nicht, holen Sie Ihr Telefon oder Ihre Taschenuhr heraus und probieren Sie so etwas aus

sudo date -s '18 nov 2015 22:20:24'

Wenn Sie die Systemzeit richtig eingestellt haben - achten Sie darauf, dass sie für die Zeitzone richtig ist -, können Sie dies tun

sudo hwclock -w

welches es in die RTC kopiert.

Und dann hwclock -rsollte das funktionieren und die Zeit in der RTC anzeigen, und Sie sollten sehen, wie es voranschreitet, wenn Sie es mehr als einmal lesen.

Wed 18 Nov 2015 22:48:41 EST  -0.181329 seconds
Wed 18 Nov 2015 22:48:53 EST  -0.013721 seconds

Hinweis: Der Uhrwert wird relativ zur UTC-Zeitzone gespeichert, jedoch in Ortszeit angezeigt.

Nächster Schritt: Fake-Hwclock entfernen. Deaktivieren Sie es zuerst und stellen Sie sicher, dass die Datei hwclock.sh aktiviert ist:

sudo update-rc.d hwclock.sh enable
sudo update-rc.d fake-hwclock remove

sudo apt-get remove fake-hwclock
sudo rm /etc/cron.hourly/fake-hwclock
sudo rm /etc/init.d/fake-hwclock

hwclock.shwird beim Start nichts tun - es erkennt das Vorhandensein von udev und geht davon aus, dass udev die Startarbeit erledigt hat - aber es tut etwas Nützliches, das bewirkt, dass die Systemzeit beim Einschalten in die RTC geschrieben wird. Wenn Sie also eine Verbindung zu einem Netzwerk herstellen, wird die Pi-Zeit mit dem Netzwerk synchronisiert und Ihre RTC-Drift wird beim Herunterfahren korrigiert.

Eines bleibt übrig - wir müssen dafür sorgen, dass die RTC beim Einschalten gelesen wird, damit die Systemzeit eingestellt wird. udev enthält eine Funktion, die dies versucht, die jedoch fehlschlägt oder umgangen wird, weil der RTC-Treiber nicht geladen ist.

Die Art und Weise, wie ich dies eingerichtet habe, besteht darin, diese vier Zeilen oben /etc/rc.local(ganz oben, unterhalb der Kommentare) hinzuzufügen :

echo 'setting up RTC'
echo ds1307 0x68 > /sys/class/i2c-adapter/i2c-1/new_device
sleep 0.5
hwclock -s

Dadurch wird sichergestellt, dass bei jedem Systemstart der Treiber geladen und die Systemzeit von der Hardware-Uhr eingestellt wird. Der 'sleep 0.5' ist da, weil ich festgestellt habe, dass der hwclockBefehl ohne ihn nicht funktioniert - die Aktion, die durch das Schreiben in /sys/class/i2c-adapter/i2c-1/new_device(einschließlich der Existenz von / dev / rtc0) ausgelöst wird, dauert anscheinend einige Zeit (wahrscheinlich deutlich unter 0,5 Sekunden).

Und das ist es. Ich bin nicht wirklich zufrieden mit dieser Verwendung von /etc/rc.local- ich würde es lieber viel früher einrichten lassen, da eine Menge rc.localDinge passieren, bevor sie ausgeführt werden, und es viel besser wäre, die Uhr einzustellen, bevor diese Dinge laufen. Aber es funktioniert für mich. Ich werde diese Antwort aktualisieren, wenn ich einen besseren Weg finde.

Referenzen https://www.raspberrypi.org/forums/viewtopic.php?t=97314 https://www.raspberrypi.org/forums/viewtopic.php?p=842661 https://www.raspberrypi.org/forums /viewtopic.php?t=85683 https://www.raspberrypi.org/blog/upcoming-board-revision/

Greggo
quelle
Ich hatte eine RTC bestellt und RTC-Beiträge gelesen. Dies ist einer der wenigen auf dieser Website, der RTC erwähnt. Meine RTC angekommen, habe ich dtoverlay=i2c-rtc,ds3231bis config.txtauf neueste Raspbian (Jessie). Alles scheint in Ordnung zu sein. Keine spezielle Konfiguration erforderlich. Zugegeben, dies ist ein anderer Chip (obwohl das Datenblatt, abgesehen vom On-Chip Xtal, sehr ähnlich aussieht und mit 3,3 V betrieben wird). PS hwclockbrauchtsudo
Milliways
1
@ Milliways /etc/rc.localläuft als root. Ich erinnere mich nicht, ob der ds3231 denselben Treiber verwendet, und ich weiß sowieso nicht, was die Beschädigung verursacht, nur dass es passiert, wenn der Treiber geladen wird. Wie ich oben in einem Kommentar erwähnt habe, vermute ich, dass einige dieser Probleme auf die Rennbedingungen während der Initialisierung zurückzuführen sind (z. B. kann der RTC-Treiber geladen werden, bevor der i2c ordnungsgemäß eingerichtet wurde) und erheblich von der Geschwindigkeit von beeinflusst werden die SD-Karte. Als ich Jessie zum ersten Mal laufen ließ, war es auf einer Karte der Klasse 4 und es war ernsthaft kaputt; seltsame Fehler, und es ignoriert shutdown. War in Ordnung auf einer Klasse 10
Greggo
@ Milliways, aber ja, ich würde dringend empfehlen, mit dem ds3231 zu arbeiten, es läuft auf 3.3V, es ist viel genauer. Wenn es Sie auch vor diesen Problemen bewahrt, ist das ein riesiger Bonus.
Greggo
2

Ergänzende Antwort - Fehlerbehebung mit I2C-Tools

Während ich versuchte, es zum Laufen zu bringen, fand ich es hilfreich, i2c-tools zu verwenden, um die RTC zu betrachten, und Sie werden in anderen Diskussionen viele Hinweise darauf finden. Ich hatte der Frage, was ich damit fand, einige Informationen hinzugefügt. Ich habe es auf diese Antwort verschoben, falls es nützlich ist.

Sie müssen I2C aktiviert (raspi-config) und das i2c-dev-Modul geladen haben - Sie können dies mit a erzwingen sudo modprobe i2c-dev. i2c-devwird nicht benötigt, damit die RTC funktioniert, aber es wird benötigt, um i2c-Tools zu verwenden.

Sie können i2c-tools mit installieren sudo apt-get install i2c-tools, wenn 'i2cdetect' nicht vorhanden ist.

Wenn Sie eine PCB Rev. 1: Änderung i2cdetect -y 1zu i2cdetect -y 0, und das alles zu ändern , 1 0x68um 0 0x68in den i2cdumpBefehlen.

Du kannst tun i2cdetect -y 1

     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- -- 
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
60: -- -- -- -- -- -- -- -- 68 -- -- -- -- -- -- -- 
70: -- -- -- -- -- -- -- --

... die '68' zeigt an, dass ein Gerät unter der Adresse 0x68 auf die Adressierung auf dem I2C-Bus geantwortet hat. Wenn Sie den Treiber rtc_ds1307 geladen haben, wird er als 'UU' angezeigt, da er vom Treiber reserviert wird.

Der Befehl i2cdump -y -f -r 0-6 1 0x68 ckann verwendet werden, um die ersten 7 Register des ds1307 zu sichern, die die Zeit enthalten (das '-f' wird nur benötigt, wenn Sie den rtc-Treiber installiert haben; es überschreibt die Reservierung).

Nachfolgend sehen Sie, was nach dem Einschalten passiert, wenn die RTC durch das Laden des Treibers durch beschädigt wird dtoverlay=i2c-rtc,ds307.

hwclock -r meldet zunächst, dass die Uhreinstellung beschädigt ist und das Jahr tatsächlich '66' ist.

pi@raspberrypi ~ $ sudo hwclock -r
hwclock: The Hardware Clock registers contain values that are either invalid (e.g. 50th day of month) or beyond the range we can handle (e.g. Year 2095).
pi@raspberrypi ~ $ sudo i2cdump -y -f -r 0-6 1 0x68 c
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef
00: 50 04 00 05 01 01 66                               P?.???f         
pi@raspberrypi ~ $ sudo i2cdump -y -f -r 0-6 1 0x68 c
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef
00: 52 04 00 05 01 01 66                               R?.???f         
pi@raspberrypi ~ $ sudo hwclock -w
pi@raspberrypi ~ $ sudo i2cdump -y -f -r 0-6 1 0x68 c
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef
00: 35 09 01 03 17 11 15                               5??????         
pi@raspberrypi ~ $ sudo i2cdump -y -f -r 0-6 1 0x68 c
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef
00: 37 09 01 03 17 11 15                               7??????         
pi@raspberrypi ~ $ sudo hwclock -r
Tue 17 Nov 2015 01:09:42 UTC  -0.384866 seconds
pi@raspberrypi ~ $ sudo i2cdump -y -f -r 0-6 1 0x68 c
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef
00: 46 09 01 03 17 11 15                               F??????         

Die sieben Zahlen von i2cdump sind: [Sek. Min. Std. Wochentag Tag Monat Jahr], alle in bcd, also das letzte Mal ist der 17. November 2015, 01:09:46 UTC.

Die "beschädigte" Zeit ist der 1. Januar 66, und ich habe andere gesehen, die den gleichen Wert gemeldet haben.

Greggo
quelle
2

Ich hatte ein ähnliches Problem bei zwei Raspberry Pi 2 Model B mit Arch Linux, einem mit einem TinyRTC (mit dem ds1307) und einem mit einem Kondensator RTC (mit dem ds3231).

Das Ausführen von NTPD als Daemon hat das Datum beider RTC beschädigt und auf 2066/01/01 gesetzt.

#hwclock --debug
hwclock from util-linux 2.27
Using the /dev interface to the clock.
Last drift adjustment done at 1420070400 seconds after 1969
Last calibration done at 1420070400 seconds after 1969
Hardware clock is on UTC time
Assuming hardware clock is kept in UTC time.
Waiting for clock tick...
/dev/rtc does not have interrupt functions. Waiting in loop for time from /dev/rtc to change
...got clock tick
Time read from Hardware Clock: 2066/01/01 00:01:12
Invalid values in hardware clock: 2066/01/01 00:01:12
Time since last adjustment is -1420070400 seconds
Calculated Hardware Clock drift is 0.000000 seconds
hwclock: The Hardware Clock registers contain values that are either invalid (e.g. 50th day of month) or beyond the range we can handle (e.g. Year 2095).

Die Einrichtung

Ich habe in /boot/config.txt hinzugefügt

dtparam=i2c_arm=on
dtoverlay=i2c-rtc,ds1307

oder

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

Ich habe in /etc/modules-load.d/raspberrypi.conf hinzugefügt

i2c-bcm2708
i2c-dev

Ich habe systemd-timesyncd deaktiviert

# timedatectl set-ntp false

Ich habe NTP installiert

# pacman -S ntp

Wie es es gelöst hat

Ich habe festgestellt, dass durch Starten einer einzelnen Instanz des NTPD vor dem Starten des Dienstes die Systemzeit aktualisiert wird und die RTC nicht festgelegt wird. Wenn ich den NTPD-Dienst danach starte, wird das RTC-Datum aktualisiert, ohne es zu beschädigen.

Ich dachte, es gibt ein Berechtigungsproblem. Die Standardgruppe ist Audio.

# ls -l /dev/rtc0
crw-rw---- 1 root audio 254, 0 Jan  1  1970 /dev/rtc0

Ich habe /etc/udev/40-rtc-permissions.rules erstellt, um es zu testen

KERNEL=="rtc0", GROUP="ntp", MODE="0666"

aber es hat nicht geholfen, also habe ich es gelöscht.

Ich musste auch das Systemdatum beim Start aktualisieren, da dies nicht automatisch erfolgt.

Ich habe der Datei /etc/ntpd.service hinzugefügt

ExecStartPre=-/usr/bin/hwclock -s
ExecStartPre=/usr/bin/ntpd -gq

und aktivierte den NTPD-Dienst

# systemctl enable ntpd

und das Datum wird aktualisiert und während des Startvorgangs nicht beschädigt.

Ich habe nicht herausgefunden, warum der NTPD-Dämon die RTC beschädigt, wenn er zuerst gestartet wird, und würde mich freuen, wenn jemand meine Lösung verbessert, aber das funktioniert für mich.

iomihai
quelle
Danke für den Beitrag. Ich habe den ganzen Tag auf Raspberry Pi 3 dagegen gekämpft, und dein Beitrag hat endlich die letzten fehlenden Teile zusammengefügt. Ich verwende Fedberry für das Betriebssystem und versuche, das Gerät als IPA-Server einzurichten (warum? Weil Free IPA bei 10 Watt - schmeckt gut, weniger füllend!) Jetzt habe ich einen funktionierenden IPA-Server, der Stromausfälle überstehen kann ohne manuellen Eingriff. Ich verwende den ds1307 rtc und bin bei der Fehlerbehebung bei der von Ihnen identifizierten Uhr auf einige der gleichen Probleme gestoßen. Das Schlimmste war die Beschädigung des RTC-Speichers beim Booten. Ich bin nicht sicher, ob der dtparam = i2c_arm = on der Trick war o