Forum: Mikrocontroller und Digitale Elektronik Output pin status vom MCP23017 lesen


von Glenn R. (glenn_r)


Lesenswert?

N'abend,

ich versuch grad den Status von Output Lins am MCP23017 herauszufinden. 
Das Problem ist nämlich, das ich irgendwo am Anfang des Skripts ein paar 
Pins HIGH setzte und dann später, bei Bedarf, ein paar dazuschalte.
Also:
irgendwo am Anfang des Codes:
1
MCP.write_byte_data(adress, port, 0b00001111)
 > damit sind die ersten 4 Pins des MCP HIGH und die anderen LOW

später dann:
1
MCP.write_byte_data(adress, port, 0b11000000) >
hier würd ich gern die anderen 2 Pins hinzuschalten, doch ich hab keine 
Ahnung welche vorher High waren. In dem Beispiel wären dann zwar die 
beiden Pins HIGH aber der Rest LOW.

ich müsste dann so etwas machen wie:
1
old = bin(Befehl fürs lesen des alten Staus der Pins)
2
MCP.write_byte_data(adress, port, (old|0b11000000)

Es geht hierbei um ein Raspi und, falls noch nicht an der Syntax 
erkannt, Python mit der smbus Library (der Port ist hier 0x13)

Doch wie liest man den Status eines OUTPUT Pins?

: Bearbeitet durch User
von Easylife (Gast)


Lesenswert?

Würde ich mit einer Variablen lösen, die den aktuellen port state hält.

Also immer bevor du MCP.write_byte_data aufrufst, änderst du erstmal 
diese Variable, und setzt dann den Port mit dem Inhalt dieser Variable.

etwa so:

portstate = 0b00001111
MCP.write_byte_data(adress, port, portstate)

(sorry, wenn die syntax nicht python-like sein sollte, ich kenne nur C)

wenn du dann einzelne bits dazu schalten willst, veroderst du die zu 
setzenden bits mit dem portstate:

portstate = portstate | 0b11000000
MCP.write_byte_data(adress, port, portstate)

und zum löschen von bits maskierst du die entprechenden bits aus:
portstate = portstate & ~(0b11000000)
MCP.write_byte_data(adress, port, portstate)

von holger (Gast)


Lesenswert?

>Doch wie liest man den Status eines OUTPUT Pins?

Indem man das entsprechende Register aus dem Chip
ausliest. Schau in das Datenblatt von dem Chip.
Oder kannst du das auch nicht?

von Glenn R. (glenn_r)


Lesenswert?

Eine Variable, danke war ich auch schon drauf gekommen aber später soll 
multithreading genutzt werden und ich müsste dann immer alle Threads 
sperren, wenn ich mit der Variable arbeite. Und da das Programm 
zeitkritisch arbeitet ist das keine gute Idee. Trotzdem Thx für dein 
guten Komment.

Und nun zu Holger,
ich mag es zwar wenn man sich an meinem Problem beteiligt, aber dann nur 
um zu helfen und nicht um arrogant sein Wissen anzupreisen:

> Oder kannst du das auch nicht?

Das ist ja eben der Grund für den Thread hier: ich würde die Methode 
dafür gerne Wissen. Und wenn du sie selbst nicht kennst, dann halt dich 
daraus!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.