versuche mit einem Raspberry Pi Pico einen MCP23017 zu betreiben. Das schalten von LEDs am Port funktioniert bereits super. Leider habe ich Probleme den Zustand von Tastern auszulesen. Verwende diesen Code dazu:
Code: Alles auswählen
from machine import Pin,I2C
import utime
# Initialisierung I2C, Bus 0, sda-0, scl-1, Adresse 0x22, Frequenz 400kHz
SCL_Pin = 1 # Angabe Pin SCL
SDA_Pin = 0 # Angabe Pin SDA
Bus = 0 # Angabe Bus Nr
MCP_Address = 0x22 # MCP23017 Angabe der Bus Adresse - 0x22, sonst ermitteln
i2c = I2C(Bus, scl = Pin(SCL_Pin), sda = Pin(SDA_Pin), freq = 400000)
MCP_GPIOA = 0x12 # Spiegelt den Wert am Anschluss A wider.
MCP_GPIOB = 0x13 # Spiegelt den Wert am Anschluss B wider.
MCP_OLATA = 0x14 # Schalte Ausgänge Port A.
MCP_OLATB = 0x15 # Schalte Ausgänge Port B.
MCP_IODIRA = 0x00 # Steuert die Richtung der Daten-E/A für Anschluss A.
MCP_IODIRB = 0x01 # Steuert die Richtung der Daten-E/A für Anschluss B.
MCP_IPOLA = 0x02 # Konfiguriert die Polarität der entsprechenden GPIO-Port-Bits für Port A.
MCP_IPOLB = 0x03 # Konfiguriert die Polarität der entsprechenden GPIO-Port-Bits für Port B.
MCP_GPINTENA = 0x04 # Steuert den Interrupt-on-change für jeden Pin von Anschluss A.
MCP_GPINTENB = 0x05 # Steuert den Interrupt-on-change für jeden Pin von Anschluss B.
MCP_DEFVALA = 0x06 # Steuert den Standard-Vergleichswert für Interrupt-on-Change für Anschluss A.
MCP_DEFVALB = 0x07 # Steuert den Standard-Vergleichswert für Interrupt-on-Change für Anschluss B.
MCP_INTCONA = 0x08 # Steuert, wie der zugehörige Pin-Wert für den Interrupt-on-change für Anschluss A verglichen wird.
MCP_INTCONB = 0x09 # Steuert, wie der zugehörige Pin-Wert für den Interrupt-on-change für Anschluss B verglichen wird.
MCP_IOCON = 0x0A # Steuert das Gerät
MCP_GPPUA = 0x0C # Schaltet Pull-up-Widerstände für Port A auf 5V
MCP_GPPUB = 0x0D # Schaltet Pull-up-Widerstände für Port B auf 5V
MCP_INTFA = 0x0E # Spiegelt den Unterbrechungszustand an den Pins von Anschluss A wider
MCP_INTFB = 0x0F # Spiegelt den Unterbrechungszustand an den Pins des Anschlusses B wider
MCP_INTCAPA = 0x10 # Erfasst den Wert von Anschluss A zum Zeitpunkt des Auftretens der Unterbrechung
MCP_INTCAPB = 0x11 # Erfasst den Wert des Anschlusses B zum Zeitpunkt des Auftretens der Unterbrechung
# Achtung Angabe der Pins in Hex
confA = [MCP_IODIRA, 0x00] # Steuert die Richtung der Daten am Port A, 0 Ausgang, 1 Eingang
confB = [MCP_IODIRB, 0xff] # Steuert die Richtung der Daten am Port B, 0 Ausgang, 1 Eingang
confC = [MCP_GPPUB, 0xff] # Schaltet Pull-up-Widerstände für Port B auf 5V
confD = [MCP_GPIOB, 0xff] # Spiegelt den Wert am Anschluss B wider
buff1 = [MCP_OLATA, 0x50] # Angabe Zahl, Pins an nach Tabelle
buff0 = [MCP_OLATA, 0x00] # Angabe 0, alle Pins aus
buff2 = [MCP_OLATA, 0x05] # Angabe Zahl, Pins an nach Tabelle
buff3 = [MCP_OLATA, 0x03] # Angabe Zahl, Pins an nach Tabelle
i2c.writeto(MCP_Address, bytearray(confA)) # Port A als Ausgang
i2c.writeto(MCP_Address, bytearray(confB)) # Port B als Eingang
i2c.writeto(MCP_Address, bytearray(confC)) # Schaltet Pull-up-Widerstände für Port B auf 5V
i2c.writeto(MCP_Address, bytearray(confD)) # Spiegelt den Wert am Anschluss B wider.
while True: # Beginn der Schleife
abt = i2c.readfrom(MCP_Address ,8)
print(abt) # Anzeige zur Kontrolle
print()
if (abt == 8):
i2c.writeto(MCP_Address, bytearray(buff2)) # schreibt an die Adresse buff 1 - 1 2
utime.sleep(0.5) # Pause
else:
i2c.writeto(MCP_Address, bytearray(buff3)) # schreibt an die Adresse buff 0 - 0 0
utime.sleep(0.5) # Pause
Das auslesen des gedrückten Taster und zur Kontrolle das schalten einer LED funktioniert nicht. Alle Pins des Ports A liegen auf 5V und haben beim betätigen der Taster GND. Taster schalten nach GND.