Forum: Mikrocontroller und Digitale Elektronik MCP23017 IOCON.Bank


von Obelix X. (obelix)


Lesenswert?

Wie kann man am einfachsten feststellen wie IOCON.BANK gesetzt ist? 
Abhängig davon wie das Bit gesetzt ist, muss ja zum auslesen dieses Bits 
eine unterschiedliche Adresse verwendet werden um das Bits zu lesen. 
Welche Adresse nehme ich aber nun wenn ich nicht weiß wie IOCON.BANK 
gesetzt ist.

Laut Datenblatt sollte das Bit auf 0 stehen, steht es aber nicht. Ich 
kann mir also nach dem Start nicht sicher sein wie das Bit steht.

Sollte ich also einfach das Bit in beiden möglichen Adressen 
setzen/löschen und dann den Rest initialisieren? Ich würde aber gerne, 
bevor ich etwas in den Chip schreibe sicher wissen wie das IOCON.BANK 
Bit steht.

von Gerd E. (robberknight)


Lesenswert?

Obelix X. schrieb:
> Laut Datenblatt sollte das Bit auf 0 stehen, steht es aber nicht. Ich
> kann mir also nach dem Start nicht sicher sein wie das Bit steht.

Nach einem richtigen Reset ist es mit 0 initialisiert. Darauf kannst Du 
Dich verlassen.

Falls es bei Dir auf 1 sein sollte:
- Schau Dir das Reset-Timing an, vielleicht stimmt da was nicht und das 
ist noch von vorher auf 1?
- Pullup-Widerstände am I2C ausreichend?
- Liest und schreibst Du wirklich dass was Du denkst oder gibt es 
irgendwelche Fehler auf dem I2C? Schau Dir das mal mit dem Oszi 
(wichtig, nicht nur Logic Analyzer) an. Sehen die Flanken sauber aus?

: Bearbeitet durch User
von Obelix X. (obelix)


Lesenswert?

Gerd E. schrieb:
> - Liest und schreibst Du wirklich dass was Du denkst oder gibt es
> irgendwelche Fehler auf dem I2C? Schau Dir das mal mit dem Oszi
> (wichtig, nicht nur Logic Analyzer) an. Sehen die Flanken sauber aus?

Nicht das du mich falsch verstehst, es funktioniert soweit alles mit dem 
schreiben und lesen. Ich schaue aber gleich nochmal mit dem Oszi auf die 
Flanken und den Reset überprüfe ich auch noch mal. Könnte der Status 
nach dem Powerup auch an einem gelälschten MCP23017 liegen?

von Obelix X. (obelix)


Lesenswert?

So, mit dem Oszi I2C Bus überprüft und OK.

Ich kann jetzt nicht mehr die Situation von gestern nachstellen. Jetzt 
haben nach dem Powerup bei Lesen der Register sowohl Register 0x05 als 
auch 0x0a den Wert 0x00, also auf jedenfall Bank = 0.

Trotzdem noch meine Frage, wenn kann ich das herraus finden wenn der 
Status nicht bekannt ist? Einfach Register 0x0a und 0x0b (bzw. 0x05 und 
0x15) vergleichen? Der Inhalt beide IOCON-Register muss ja gleich sein. 
Ist der Inhalt nicht gleich kann ich davon ausgehen, dass ich die 
falsche Registerbank angesprochen habe aber ist der Inhalt gleich bin 
ich auch nicht weiter.

von Christian S. (roehrenvorheizer)


Lesenswert?

Hallo,

ich habe eben nochmals das Dabla durchgesehen, allerdings habe ich mit 
dem IC in 2016 zuletzt zu tun gehabt.


Es scheint mir so, als ob man nach Reset von der bekannten Adresse 
ausgehen sollte und nur dann wenn da am BANK-Bit etwas geschrieben wird, 
muß das Programm dieses Bit speichern und im weiteren Verlauf verwalten. 
Nur so bleibt das Programm konsistent. Somit "weiß" also das Progemm, 
welchen Wert das Bit nach REset hat und welchen Wert es nach jedweder 
Schreiboperation auf das Register IOCON hat.

Mal eben Auslesen gelingt pauschal nicht, weil man die korrekte Adresse 
nicht weiß. Das dürfte der Grund für die Frage sein.

Ganz grob vermute ich, daß dieses Register sinnvollerweise direkt nach 
Reset als erstes konfiguriert wird, falls die Anwendung dies erfordert. 
Später braucht es dann nicht mehr verändert zu werden, außer man macht 
"special effects" und hat das im Griff.


mfg

von Obelix X. (obelix)


Lesenswert?

Christian S. schrieb:
> Mal eben Auslesen gelingt pauschal nicht, weil man die korrekte Adresse
> nicht weiß. Das dürfte der Grund für die Frage sein.

Genau.

Christian S. schrieb:
> Ganz grob vermute ich, daß dieses Register sinnvollerweise direkt nach
> Reset als erstes konfiguriert wird, falls die Anwendung dies erfordert.
> Später braucht es dann nicht mehr verändert zu werden, außer man macht
> "special effects" und hat das im Griff.

Weswegen ich auf meine Fragestellung kam : Mal angenommen das 
Hauptprogramm initialisiert den MCP und anschließen soll eine Libraray 
einige GPIOs des MCP nutzen. Die Lib weiß aber nicht wie der MCP 
initialisiert ist. Schön währe, wenn die Lib das selbständig heraus 
finden könnte. OK, dann muss der Lib unbedingt mitgeteilt werden, wie 
das Hauptprogramm den MCP initialisiert hat.

Die Chipentwickler hat das IOCON-Register ja auch mal auf Adresse 0x00 
legen können ...

: Bearbeitet durch User
von Christian S. (roehrenvorheizer)


Lesenswert?

Obelix X. schrieb:
> Die Lib weiß aber nicht wie der MCP
> initialisiert ist.

Da hängt es dann wieder vom "guten Willen" des Programmierers der Lib 
ab, ob diese beispielsweise Register, die sie verändern wird, am Ende 
wieder restauriert, also aus einem Speicher liest und wieder herstellt, 
wie sie vor ihrem Aufruf waren.

Obelix X. schrieb:
> OK, dann muss der Lib unbedingt mitgeteilt werden, wie
> das Hauptprogramm den MCP initialisiert hat.

Es bleibt nur die Frage übrig, ob die Lib dafür ein "offenes Ohr" 
eingebaut bekommen hat. Die ganze Schlauheit kommt immer vom 
Programmierer und nicht vom dummen Prozessor oder dem laufenden 
Programm.
Falls nicht , muß man die Restaurautionsarbeiten eben selbst vor Aufruf 
und nach Ende der Lib selber machen, wenn einem das keiner abnimmt.

Obelix X. schrieb:
> Die Chipentwickler hat das IOCON-Register ja auch mal auf Adresse 0x00
> legen können ...

Das waren Nerds und Heinis mit starken Hornbrillen mit -12 Dioptrien, 
die nie Tageslicht gesehen haben.
Meistens haben die sich was dabei gedacht, aber das durchschaut man 
erst, wenn man sich länger mit den Eigenheiten befasst hat.

mfg

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.