Hallo,
ich verwende den MCP23017 zur Erweiterung der Ausgänge von meinem Arduino.
Der Baustein hat zwei Bänke A+B zu je 8 Bit. Eine Bank spreche ich momentan in binär oder dez oder hex an.
Kann man hier die Pins, also z.B. die als Ausgang geschaltet sind, einzeln ansprechen, oder geht das nur über Bitmanipulation?
Hallo,
schöner Baustein. Steht alles im Datenblatt. Zuerst mußt Du ihm sagen, in was
für einem Modus er arbeiten soll. Dann kannst Du über DDR die einzelnen Ports
ansprechen. Ist ganz einfach… haa, haa, haa!
Aber mal im Ernst, wenn Du dafür keinen Sketch findest, wird das keine einfache
Sache.
Gruß und Glück
Andreas
Der MCP23017 hat verschiedene Register.
Ein Register für (jeweils für einen Port)
IPOL die Polarität des Eingnags (ob ein 1 einem H oder L am Eingang entspricht)
IODIR ob eine Pin ein Eingang oder Ausgang ist.
GPINTEN, DEFVAL, INTCON, INTF, INTCAP für die Interruptfunktion eines Pins.
GPIO zum lesen bzw schreiben eines Ausgangs
OLAT zum schreiben der Ausgangspins (nur die als Aufgang definierten Pins werden dann wirklich geschrieben).
Für alle diese Register gilt, daß ein Bit einem Zustand eines Pins entspricht bzw betreffen.
Zum verändern eines Bits kannst Du die Bit Manipulations-Funktionen verwenden oder mittels logisch && bzw || die einzenen Bits des zu übertragenden Bytes setzen bzw löschen.
Andere Register haben funktionen die den gesamten MCP23017 betreffen und jedes Bit hat seine Bedeutung.
Die Übertrageung erfolgt immer als ganzes Byte bzw 16 Bit Wert in ein bestimmtes Register/ registerpaar ( je nach eingestelltem Mode . Darum mußt Du bei Ausgängen bzw registern die Du schreiben willst den letzten wert zwischenspeichern damit Du ihn verändern kannst.
man kann das bestimmt auch zu Fuß machen mit den üblichen Befehlsfolgen rund um I2C.
Man kann aber auch eine Library nutzen. Vielleicht hilft Dir das weiter.
Ich weis jetzt nicht ob in den Librarys die I2C Übertragung auch überprüft wird. Das mußte ich vor einer ganzen Weile hier im Forum lernen. In allen Code Bsp. im Netz und in Büchern wird nämlich nur der Befehl stur geschickt ohne jede Kontrolle.
die gezeigten Links kenne ich schon.
Das dachte ich mir schon, dass hier ein Byte dahinter steht und ich die einzelnen Ports nicht direkt ansprechen kann.
Für mich wäre es nun einfach, einen Ausgang anzusprechen, wie es beim Arduino mit der LED geschieht.
Also bleibt nur der Weg über die Bitschubbserei.
Vielen Dank für die Info.
die gezeigten Links kenne ich schon.
Das dachte ich mir schon, dass hier ein Byte dahinter steht und ich die einzelnen Ports nicht direkt ansprechen kann.
Für mich wäre es nun einfach, einen Ausgang anzusprechen, wie es beim Arduino mit der LED geschieht.
Also bleibt nur der Weg über die Bitschubbserei.
Vielen Dank für die Info.
Gruß Franz
Ein Port das sind 8 Pins. Du kannst einen Port ansprechen abe nicht die einzelnen Bits/Pins.
kann man eben nicht. Man kann nicht ähnlich wie digitalWrite (3, HIGH) einen Pin gezielt ansprechen. Man muß immer ein komplettes Byte rüberschicken.
Du könntest Dir noch die Funktion digitalWrite genauer anschauen, wie die Arduinomacher es gelöst haben. Wobei das bestimmt auch nur eine verpackte Bit Schubserei ist. Oder Du guckst Dir gleich die klassische C Methode an. Lernt man auch viel dabei.
Ich würde denken, man könnte die übliche Methode anpassen für den 23017.
Bsp. aus dem Link:
DDRB &= ~((1 << DDB3) | (1 << DDB4)); // Pin 3 und 4 auf Eingang und andere im ursprünglichen Zustand belassen
bzw.
PORTB |= (1<<PB4) | (1<<PB5); // Pins PB4 und PB5 "high"
Das DDRB bzw. PORTB könnte man als Byte Variable "umbauen" und dieses Byte dann immer rüberschicken. Das wäre jetzt mein Lösungsansatz. Könnte funktionieren.
Hallo,
aah, jetzt ist der Groschen gefallen. Er möchte das Ding so komfortabel wie
den Arduino programmieren. Eben "digitalWrite (3, HIGH)" und nicht-
"digitalWrite (A, 0x20)" oder wie auch immer.
Gruß und Dank
Andreas