Der Uhrenbaustein PCF8583 am I<+>2<+>C-Bus des Raspberry Pi

© Donatas1205, 123rf.com

Zeitmaschine

Per I2C-Bus steuerbare Halbleiterbausteine gibt es für jeden möglichen Anwendungsfall. Zu den interessantesten Kandidaten zählt der achtbeinige Uhrenchip PCF8583.

Dieser Teil der Reihe über den I2C-Bus beschreibt den Mikrocontroller PCF8583 [1] genauer. Dabei handelt es sich um einen Uhren- und Kalenderbaustein mit einem 240 Byte großen, frei verfügbaren Speicher. Der Chip steckt meist in einem DIP-8-Gehäuse (Abbildung 1). Er besitzt nur eine Adressleitung, womit höchstens zwei dieser Bausteine an einem Bus mit den Start-Adressen 0xA0h und 0xA2 operieren können.

Abbildung 1: Die Pin-Belegung des PCF8583-Uhrenchips.

Für unsere Experimente gilt es, zu beachten, dass der Interrupt- beziehungsweise Alarmausgang über einen Feldeffekttransistor mit herausgeführtem Drain realisiert ist. Das bedeutet, dass er ohne zusätzlichen externen Pullup-Widerstand keinen sauberen Logikpegel liefert. Zusätzlich ist der Ausgang low aktiv und nimmt maximal 3 mA auf. Damit macht er genau das, was wir für einen einfachen Testaufbau mit einer LED an diesem Anschluss brauchen. Für alle tiefergehenden Hardware-Details lesen Sie das Datenblatt von NXP [2].

Auf der Heft-DVD finden Sie den Schaltplan für unseren ersten kleinen Testaufbau (Abbildung 2). Wie immer steht er auch in den Formaten gEDA [3] und EPS bereit.

Abbildung 2: Ein einfacher Testaufbau mit zwei PCF8583-Chips. Den dazugehörigen Schaltplan finden Sie auf der Heft-DVD.

Intern nutzt der PCF8583 einen 8 Bit breiten Adressbus, der es erlaubt, 256 Adressen innerhalb des Bausteins anzusprechen. Wirklich interessant sind aber nur die ersten 16 davon, weil diese die Steuer- und Statusregister enthalten. Die restlichen 240 Byte RAM stehen zur freien Verfügung. Damit die Uhr auch bei Unterbrechungen der Spannungsversorgung weiterläuft, betreibt in der Regel eine Pufferbatterie den Chip, sodass sich beliebige Daten dauerhaft im RAM ablegen lassen.

Die Belegung der unteren 16 Byte hängt zusätzlich vom aktuellen Betriebsmodus ab. Es gibt zwei Betriebsmodi: Uhr ("Clock") und Ereigniszähler ("Counter"). Primär steuert das Register 0x00h den Chip, 0x08h dient zur Alarmeinplanung. Die restlichen Register halten Zählerstände oder Uhrzeit beziehungsweise Datum vor (siehe Tabelle "PCF8583: Registerbelegung"). Die meisten Registerinhalte liegen BCD-kodiert vor. Es gilt also, die darin enthaltenen Werte beim Lesen und Schreiben entsprechend umzuwandeln.

PCF8583: Registerbelegung

Adresse

Funktion Uhr

Funktion Zähler

0x00h

Steuerung / Status

Steuerung / Status

0x01h

Hundertstelsekunden

D1 / D0

0x02h

Sekunden

D3 / D2

0x03h

Minuten

D5 / D4

0x04h

Stunden

frei

0x05h

Jahr / Datum

frei

0x06h

Wochentag / Monat

frei

0x07h

Timer

T1 / T0

0x08h

Alarmsteuerung

Zählersteuerung

0x09h bis 0x0Fh

Alarm oder RAM

Alarm für D0 bis D5 oder frei

0x10h bis 0xFFh

RAM (240 x 8 Bit)

RAM (240 x 8 Bit)

Hardware-Test

Nach dem Bestücken des Prototyping-Boards mit zwei PCF8583-Chips und allen anderen benötigten Bauteilen beginnt die Testphase. Das Raspberry**Pi GPIO Extension Board aus Abbildung 2, eine für Pi-Bastler wirklich sinnvolle Anschaffung, fand der Autor bei Ebay. Bevor Sie mit dem Programmieren starten, sollten Sie noch testen, ob die Hardware auch korrekt am I2C-Bus arbeitet (Abbildung 3).

Abbildung 3: Wurden die Treiber korrekt geladen und der Testaufbau richtig verkabelt, müssten sich die zwei Bausteine am I2C-Bus ordentlich melden. Erscheinen Hinweise wie Could not open file /dev/i2c-1, deutet das auf ein Treiberproblem hin.

Bei genauem Hinsehen fällt auf, dass sich die zwei Bausteine an den Adressen 0x50 und 0x51 befinden, nicht – wie es im Datenblatt steht – an 0xA0 und 0xA2. Was lief falsch? Zum Glück gar nichts: Bei genauerem Studium des I2C-Protokolls fällt auf, dass mit den sieben Adress-Bits an der Position 0 noch das Read/Write-Bit mit übertragen wird. Je nachdem, ob Sie den Sachverhalt von der Hardwareseite (rot) oder der Softwareseite (grün) betrachten, wird das R/W-Bit mit in die Adresse einbezogen oder nicht. Von der Programmierseite aus betrachtet gibt die Ausgabe von i2cdetect die Wahrheit (grün) wieder (Abbildung 4).

Abbildung 4: Je nachdem, ob das Read/Write-Bit mit einbezogen wird, resultieren daraus unterschiedliche Adressen für die Bausteine.

Programmbeispiele

Nachdem Sie sich nun mit der Hardware und den Registern vertraut gemacht haben, geht es ans Programmieren. Alle Beispiele finden Sie komplett in Java auf der Heft-DVD. Um den Artikel nicht unnötig aufzublähen, enthält er nur die relevanten Code-Abschnitte. Sollten beim Ausführen der Beispielprogramme Fehler auftreten, lohnt sich ein Blick in den ersten Teil dieser Reihe, den Sie als PDF-Datei ebenfalls auf der DVD finden. Dieser behandelt alle Grundlagen, auf denen dieser Artikel aufbaut. Fangen wir aber erst einmal mit einem einfachen Beispiel an.

Die Applikation I2C8583RAM stellt eine Verbindung mit dem PCF8583 her und schreibt einen Text in dessen Speicher. Danach liest sie den Inhalt ein und gibt ihn auf der Konsole aus. Für den Zugriff auf das RAM stellt die Klasse die Methoden readRam() und writeRam() bereit (Listing 1). Dabei sticht ins Auge, dass die letzten zwei Speicherplätze 0xFE und 0xFF unter den Tisch fallen: Dort legt unser nächstes Testprogramm die Werte für das Jahr ab. Der PCF8583 kann von Haus aus nur vier Jahre verwalten, die Funktion dient lediglich dem Ermitteln von Schaltjahren. Selbst das Datenblatt liefert dazu keine genauen Informationen. Falls Sie diese Funktion also produktiv nutzen möchten, empfiehlt sich hier sehr genaues Testen.

Listing 1

 

public static String readRam() {
  String out="";
  try {
    I2CBus bus=I2CFactory.getInstance(I2CBus.BUS_1);
    I2CDevice pcf8583Address = bus.getDevice(address);
    for (int i =16; i < 253; i++) {
      out = out+(char)pcf8583Address.read(i);
    }
  }
  catch(Exception e) {
    System.out.println("read"+e);
  }
  return out;
}
public static void writeRam(String s) {
  try {
    byte[] b = s.getBytes(Charset.forName("UTF-8"));
    I2CBus bus=I2CFactory.getInstance(I2CBus.BUS_1);
    I2CDevice pcf8583Address = bus.getDevice(address);
    for (int i = 0; i < b.length; i++){
      pcf8583Address.write((byte)i+16,(byte)b[i]);
    }
  }
  catch(Exception e) {
    System.out.println("write "+e);
  }
}

Im Beispielaufbau nutzt einer der beiden Bausteine eine Pufferbatterie, die es ermöglicht, die Daten dort dauerhaft zu speichern. Aktuell kennt das Testprogramm keine Leerzeichen. Aber um zu zeigen, wie der Zugriff auf das interne RAM funktioniert, genügt es vollkommen (Abbildung 5).

Abbildung 5: Ein einfaches Beispiel für den Zugriff auf den Hauptspeicher des Chips.

Bevor wir mit dem nächsten Beispiel weitermachen, noch eine kleine Information am Rande: Der PCF8583 nutzt für sein internes Adressregister eine Auto-Inkrement-Funktion. Er zählt also nach jedem Zugriff auf eine Speicherstelle automatisch um eins hoch. Das verringert gerade beim Scheiben und Lesen von langen Zeichenketten die Datenmenge auf dem Bus enorm. Um besser zu verdeutlichen, auf welche Speicherstelle gerade ein Zugriff erfolgt, verzichten die angeführten Beispielprogramme aber bewusst auf den Einsatz dieser Funktion.

Diesen Artikel als PDF kaufen

Express-Kauf als PDF

Umfang: 8 Heftseiten

Preis € 0,99
(inkl. 19% MwSt.)

Raspberry Pi Geek kaufen

Einzelne Ausgabe
 
Abonnements
 
TABLET & SMARTPHONE APPS
Bald erhältlich
Get it on Google Play

Deutschland

Ähnliche Artikel

Aktuelle Ausgabe

06/2019
Home Improvement

Diese Ausgabe als PDF kaufen

Preis € 9,99
(inkl. 19% MwSt.)

Stellenmarkt

Neuigkeiten

  • Verschlungene Pfade

    Mit Schleifen, Fallunterscheidungen und Funktionen programmieren Sie komplexe Skripte auf einfache und elegante Weise.

  • Extrem genau

    Mit einem A/D-Wandler messen Sie bei Bedarf Spannungen. Der MCP3424 macht dabei konstruktionsbedingt eine gute Figur.

  • Verbindungsaufnahme

  • Süßer Wecker

    Dem RasPi fehlen sowohl eine Echtzeituhr als auch ein BIOS, ein zeitgesteuertes Wecken erfordert also Zusatzkomponenten. Hier springt der Witty Pi Mini in die Bresche, ein µHAT von UUGear.

  • Windows to go

    Das Aufsetzen zuverlässiger und sicherer Remote-Desktop-Lösungen erfordert einiges Know-how. Die RasPi-basierte Pinbox von Pintexx reduziert den Konfigurationsaufwand auf ein Minimum.

  • Prima Klima

    In Museen ist es Pflicht, zu Hause nützlich: das permanente Prüfen und zentrale Erfassen der Feuchtigkeit und Temperatur in Räumen.

  • Auf einen Blick

    Ein maßgeschneiderter Infoscreen auf RasPi-Basis mit stromsparendem E-Ink-Display zeigt Termine, Bilder, Mitteilungen und Wetterinformationen an.

  • Sanft berührt

    Mit einem RasPi und dem Controllermodul PiXtend lassen sich mühelos Roboterarme ansteuern und deren Bewegung automatisieren.

  • Popcorn-Kino

    Mit Kodi 18.0 unterstützt LibreELEC 9.0 jetzt die von vielen Streaming-Diensten genutzte DRM-Verschlüsselung. Die Integration von Netflix, Amazon und Co. erfordert allerdings Handarbeit.

  • So nah und doch so fern

    Der RasPi kommt häufig als Server oder Steuerrechner für spezielle Zwecke zum Einsatz. Mit Anydesk erhalten Sie dazu eine Steuersoftware mit grafischer Oberfläche.