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

08/2019
Smarte Hacks

Diese Ausgabe als PDF kaufen

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

Stellenmarkt

Neuigkeiten

  • Immer der Reihe nach

    Mit einer einfachen Schaltung testen Sie Bausteine, die über den SPI-Bus miteinander kommunizieren.

  • Einzigartig

    Eine MAC-Adresse ermöglicht die Kommunikation im Netzwerk. Der 24AA02E48 liefert sie für Setups, die aus grundlegenden Komponenten bestehen.

  • Steinkuchen

    Der Raspberry Pi hat viele Fans, doch nicht ohne Grund sehnen sich viele Anwender nach einem RasPi 4. Der Rock Pi 4 übertrumpft den RasPi 3 in Sachen Leistung um Längen und schlägt sich auch in der Praxis gut.

  • Kerngeschäft

    Der Einstieg in die Welt der Mikrocontroller fällt nicht ganz leicht. Mit dem Nucleo F401RE haben Sie jedoch ein Entwicklerboard samt abgestimmter Entwicklungsumgebung an der Hand.

  • Himbeer-Geräte

    Mit Maus und Tastatur im weiß-roten Raspberry-Look macht die Raspberry Pi Foundation das eigene Angebot an Peripheriegeräten für den Mini-Rechner komplett.

  • Unter Kontrolle

    PiCockpit ist eine speziell auf den RasPi zugeschnittene Online-Monitoring-Lösung. Wir werfen einen ersten Blick auf den brandneuen und in Ausbau befindlichen kostenlosen Dienst.

  • Ins rechte Licht gesetzt

    Selbst ohne eigenen Garten holen Sie sich Pflanzen mithilfe von LEDs in jeden Raum und sehen ihnen mit dem RasPi beim Wachsen zu.

  • Helligkeit nach Maß

    Wer bei wechselnden Lichtverhältnissen nicht ständig die Beleuchtung manuell nachregeln möchte, der spannt dafür einen PiXtend ein.

  • Geschrumpft

    Kleine Bildschirme gibt es zwar viele, aber der Support von Raspbian ist überraschend schlecht. Mit ein paar Tricks erzielen Sie trotzdem ein optimales Ergebnis.

  • Brüllwürfel

    Kompakt-Stereoanlagen mit CD-Spieler und Kassettendeck sind inzwischen oft ein Fall für den Recyclinghof – oder für die digitale Wiederbelebung mit einem RasPi und etwas Geschick.