Eine Uhr mit Kalender kann man für viele Projekte gebrauchen. Dieses Grove Modul besitzt eine eigene Knopfzelle so dass die Uhrzeit nur einmal gestellt werden muss und dann in allen weiteren Projekten abgefragt werden kann, selbst wenn man das Modul erst nach einiger Zeit wieder aus der Schublade holt. Wer möchte kann die Ganggenauigkeit erhöhen, indem man einen Korrekturfaktor hinterlegt. Die Uhr gibt Schalttage korrekt wieder (wenigstens bis 2099), kann aber die Sommerzeit nicht automatisch umschalten.
Ansprechen der Uhr über I2CDas Uhrmodul verfügt über 11 Register in denen die Uhrzeit und Kalenderinformationen abgelegt sind. Einige der Register sind zur Steuerung des Moduls vorgesehen. Zum Stellen der Uhr stoppt man das Modul zuerst, setzt dann die gewünschten Register indem man jeweils die Registernummer und den gewünschten Wert in eine Zahl zusammenfasst (unsigned integer in big endian codiert, also UInt16BE) und dann per I2C Write Befehl überträgt.
Zum Auslesen des Uhrenbausteins benutzt man entsprechend den I2C Read Befehl. Dem Read Befehl fehlt allerdings ein Übergabe-Parameter für das gewünschte Register des Uhrenmoduls das man jeweils auslesen möchte. Die gewünschten Ergebnisse erhält man stattdessen, indem man hintereinander 11 mal den Read Befehl benutzt. Die Uhr erhöht die Nummer des Registers automatisch bei jeder Abfrage.
Die Register beinhalten folgende Werte:
0: Start / Stop der Uhr, 12 / 24 Stundenanzeige, auf der Platine genutzter Kondensator
1: Steuerung der Interrupt Funktionen, die über weitere Anschlüsse auf dem Modul abgreifbar sind
2: Wert für die Gangkorrektur
3: Frei zu nutzender Speicherwert
4: Sekunden
5: Minuten
6: Stunden
7: Tag des Monats
8: Wochentag (Woche beginnt am Sonntag)
9: Monat
10: Jahr
Die einzelnen Werte sind als dezimal kodierte Hex-Werte abgelegt. D.h., wenn man die Zahlen als Hexadezimal Wert übergibt, sind die beiden Stellen zu lesen als ob sie Dezimal Werte wären. 0x12 entspricht also der Zahl Zwölf und nicht der Zahl Achtzehn.
Auch beim Auslesen der Werte über das I2C Read Kommando müssen immer Zahlen im Format UInt16BE abgerufen werden, sonst funktioniert es nicht. Genutzt wird dann allerdings nur das untere Byte.
Die Bibliothek des Herstellers des Moduls ist hier dokumentiert https://github.com/Seeed-Studio/Grove_High_Precision_RTC_PCF85063TP und das Datenblatt des Chips liegt hier https://www.nxp.com/docs/en/data-sheet/PCF85063TP.pdf
Beispiel Ausgabe über das TerminalIm Code Beispiel stelle ich die Uhr auf eine bestimmte Zeit (Sonntag, 29. Oktober 2017, 21:55 Uhr und 0 Sekunden) sobald man auf den A-Knopf drückt. Das muss natürlich angepasst werden. Drückt man auf den B-Knopf wird der Tag und die Uhrzeit über das USB Kabel am angeschlossenen Computer ausgegeben. Die Terminal-Ausgabe habe ich mir bei Christian Schäfer abgeschaut.
Die Namen der Wochentage und der Monate werden über eine verschachtelte IF Anweisung ausgegeben und bei den Minuten wird eine zusätzliche Null ausgegeben, wenn diese nur einstellig sind.
Comments