Hall(o
versuche mit einem MCP23017 am I2C Bus Taster abzufragen. Am Port A (A0-A7) liegen LEDs. Am Port B (B0-B7) liegen Taster. Die Taster schalten nach GND. Alle LEDs kann ich ohne Problem schalten, Leider funktioniert das bei den Tastern nicht. Verwende folgenden Code dazu:
Python
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
confA = [MCP_IODIRA, 0] # Steuert die Richtung der Daten am Port A, 0 Ausgang, 1 Eingang
confB = [MCP_IODIRB, 1] # Steuert die Richtung der Daten am Port B, 0 Ausgang, 1 Eingang
confC = [MCP_GPPUB, 1] # Schaltet Pull-up-Widerstände für Port B auf 5V
confD = [MCP_GPIOB, 1] # 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
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
a = i2c.readfrom(MCP_Address, 8)
if a == 1: # oder mehr
i2c.writeto(MCP_Address, bytearray(buff2)) # schreibt an die Adresse buff 1 - 1
utime.sleep(1) # Pause
else
i2c.writeto(MCP_Address, bytearray(buff0)) # schreibt an die Adresse buff 0 - 0
utime.sleep(1) # Pause
# Kontrolle mit LED
i2c.writeto(MCP_Address, bytearray(buff1)) # schreibt an die Adresse buff 1 - 1
utime.sleep(1) # Pause
i2c.writeto(MCP_Address, bytearray(buff0)) # schreibt an die Adresse buff 0 - 0
utime.sleep(1) # Pause
Display More
Alles ohne Int. Hat jemand eine Idee dazu?
achim