Port-Expander PCF8574

Aus der Mikrocontroller.net Artikelsammlung, mit Beiträgen verschiedener Autoren (siehe Versionsgeschichte)
Wechseln zu: Navigation, Suche

Der PCF8574 ist ein via I2C-Bus angeschlossener 8-Bit I/O Port-Expander. Wer schon einmal unter "chronischem Pinmangel" in einer seiner Applikationen gelitten hat, weiss was gemeint ist.

Falls ihr noch nie etwas mit dem I2C gemacht habt, dann lest euch bitte zuerst die entsprechende Rubrik durch. Danach wird das Verstehen wesentlich einfacher fallen.

Das Datenblatt findet ihr hier.

Funktion

Ein seriell an den Baustein gesendeter Wert wird auf dessen Pins parallel ausgegeben. Es gibt drei Adresspins (A0:2), an welchen man die Adresse in Hardware einstellen kann (Pins jeweils auf Masse bzw. Vcc legen). Es können also maximal 2^3 = 8 Bausteine vom Typ PCF8574 und maximal 2^3 = 8 Bausteine vom Typ PCF8574A (unterschiedliche Addresspräfixe) direkt am Bus betrieben werden. Will man mehr ICs anschliessen ist ein I2C-Multiplexer notwendig (z. B. PCA9544A), oder es müssen mehrere I2C-Busse verwendet werden.

expander-pins.gif

An den Pins P0:7 kann ein 8 Bit Wert ausgegeben bzw. eingelesen werden. SDA und SCL dienen der Kommunikation über den I²C-Bus. /INT dient dazu, eingehende Daten an den Pins des Bausteins zu signalisieren. Man kann diesen Pin direkt an einen der Pins (externe Interrupts: INT0, INT1) des Mikrocontrollers legen. Da der Expander mit einem Open-Drain Ausgang daher kommt, muss ein Pull-Up gegen Betriebsspannung geschaltet werden. So kann der PCF8574 dem Mikrocontroller ohne den Umweg über den I2C übermitteln, dass sich die Eingangssignale geändert haben. Man kann ihn natürlich auch einfach offen lassen. Die Pins P0:7 können bis zu 25mA aufnehmen, aber nur gegen GND! Denn es handelt sich um Open Collektor Ausgänge. Ausgeben können die IOs nur ca. 100µA über den interen Pull-Up Widerstand (welcher genaugenommen eine Konstantstromquelle ist). Kurzzeitig kann dieser Pull-Up 1mA liefern, wenn ein Ausgang von LOW auf HIGH schaltet, das verkürzt die Umschaltzeit wesentlich. Der gesamt aufgenommene Strom sollte 100mA nicht überschreiten.

PCF8574 Ausgang

I²C Kommunikation

Gestartet wird die Kommunikation durch das Senden der Start-Bedingung gefolgt vom Adressbyte.

Das Adressbyte für den PCF8574:

Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 Hexadezimal
0 1 0 0 A2 A1 A0 R/W 0x40 + A[2:0]*2 + R/W

Das Adressbyte für den PCF8574A:

Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 Hexadezimal
0 1 1 1 A2 A1 A0 R/W 0x70 + A[2:0]*2 + R/W

Der Adresse (4Bit für die eindeutige Kennung + 3 frei wählbare Bits) folgt das obligatorische R/W-Bit, welches festlegt, ob ein Lese- oder Schreibzugriff ausgeführt werden soll (R/W=0 Schreiben, R/W=1 Lesen).

Wurde ein ACK empfangen, d.h. hat sich ein Slave angesprochen gefühlt, so kann man nun ein Datenbyte senden (R/W=0) oder den Status der Eingänge einlesen (R/W=1), also ein Datenbyte empfangen. Wurde ein Byte gesendet, so bestätigt der Baustein dieses mit ACK. Der Anwender kann nun festlegen, ob er das nächste Byte senden möchte oder ein STOP senden. Wurde ein Byte gelesen, so hat der Master dieses per ACK zu bestätigen, so er denn gleich das nächste empfangen möchte. Ansonsten kann hier das ACK entfallen und ein STOP gesendet werden.

Stellt sich nur noch die Frage: Wie regelt man nun, ob ein Pin als Ein- oder Ausgang arbeiten soll? Soviel gleich vorweg: So etwas wie die Datenrichtungsregister des AVRs gibt es hier nicht, man muss ohne sie auskommen. Den Ausgangspegel der Pins definiert man über einen Schreibzugriff. Sendet man beispielsweise nach der Adresse gefolgt vom ACK des Bausteins 0xF0, so bedeutet das, dass P0:3 nun L-Pegel haben und P4:7 H-Pegel. Will man einige IOs als Eingänge verwenden, muss man die entsprechenden Ausgänge zunächst auf H-Pegel setzen, da es sich um Open Collektor Ausgänge handelt sind die Ausgänge somit inaktiv. Führt man nun einen Lesezugriff durch, so stehen im gelesenen Byte die Pegel der Pins.

Anwendung

Im nachfolgenden Bild sind verschiedene Anwendungen der IOs dargestellt.

PCF8574.png

  • P0 - Ausgänge für LEDs: Die LEDS sind mit ihrer Anode über einen Vorwiderstand gegen VCC verdrahtet. Eine LED wird eingeschaltet, indem der jeweilige Ausgang auf LOW gesetzt wird (LOW active). Es ist NICHT möglich, die LEDs mit ihrer Kathode gegen GND zu verdrahten, da die Ausgänge vom Typ Open Collector sind und nur bei LOW große Ströme schalten können.
  • P1 - Ausgänge für ULN2003 & Co: Hier wird bei HIGH doch schon richtig Strom gebraucht (ca. 1mA). Den kann der IC nicht selber liefern (typisch ca. 100µA). Deshalb wird hier ein relativ niederohmiger Pull-Up Widerstand benötigt.
  • P2 - Relaisansteuerung mit PNP-Transistor. Hier muss die Versorgungsspannung des ICs gleich der Nennspannung der Relais sein (3,3-5V) und beide aus der gleichen Spannung versorgt werden (VCC)
  • P3 - Relaisansteuerung mit NPN-Tranistor. Hier kann die Versorgungsspannung des Relais frei gewählt werden, nur begrenzt durch die Spannungsfestigkeit von Q2
  • P4 - Relaisansteuerung mit P-Kanal MOSFET. Hier muss die Versorgungsspannung des ICs gleich der Nennspannung der Relais sein (3,3-5V) und beide aus der gleichen Spannung versorgt werden (VCC). Der MOSFET muss ein Logic Level Typ sein, der mit der Versorgungsspannung VCC schon sicher und vollständig durchschaltet, siehe Artikel FET
  • P5 - Ausgänge für Logikbausteine: Nichts besonderes.
  • P6 - Eingänge für Logikbausteine: Der Logikbaustein muss bei LOW bis zu 300µA Strom liefern können, da die internen Pull-Up Widerstände darauf dimensioniert sind und man sie nicht abschalten kann.
  • P7 - Eingänge für Taster: Die internen Pull-up Widerstände sind hier nützlich.

P0, P2 und P4 arbeiten in diesen Beispielen mit invertierter Logik.

Software

Routinen zum Ansteuern des Baustein können hier herunter geladen werden: