Der Real Time Clock Baustein DS323

By | 15. Januar 2017

Bei dem RTC Baustein DS3231 oder DS3232 handelt es sich um einen sehr präzisen Uhren Baustein, der über die I2C Schnittstelle an jeden Microcontroller angeschlossen werden kann. Es gibt eine Vielzahl von Bibliotheken im Internet, über die eine einfache Nutzung dieses Bausteins möglich wird.

In diesem Beitrag soll allerdings gezeigt werden, wie mit Hilfe des Datenblatts der Herstellers direkt auf die internen Register des Chips zugegriffen werden kann. Dabei ist folgende Tabelle aus dem Datenblatt von zentraler Bedeutung:

bildschirmfoto-2016-11-04-um-15-01-58

Darin ist spezifiziert, in welchen Registern welche Information in welchem Format abgelegt ist. Auf Basis dieser Informationen lassen sich die Daten dann über die I2C Schnittstelle beispielsweise von einem Arduino auslesen.

I2C Kommunikations Grundlagen

Um Daten über den I2C Bus auszulesen verwendet man folgendes Schema:

Nach dem man die entsprechende  Register-Adresse angegeben hat, stehen die angefragten Daten dann bereit und können – wie im obigen Beispiel – in das  speziell angelegte Array übertragen und weiter verarbeitet werden. Im obigen Beispiel werden 2 Bytes gelesen. Es können natürlich auch größere Daten gelesen werden.

Einige Werte speziell die Temperatur-Daten können negative sein. Dazu verwendet man die sogenannte Zweierkomplement Notation.

Das 2er Komplement

Das Zweierkomplement ist die vorherrschende Art, mit der positive und negative Zahlen im Computer dargestellt und für Rechenoperationen mit Hilfe des Rechenwerks erschlossen werden.

Die Regel zur Bildung des 2er-Komplements lautet:

  • Alle Bits der entsprechenden positiven Zahl werden zuerst invertiert, d.h.
    aus einem 1 Bit wird ein 0 Bit und umgekehrt. 
  • Zu der so erhaltenen ‘Zahl’ wird der Wert 1 hinzuaddiert. Ein eventuell auftretender
    Überlauf wird verworfen

Beispiel:

2 ist in binär 0000 0010  
alle Bits invertieren 1111 1101  
und 1 hinzuaddieren 1111 1110 (entspricht -2)

Auslesen der Temperatur

Der Baustein besitzt einen Temperatur-Sensor auf dessen Werte über die Register mit den Adressen 0x11h und 0x12h zugegriffen werden können. Dem Datenblatt entnehmen wir dass

  • Die Temperatur ist als 10 bit Information abgelegt wird. 8bit vom MSB und 2bit vom LSB
  • Das Obere-Byte (MSB) (0x11h) enthält bei negativen Temperaturen die Werte in der 2er Komplement Notation
  • Das Untere-Byte (LSB) (0x12h) stellt den Fractional Part in 0.25 °C Schritten dar. D.h. wir benötigen nur 2 bits, da nur (0.0, 0.25,0.5,0,75) dargestellt werden müssen.
  • Die Berechnung ist dann recht einfach: die letzten 2 bit werden durch ((LRBYTE >> 6) isoliert. Nun hat man einen Wert zwischen 0 und 4 vorliegen. Durch Multiplikation mit 0.25 erhält man dann den Anteil nach dem Komma: ((LRBYTE >> 6) * 0.25)

Beispiel:

Wenn es sich um eine negative Temperatur handelt sieht die Berechnung etwas anders aus. Eine negative Temperatur (z.B. -18.0 °C) erkennt man daran, dass das Bit7 des MSB auf 1 gesetzt ist. 

Um dies zu überprüfen wird folgende Operation verwendet:  MSB & 0b10000000

Sie ergiebt genau dann 0b10000000=128 wenn das Bit gesetzt ist. In unserem Beispiel muss dann das 2er Komplement konvertiert werden. Dazu wird die XOR Operation mit 255 verwendet.

Dann wird 1 addiert und mit -1 multipliziert um schliesslich die korrekte Zahl zu erhalten. Im Programmcode sieht das dann so aus:

Das komplette Programm, um neben der Zeit auch die Temperatur auszulesen sieht dann so aus:

Mit folgendem Ergebnis:

bildschirmfoto-2016-11-05-um-09-49-17