RasPi PICO Micropython und der MCP23017

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Antworten
SteffenM_51
User
Beiträge: 2
Registriert: Mittwoch 12. Juni 2024, 16:56

Hallo,

ich habe nun schon mehrere Tutorials ( leider alle auf Englisch ) versucht zu verstehen, wie man den MCP23017 ohne aufwendige und kompliziert zu nutzende Bibliothek verwenden kann.

Mein eigentlich einfaches Ziel ist es die Ports des Registers A dazu zu verwenden mehrere Gate-Treiber für MOSFET geschaltete Ausgänge als OUTPUT zu verwenden. Sowie über die Ports des Registers B dazu verwenden, den Schaltzustand der Ports A via LED zu visualisieren.

Ich weiß leider nicht, ob mir die Google Übersetzung hierzu alles korrekt übersetzt hat. So wie ich daraus entnehmen konnte, kann man den Schaltzustand der Port-Register ( alle zusammen ) zurrücklesen, und diesen Wert gleich wieder dazu verwenden dieses Schaltmuster ( Bit-Muster ) in den PortB zu schreiben.

Dazu möchte ich eine kleine schlanke Class schreiben, welche nur die notwendigsten Inhalte umfasst.
Alle Ports der Register A und B auf Ausgang. Einen kleinen internen Buffer, welcher die Schaltzustände des Ports A als einfache LIST mit True und False beinhaltet, damit ich den Schaltstatus wieder in das Programm zurück bekomme. Dann drei einfache Ergänzungsfunktionen,.
Einmal zum ON-Schalten, eine zum OFF Schalten einzelner Ports, und eine Funktion, welche als all_off alle Ports wieder auf Low setzt.

Wünschenwert wäre es wenn man die Übertragung mittels Try / Except OSError überwachen könnte, und im Falle einer Fehlfunktion, via eines weiteren GPIOs am PICO eine Reset auslösen könnte. Dazu habe ich den Reset-Pin am MCP23017 über einen Pullup-Widerstand (10 kOhm ) mit der Vcc verbunden.

Code: Alles auswählen

from machine import Pin, I2C

class MCP23017():
    def __init__(self, i2c_bus, addr = 0x20, reset = None):
        self.i2c = i2c_bus
        self.address = addr
        if reset != None:
            self.reset = Pin(reset, Pin.OUT, value = 1)
        self.state = [False] * 8
        
    def setup(self):
        pass
        
    def pin_on(self, pin):
        pass
        
    def pin_off(self, pin):
        pass
        
    def all_off(self):
        pass

i2c = I2C(0, sda = Pin(0), scl = Pin(1), freq = 1_200_000)
mcp = MCP23017(i2c, reset = 4)
Das ist mein bisheriger Ansatz und Grundgerüst. Leider fehlt hier noch einiges bis fast alles, aber ich komme erst einmal ohne fremde Hilfe nicht weiter.
Ich hoffe mir kann hier einer mit einigen guten Tips und Ratschlägen weiterhelfen.

Danke im Voraus
Sirius3
User
Beiträge: 18250
Registriert: Sonntag 21. Oktober 2012, 17:20

Was hast Du gegen eine funktionierende Bibliothek?
Das ist besser, als selbst was zu schreiben, was nicht funktioniert.
SteffenM_51
User
Beiträge: 2
Registriert: Mittwoch 12. Juni 2024, 16:56

Hallo Sirius3

Weil diese Bibliotheken sehr viel, wahrscheinlich den gesamten Funktionsumfang dieses Portexpanders widerspiegeln und beinhalten. Allerdings bin auf Grund der Komplexität der Funktionsvielfalt weder mit der Ansprache zufrieden, wenn man mehrere Pins gleichzeitig in einen anderen Ausgangszustand versetzen will, noch kann man hier von einer flotten Ausführung sprechen. Leider reicht mir in diesem Fall der PCF8574 nicht aus, denn hier kann man wirklich sehr einfach und schnell - was sich auch in der Ausführungs- bzw. Reaktionszeit widerspiegelt Schaltoperationen durchaus komplexer Art umsetzen.
Die Bibliothek von MCAUSER -> https://github.com/mcauser/micropython-mcp23017 kann zwar viel, definitiv auch mehr als was ich benötige. Dennoch es dauert einfach zu lange bis diese Schaltbefehl als Resultat an den Ausgangs-Ports zu erfassen sind. Ein 400 kHz SCL getakteter PCF8574 mit der direkten Ansprache über einen BIT Block ist bedeutend, vor allem Meßbar, schneller wie der analoge Aufbau mit einem MCP23017 und dieser MCAUSER Bibliothek und dann sogar noch mit einem auf 1,2 MHz angehobenen SCL Takt.

Daher ist es mein Ziel alle unnötigen Funktionen, auch Unterfunktionen einfach wegzulassen, um wirklich sehr schnelle Schalt- und Umschaltvorgänge ausführen zu können.
Sirius3
User
Beiträge: 18250
Registriert: Sonntag 21. Oktober 2012, 17:20

@SteffenM_51: aber dann hast Du doch schon einen funktionierenden Ausgangspunkt, und es geht nur noch um Optimierung. Du kannst anfangen, alle Methoden, die Du angeblich nicht brauchst zu löschen und die übriggebliebenen Methoden auf Deinen Spezialfall vereinfachen.
Antworten