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

04/2019
TV & Multimedia

Diese Ausgabe als PDF kaufen

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

Stellenmarkt

Neuigkeiten

  • Finger weg

    Ein Temperatursensor verrät, ob Sie einen Gegenstand gefahrlos berühren dürfen. Beim Messen brauchen Sie dabei noch nicht einmal Kontakt zum Objekt.

  • Aus einer Hand

    Um einen Mikrocontroller zu programmieren, genügt ein Raspberry Pi. Wir zeigen, was Sie dazu noch benötigen.

  • Im Gleichtakt

    Synchronisierte Live-Loops und selbst erstellte Funktionen helfen dabei, Sonic Pi wie ein Live-Instrument zu spielen.

  • Mach mal

    Das Ftduino-Modul schlägt die Brücke zu Fischertechnik und ermöglicht es unter anderem, einen Drei-Achsen-Roboter anzusteuern.

  • Eleganter Diener

    Jeden Morgen dieselben Handgriffe, um zu sehen, ob die S-Bahn fährt und wie das Wetter wird? Ein cleverer Infoscreen auf RasPi-Basis automatisiert den Vorgang.

  • Bienenflüsterer

    Bienenzüchter, die ihre Völker besser kennenlernen möchten, müssen die fleißigen Insekten nicht pausenlos stören. Mit einem Raspberry Pi und verschiedenen Sensoren überwachen sie Temperatur, Luftfeuchtigkeit und bald auch das Gewicht des Bienenstocks.

  • Beerige Musik

    Für echten Hi-Fi-Sound braucht es mehr als einen kleinen Bluetooth-Brüllwürfel. Mit Volumio und einem Raspberry Pi rüsten Sie Ihre klassische Hi-Fi-Anlage mit smarten Funktionen auf.

  • Ton ab!

    Auf den ersten Blick erscheint der RasPi zu schwachbrüstig für den Betrieb leistungshungriger DAW-Software. Doch der Schein trügt.

  • Himbeer-TV

    Der DVB TV µHAT rüstet den Raspberry Pi mit einem DVB-T/T2-Tuner auf. Die deutsche TV-Landschaft schränkt dessen Möglichkeiten allerdings ein.

  • Git à la RasPi

    Mit wenigen Handgriffen zum Git-Hoster: Die dezentrale Arbeitsweise von Git erleichtert in Kombination mit der Netzwerkfähigkeit des RasPi das Verwalten von Quellcode.