Mit dem MCP23017 verschaffen Sie dem RasPi mehr Möglichkeiten, weil er den Mini-Rechner mit weiteren Modulen verbindet.
Den MCP23017 gibt es mit unterschiedlichen Gehäusen. Einige davon erlauben es sogar, sie mit den Mitteln eines Bastlers selbst zu löten. Um sich das Leben etwas leichter zu machen, lohnt es sich aber, auf ein schon verlötetes Modul zurückzugreifen. Die gibt es günstig für 1,28 Euro direkt aus China [1].
Der MCP23017 arbeitet im Spannungsbereich von 1,8 bis 5,5 Volt. Er unterstützt alle üblichen I2C-Bus-Geschwindigkeiten von 100 kHz bis zu 1,7 MHz und verfügt über drei Eingänge, mit denen Sie die I2C-Adresse im Bereich von 0x20h bis 0x27h frei wählen. Das im Beispiel verwendete Modul hatte ab Werk die Adresse 0x20h. Um die Adresse zu modifizieren, verändern Sie die SMD-Brücken.
Die 16 GPIOs teilen sich in zwei Gruppen auf (Port A und Port B), die beide in der Lage sind, einen programmierbaren Interrupt auszulösen. Jeder einzelne Anschluss nimmt bis zu 25 Milliampere auf oder stellt sie bereit. Abbildung 1 zeigt das Pinout.

Abbildung 1: Das Pinout des MCP23017 zeigt unter anderem die zwei Gruppen von GPIOs, die Sie jeweils separat verwenden dürfen.
Intern verfügt der Baustein über 22 Register, über die Sie alle Funktionen steuern. Sie sprechen sie auf zwei verschiedene Arten an (Bank=0 und Bank=1). Je nachdem, welchen Modus Sie verwenden, haben die Register eine andere Adresse. Im Beispiel bleibt die Bank auf der Standardeinstellung (Bank=0). Die Tabelle “Register” zeigt eine Übersicht der Register mit ihren Funktionen in diesem Zustand.
|
Adresse |
Name |
Beschreibung |
|---|---|---|
|
|
IODIRA |
für Port A Pin bitweise als Ein-/Ausgang definieren (0=In, 1=Out) |
|
|
IODIRB |
für Port B Pin bitweise als Ein-/Ausgang definieren (0=In, 1=Out) |
|
|
IPOLA |
festlegen, ob ein Pin invertierend arbeitet (Port A) |
|
|
IPOLB |
festlegen, ob ein Pin invertierend arbeitet (Port B) |
|
|
GPINTENA |
Freigabe für Interruptverarbeitung (Port A) |
|
|
GPINTENB |
Freigabe für Interruptverarbeitung (Port B) |
|
|
DEFVALA |
Steuern der Interruptverarbeitung (Port A) |
|
|
DEFVALB |
Steuern der Interruptverarbeitung (Port B) |
|
|
INTCONA |
Steuern der Interruptverarbeitung (Port A) |
|
|
INTCONB |
Steuern der Interruptverarbeitung (Port B) |
|
|
IOCON |
Konfigurationsregister |
|
|
IOCON |
Konfigurationsregister |
|
|
GPPUA |
Pullup-Widerstände aktivieren (Port A) |
|
|
GPPUB |
Pullup-Widerstände aktivieren (Port B) |
|
|
INTFA |
Interrupt aufgetreten historisch (Port A) |
|
|
INTFB |
Interrupt aufgetreten historisch (Port B) |
|
|
INTCAPA |
Interrupt genau jetzt (Port A) |
|
|
INTCAPB |
Interrupt genau jetzt (Port B) |
|
|
GPIOA |
speichert Werte für Port A (R/W) |
|
|
GPIOB |
speichert Werte für Port B (R/W) |
|
|
OLATA |
Zugriff auf Zwischenspeicher für Port A |
|
|
OLATB |
Zugriff auf Zwischenspeicher für Port B |
Es gibt eine MCP23017-Variante, die Sie per SPI ansteuern. Sie trägt die Kennung MCP23S17 und ist bis auf den Bus baugleich mit der I2C-Version. Sollten Sie mehr Informationen zum MCP23017 benötigen, werfen Sie einen Blick in das Datenblatt [2].
TIPP
Wie in den letzten Teilen dieser Reihe kommt beim Programmieren und Basteln diesmal wieder die Umgebung zum Einsatz, die bereits in Teil 18 dieser Reihe benutzt wurde. Sie finden den entsprechenden Artikel online [3].
Eingabe
Für einen ersten Versuch verwenden Sie das Modul nur im Eingabemodus. Wie man im Schaltplan (Abbildung 2) erkennt, sind im Versuchsaufbau alle I/Os mit 10K-Widerständen auf Masse gezogen (Pulldown). Das erzeugt an den Eingängen eine logische 0.

Abbildung 2: Der Schaltplan für das Beispiel mit dem Eingabemodus zeigt, wie die I/Os gegen Masse gezogen sind.
Möchten Sie an einem Eingang eine logische 1 erzeugen, verwenden Sie dazu den DIP-Schalter. Auf dem Schaltplan sehen Sie auch, wie Sie den Raspberry Pi an das Modul anschließen. Abbildung 3 zeigt den kompletten Testaufbau. Um zu überprüfen, ob Sie das Modul richtig angeschlossen haben, verwenden Sie das Tool I2cdetect. Die Ausgabe sollte so aussehen wie in Listing 1.
Listing 1
$ i2cdetect -y 1
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: 20 -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
War der Test erfolgreich, gehen Sie einen Schritt weiter und steuern mit den Tools I2cset und I2cget den Baustein von Hand an. In Listing 2 sehen Sie die Kommandos, mit denen Sie die Ports A und B in den Input-Modus schalten. Das Watch-Kommando startet alle zwei Sekunden den Befehl zum Auslesen der Ports, wobei I2cget zum Einsatz kommt.







