Hallo,
Ich habe ein projekt, bei dem ich je nach anwendungsfall 1 bis 8
mcp23027 port expander an mein mikrocontroller über i2c angeschlossen
hab. diese werden vor Inbetriebnahme per steckverbindung angeschlossen.
nun möchte ich ein weiteres modul mit pca9505 anschließen. Das modul hat
dann leider den gleichen Adressraum. Gibt es eine Möglichkeit
auszulesen, welcher ic typ da auf der Adresse horcht?
Links zur info würden mir reichen.
beste Grüße
Jörg
Sorry, blöde handytastatur...
meinte MCP23017. 16bit Port expander für i2c.
der pca9605 ist ein 40bit port expander. Diese muss ich dann software
technisch von einander unterscheiden können.
>Diese muss ich dann software>technisch von einander unterscheiden können.
Das geht aber nur schwer. Ich könnte mir vorstellen
da in Register zu schreiben die der eine nicht
hat und die dann zurückzulesen. Wenn Müll zurückkommt
wars der andere. Aber das ist schon echt weit hergeholt.
Hallo,
Hmm wenn du die io Ports damit meinst, dann geht das leider nicht, da
alle verwendet werden.
Mein Problem bei der Sache ist ja, ich weiss nicht welcher ic nun auf
der adresse 0x20 auf dem bus hängt. Bis auf die adresse unterscheiden
sich beide ic ja in der kommunikation. Daher muss ich 2 klassen
schreiben und je nach ic für die entsprechende adresse diese
instanzieren. Nur beim start der anwendung scanne ich den adressbereich
0x20 bis 0x27. Wenn eine antwort kommt, dann ist die adresse belegt.
Nun hatte ich gehofft, es gibt eine eindeutige hersteller und ic-typ id,
die man mit einem standard kommando abfragrn kann.
Scheint aber nicht der fall zu sein. Ich muss dann wohl testen, was
passiert wenn ich ein nicht vorhandenes register des mcp23017 abfrage
und ob das ergebnis dann von einem vorhanden register im pca9605
unterscheidbar ist. Nicht schön, aber vielleicht der einzig gangbare
weg. Blöde das die port-expander ics alle mit 0x20 starten. Jedenfalls
bei denen, die ich gefunden habe...
beste grüße
Jörg
du hast aber sicher an den Expandern unteschiedlichen Sächelchen
angeschlossen.
Da sind wahrscheinlich bei jedem angeschlossenen Gerät auch ein paar
Pins dabei, welche einen bestimmten, definierten Status haben, z.B. weil
sie einen Pullup oder Pulldown haben, oder weil die daran angeschlossene
Schaltung bestimmte Eigenschaften hat.
Da muss es doch möglich sein, durch Einlesen der Eingänge eine
Entscheidung treffen zu können, was angeschlossen ist, oder?
Ansonsten musst du halt an deine angeschlossenen Geräte ein paar
Leitungen definiert hinziehen. Weil nur weil man sie Hardwarecodiert,
heißt das nicht, dass sie nicht als Port nutzbar sind
Man könnte mit einem PCF8574A den Adreßraum erweitern.
Dessen Ausgänge gehen auf A0 der 8 MCP23017 und einer wird selektiert.
Die anderen 7 sind dann auf einer nicht genutzten Adresse.
Man hat von den 8 möglichen Adressen also nur 2 verbraucht.
Jörg schrieb:> Nun hatte ich gehofft, es gibt eine eindeutige hersteller und ic-typ id,> die man mit einem standard kommando abfragrn kann.
Warum sollte es die geben? Philips hat bei der Entwicklung des 12C-Bus
wahrscheinlich nie damit gerechnet, dass mehr als 8 gleiche Geräte am
Bus hängen werden, deshalb nur die 3 Adressleitungen zur Unterscheidung.
Das da mehrere Hersteller die gleiche interne Adresse verwenden, ist
natürlich blöde, aber mit 4 Bits sind ja auch nur 16 verschiedene
Adressen möglich. Abhilfe gibt es nur durch I2C-Multiplexer oder eine
zweite I2C-Schnittstelle, aber das wurde ja schon gesagt.
Ach immer die ganzen ics...
PCA9505 und MCP23017
Wie gesagt, mein Hauptmodul besteht aus einem Microkontroller, einer
Versorgungsspannungseinheit, Funkmodul und ein wenig messelektronik.
Dieses hauptmodul kann dann durch externe module erweitert werden, bei
denen im Moment 16 vollkommen gleich aufgebaute Kanäle integriert sind
(im Grunde Ein-/AusSchalter).
Nun las ich vom PCA9505 und dachte mir, damit kann ich schnell die
Ausgangszahl erweitern. Da ich aber gerne abwärtskompatibel ausgelegt
bin und die externen Module je nach Anwendungsfall (ändert sich bei
jeder nutzung) an unterschiedlichen hauptmodulen verwende, kann ich
leider nicht über den weg des auslesens der beschaltung der ics gehen.
D.h. beim start des hauptmoduls suche ich die angeschlossenen module und
- im Moment - weiss ich dann die anzahl der ports, die ich über funk an
den Master sende.
...
Ja ich kann kir vorstellen, dass bei der entwicklung nicht daran gedacht
wurde, dass am i2c mehr als 127 Geräte hängen. Auxh ist man sicherlich
davon ausgegangen, im embedded fall immer die hardware vorher zu kennen.
Aber ware es nicht schön, wenn ich per stecker i2c module anschliesse
und dann die id des moduls, sagen wir mal id5675 = temp sensor, auslese
und dynamisch entsprechenden code nutze. Okay, ich glaube das ist im
embedded bereich noch nicht der fall. Woanders aber meines Erachtens
eigentlich Standard (USB...)
Wie wäre es mit dem 1-wire DS2408 8 Port GPIO Expander, der hat eine
Seriennummer an Board, die man auslesen kann. Man kann mehrere an einem
Bus verwenden.
Und mit 1-wire hast Du dann wieder einen Port frei :-)
bau zusätzlich zum PCA9505 einen LM75 auf jedes Modul
(mit gleicher Adress-Kodierung wie der PCA)
such beim init zuerst per I2C nach dem LM75 und falls es gefunden wird,
handelt es sich um die 40 Kanal-Version
Gruss Uwe
Nur so eine Idee ...
Wenn du lesend auf ein Register außerhalb der MCP23017 Register ( 00-1A
) zugreifst müstest du einen Fehler bekommen.
Ergo hast du einen PCA9505 angeschlossen.
Jörg schrieb:> Woanders aber meines Erachtens> eigentlich Standard (USB...)
I2C ist aber deutlich älter als USB.
Das ist einer der wenigen Dinge, die mir an USB gefallen (neben dem
Speed natürlich). Das sich Geräte beim Host identifizieren, wer sie
sind. Abgesehen davon (und dem Speed natürlich) ist mir eine normale
RS232 trotzdem 100 mal lieber. Solange USB gut funktioniert, ist alles
paletti. Aber wehe die Automatik versagt oder der Treiber hat eine
Macke. Dann steht man im Regen. So wie bei allen Automatiken, wenn man
keine Möglichkeit hat händisch einzugreifen oder der reine Vorgang des
Eingreifens schon Expertenwissen benötigt.