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.
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
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?
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.
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.