Hallo
habe mir ein kleines Board mit PCA9544 zugelegt. Möchte mehrere
Temperaturen in verschiedenen Zimmern auslesen. Leider sind die
Adressen alle gleich. Beim PCA9544 können ja mehrere Sensoren mit
gleicher Adresse angeschlossen werden. Das Datenblatt habe ich versucht
zu lesen und zu verstehen. Leider hat das nicht geklappt.
Hat jemand ein paar Infos dazu oder ein Beispiel an dem ich lernen kann?
Verwende einen Atmega 128 und arbeite mit C.
LG Mark
Mark schrieb:> Habe ein Bild zu Thema gefunden. Vielleicht hilft das weiter
Ich dachte du bist derjenige der Hilfe braucht??
Hab ich wohl falsch verstanden.
Georg
Das ist auch so. Habe im Netz nach Info gesucht. Leider ohne (kaum)
grossen Erfolg. Das Bild habe ich dabei gefunden. Nach Datenblatt
verfügt der PCA9544 über A0, A1, und A2 zur Einstellung der Adressen.
Damit hat sich aber mein Wissen zu diesem ICs fast erschöft. Vielleicht
kannst du mir weiterhelfen?
Was ich bei diesem IC nicht verstehe, wie kann ich einen zweig auswählen
und danach die Adresse der Sensors übertragen und die Daten auslesen.
Das mit dem Bus ist ansonsten kein Problem
1
i2c_start(adr1_w);// Schreibbefehl
2
i2c_write(0xff);// Alle Pins des PCF auf 0
3
i2c_stop();
Hebes bei den einfachen ICs z.B. den PCF.. so gemacht. Brauche jetzt
aber 2 Adressen. Die vom PCA und die vom angeschlossenen IC auf dem
Zweig.
Wie mach ich das?
Vorrausgesetzt adr1_w ist korrekt, würdest du jetzt mit diesem Code 0xff
ins control-register schreiben.
Schau mal in Tabelle 4 vom Datenblatt, was du schreiben musst, damit du
einen Ausgang aktivierst.
Hier mal ein Link zum Datenblatt:
https://www.nxp.com/docs/en/data-sheet/PCA9544A.pdf
Seite 12 sollte wegen der Beschaltung auch beachtet werden.
Der Rest steht im Datenblatt.
Die Umsetzung leider nicht.
Den Programmcode selber machen oder andere fertige Librarys verwenden.
Mark schrieb:> Hebes bei den einfachen ICs z.B. den PCF.. so gemacht. Brauche jetzt> aber 2 Adressen. Die vom PCA und die vom angeschlossenen IC auf dem> Zweig.> Wie mach ich das?
Genauso wie es hier im (sieher Bild )steht.
Wenn ich das richtig sehe muss ein 16 Bit Wort übertragen werdeb. Das
besteht aus der Slave Adresse (wridt) und dem Inhalt des
Controllregisters.
Im Controllregister mus die Adresse des verwendeten Ausganges angegeben
werden. Die Auswahl steht in Tabelle 4. Die Adresse des Ausganges wird
mit B1, B2 B4 angegeben.
es steht dort
Control register: Write — channel selection; Read — channel status
was ist damit gemeint?
Mit Int0 bis Int3 wird das Interrupt eingestellt.
Stimmt das soweit?
Muss ich die verwendet Adresse des Ausganges nur einmal senden und kann
dann Daten übertragen ohne eine ständige Angabe der Adress des
Ausganges?
Nach euren Angaben habe ich mir die Tabellen 4 und 5 noch mal genau
angesehen.
Als Adressen:
224 – 0xe0
226 – 0xe2
228 – 0xe4
230 – 0xe6
232 – 0xe8
234 – 0xea
236 – 0xec
238 – 0xea
1
adr1_w=0xe0
2
i2c_start(adr1_w);// Start i2C mit Adresse Slave
3
i2c_write(0x14);// Sende Daten
4
i2c_stop();
Wenn diese Daten zum PCA übertrage steht er auf der Adresse 0xe0,
Channel 0, Interrupt channel 0.
Die Angaben habe ich den Tabellen entnommen. Sehe ich das so richtig?
> Nach Datenblatt verfügt der PCA9544 über A0, A1, und A2 zur Einstellung der >
Adressen.
... seiner Adresse...
Man kann also bis zu acht dieser Bausteine an einem I²C-Bus betreiben,
ohne dass sie sich stören.
Mark schrieb:> Das besteht aus der Slave Adresse (wridt) und dem Inhalt des> Controllregisters.
Die Slave-Adresse ist die des Multiplexers.
Das Datenwort bestimmt, auf welchen Kanal geschaltet werden soll.
Mark schrieb:> Wenn ich das richtig sehe muss ein 16 Bit Wort übertragen werden.> Das> besteht aus der Slave Adresse (wridt) und dem Inhalt des> Controllregisters.
Jein, das erste Byte ist die Adresse des Multiplexers, wie sie immer
nach einer Start-Condition notwendig ist, damit der Empfänger weiß, dass
er gemeint ist. Es sind zwei Bytes, kein 16Bit Wort - das Bus ist
byteorientiert.
> Im Controllregister mus die Adresse des verwendeten Ausganges angegeben> werden. Die Auswahl steht in Tabelle 4. Die Adresse des Ausganges wird> mit B1, B2 B4 angegeben.> Es steht dort>> Control register: Write — channel selection; Read — channel status>> was ist damit gemeint?
Damit wird überprüft, ob der Kanal richtig geschaltet wurde.
> Mit Int0 bis Int3 wird das Interrupt eingestellt.> Stimmt das soweit?
Ja.
> Muss ich die verwendet Adresse des Ausganges nur einmal senden und kann> dann Daten übertragen ohne eine ständige Angabe der Adress des> Ausganges?
Der Multiplexer behält den Zustand bei, bis er über den Zugriff auf das
Controlregister geändert wird.
Mark schrieb:> Möchte mehrere> Temperaturen in verschiedenen Zimmern auslesen.
Nicht mit einem Bus, der für die Geräte interne Verbindung vorgesehen
ist.
Da bekommst du noch ganz andere Probleme.
Mark schrieb:> Wenn diese Daten zum PCA übertrage steht er auf der Adresse 0xe0,> Channel 0, Interrupt channel 0.> Die Angaben habe ich den Tabellen entnommen. Sehe ich das so richtig?
Nicht ganz die Adresse deines PCA9544 ist entweder:
Schreiben mit 0xe0 oder Lesen mit 0xe1 wenn A0, A1, A2
gegen GND geschaltet sind.
Danach die die Daten zum einstellen Schreiben oder Daten lesen senden.
Welche Temperatursensoren werden den von dir verwendet?
Habe es noch nicht genau festgelegt. Bin noch in der Genehmigungsphase
zur Bauart mit meiner besseren Hälfte. Wenn es nach Ihr geht darf so
wenig wie möglich zu sehen sein. Würde es gern etwas grösser auslegen um
es auch einbauen zu können. Suche den Typ raus was ich gern hätte.
Mark schrieb:> adr1_w = 0xe0> i2c_start(adr1_w); // Start i2C mit Adresse Slave> i2c_write(0x14); // Sende Daten> i2c_stop();
Leider funktionier das Stück nicht. Habe auf Channel 0 eine Display
eingesteckt und wollte es damit ansteuern. Geht leider nicht. Da ist
noch was falsch.
LG Mark
Mark du bist Lustig!
Irgendwie habe ich den Eindruck, das du von der Materie I²C-Bus keine
Ahnung hast.
Mark schrieb:> Habe auf Channel 0 eine Display> eingesteckt und wollte es damit ansteuern
Was hilft dir da ein Display? Ist es denn wenigstens I²C Tauglich?
Selbst wenn du den PCA9544 richtig eingestellt hast musst du ja
noch zum Sensor oder Display dessen Adresse senden und Daten zum
Lesen /Schreiben mitteilen.
Ist wohl logisch, das sich da nichts tut.
Welche Library verwendest du und von wem?
Sorry habe vergessen zu sagen das es PCF8574 mit einem Display dran ist.
Ist ebenfalls alles I2C Bus tauglich. Ohne den PCA9544 kann ich das
Display mit dem Bus ansteuern. Mit dem PCA9544 leider nicht.
Wie muss das aussehen, den PCF8574 über den PCA9544 anzusteuern?
ohne Ansteuerung über den PCA läuft das Programm ohme Probleme. Da ich
die Adresse auslesen kann funktioniert der Aufbau mit dem PCA und
auslesen.
Der Bus läuft ohne jede Probleme auf ca. 10 anderen Modulen. Das
Programm was ich als Beispiel verwende ist ein Bus Scanner zum Auslesen
der Adresse. Läuft ohne Probleme. init und alles was nötig ist ist drn.
Mark schrieb:> Mit den Widerständen hattest du recht. Es müssen welche vorher und> welche danach an jeden Channel. Damit klappt es.
Deswegen wurdest du auch gebeten, mal einen Plan deiner Schaltung zu
posten.
Das ist nämlich ein Kommunikationsmittel, das in diesem Forum von den
meisten verstanden wird.
Das Thema WIderstände ist im Datenblatt beschrieben - lerne es zu lesen
(dazu gehört auch, es zu verstehen, und wenn nicht, Fragen zu den
Stellen zu stellen, die du nicht verstanden hast).
Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.
Wichtige Regeln - erst lesen, dann posten!
Groß- und Kleinschreibung verwenden
Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang