Listing 2
### IODIR PORT A, alle in $ i2cset -y 1 0x20 0x00 0xFF ### IODIR PORT B, alle in $ i2cset -y 1 0x20 0x01 0xFF $ watch 'i2cget -y 1 0x20 0x12; i2cget -y 1 0x20 0x13'
Verändern Sie nun die Stellung der DIP-Schalter und verfolgen Sie am Bildschirm, wie sich das auf die Werte auswirkt. Falls Sie den Eindruck haben, dass etwas nicht stimmt, sehen Sie sich am besten zuerst die Beschriftung der Ports an: Sie ist für Port A aufsteigend, für Port B jedoch absteigend. Das sorgt gern für Verwirrung.
War der Test erfolgreich, haben Sie alles so weit richtig zusammengebaut. Nun ist es an der Zeit, mit der Programmiersprache Go auf den Baustein zuzugreifen. Listing 3 zeigt das entsprechende Programm. Die Funktion entspricht den Bash-Befehlen aus Listing 2. Mit go run input.go starten Sie das Programm auf der Kommandozeile.
Listing 3
package main
import (
"fmt"
"gobot.io/x/gobot/drivers/i2c"
"gobot.io/x/gobot/sysfs"
"time"
)
func main() {
bus,_ := sysfs.NewI2cDevice("/dev/i2c-1")
device := i2c.NewConnection(bus,0x20)
defer func() {device.Close()}()
device.WriteByteData(0x00,0xFF) // Port A all in
device.WriteByteData(0x01,0xFF) // Port B all in
for ;; {
portA,_ := device.ReadByteData(0x12)
portB,_ := device.ReadByteData(0x13)
fmt.Printf("0x%xh : 0x%xh\n",portA,portB)
time.Sleep(500*time.Millisecond)
} // for;;
}// main
Ausgabe
Im zweiten Versuch verwenden Sie die I/Os des Moduls für die Ausgabe; Abbildung 4 zeigt den Schaltplan dazu. Hier verbinden Sie die I/Os mit LEDs, die Sie wiederum mittels eines Widerstands auf Masse ziehen. Am besten testen Sie den Aufbau wieder zuerst in einer Shell (Listing 4), bevor Sie ein Go-Programm verwenden.
Listing 4
### IODIR PORT A alle out $ i2cset -y 1 0x20 0x00 0x00 ### IODIR PORT B alle out $ i2cset -y 1 0x20 0x01 0x00 $ i2cset -y 1 0x20 0x12 0xff $ i2cset -y 1 0x20 0x13 0xff
Nach dem Ausführen der Kommandos aus Listing 4 sollten alle LEDs leuchten. Im nächsten Schritt verwenden Sie das Go-Programm aus Listing 5, um die LEDs abwechselnd anzusprechen. Der Code schreibt dazu nacheinander unterschiedliche Bit-Muster in die I/O-Register.
Listing 5
package main
import (
"gobot.io/x/gobot/drivers/i2c"
"gobot.io/x/gobot/sysfs"
"time"
)
func main() {
bus,_ := sysfs.NewI2cDevice("/dev/i2c-1")
device := i2c.NewConnection(bus,0x20)
defer func() {device.Close()}()
device.WriteByteData(0x00,0x00) // Port A all out
device.WriteByteData(0x01,0x00) // Port B all out
for ;; {
device.WriteByteData(0x12,0x55) // Port A 01010101
device.WriteByteData(0x13,0x55) // Port B 01010101
time.Sleep(500*time.Millisecond)
device.WriteByteData(0x12,0xAA) // Port A 10101010
device.WriteByteData(0x13,0xAA) // Port B 10101010
time.Sleep(500*time.Millisecond)
} // for;;
}// main
Ausblick
Die beiden vorgestellten Beispiele reizen den Funktionsumfang des MCP23017 bei Weitem nicht aus. So ist es etwa möglich, alle I/O-Pins des MCP23017 einzeln zu konfigurieren und anzusteuern. Außerdem haben die Beispiele das Verarbeiten der Interrupts des Bausteins außen vor gelassen. Sie sollten aber wissen, dass sich diese auch auf Pin-Ebene steuern lassen. Sie können Interrupts sowohl per Hardware als auch per Software weiterverarbeiten.
Fazit
Beim MCP23017 handelt es sich um einen sehr fortschrittlichen I/O-Baustein. Neben den üblichen Funktionen verfügt er über eine ausgefeilte Interrupt-Verarbeitung. Es ist sogar möglich, Pin-weise interne Pullup-Widerstände zu aktivieren. Falls Sie in einem Projekt vor der Wahl stehen, den PCF8574 (Teil 1 dieser Reihe) oder den MCP23017 zu verwenden, sollten Sie sich auf jeden Fall immer für den moderneren MCP entscheiden. Zugegeben, das Datenblatt ist keine leichte Lektüre; es lohnt sich aber, die Zeit zu investieren und sich einmal intensiv damit auseinanderzusetzen.
Der Autor
Im Zeitalter der Magnetringkernspeicher geboren, studierte Martin Mohr nach einer Ausbildung zum Elektroniker Informatik und entwickelte beruflich überwiegend Java-Applikationen. Mit dem RasPi erwachte die Liebe zur Elektronik wieder.
Infos
- MCP23017-Modul: https://de.aliexpress.com/item/32941624728.html
- Datenblatt MCP23017: http://ww1.microchip.com/downloads/en/DeviceDoc/20001952C.pdf
- I2C-Workshop (Teil 18): Martin Mohr, “Unter Kontrolle”, RPG 04/2018, S. 80, https://www.raspi-geek.de/40583






