Forum: Mikrocontroller und Digitale Elektronik PCA 9544 - mehrere Temperatuen lesen


von Mark (Gast)


Lesenswert?

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

: Verschoben durch User
von yesitsme (Gast)


Lesenswert?

Wo hängts denn?

von Mark (Gast)


Angehängte Dateien:

Lesenswert?

Habe ein Bild zu Thema gefunden. Vielleicht hilft das weiter

von georg (Gast)


Lesenswert?

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

von Mark (Gast)


Lesenswert?

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?

von Mark (Gast)


Lesenswert?

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?

von yesitsme (Gast)


Lesenswert?

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.

von nix weis aber viel (Gast)


Lesenswert?

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.

von nix weis aber viel (Gast)


Angehängte Dateien:

Lesenswert?

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.

von Mark (Gast)


Lesenswert?

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?

von Mark (Gast)


Lesenswert?

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?

von STK500-Besitzer (Gast)


Lesenswert?

> 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.

von nix weis aber viel (Gast)


Lesenswert?

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?

von Mark (Gast)


Lesenswert?

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

von nix weis aber viel (Gast)


Lesenswert?

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?

von Mark (Gast)


Lesenswert?

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?

von Mark (Gast)


Lesenswert?

1
ret = i2c_start(adr1_w);        // Start i2C mit Adresse Slave
2
  i2c_write(0x00);            // Sende Daten
3
  i2c_stop();                // I2C Stop
damit teste ich ob ob was an der angegeben Adresse angeschlossen ist.
1
lcd_command(LCD_CLEAR);        // Leere Display
2
    _delay_ms(2);                // Warte 2ms
3
    lcd_printlc(1,3,"Display 1 ist ");    // Ausgabe Text
4
    lcd_printlc(2,5,"OK !!!!!");    // Slave OK
5
    lcd_printlc(4,1,"Adresse:");    // Slave OK
damit vesnde ich Daten an das Display zur Ausgabe der Schrift.
Ich verwende die Datein von Peter und habe beretis mehrere ICs im Bus 
angesteuert.

von yesitsme (Gast)


Lesenswert?

1. Schaltplan?
2. Foto vom Aufbau?
3. Braucht das LCD nicht noch sowas wie ein lcd_init()?
-> Einmal einen kompletten Code anhängen

von Mark (Gast)


Lesenswert?

1
int main(void)
2
  {
3
  cli();                             // Interrupts deaktiviert
4
  i2c_init();                        // Starte I2C Bus
5
  
6
  i2c_start(0xe0);  // Start i2C mit Adresse Slave
7
  i2c_write(0x14);  // Sende Daten
8
  i2c_stop();
9
  
10
  
11
  
12
  lcd_init();                        // Starte I2CLCD    
13
  // Display Befehle
14
  lcd_command(LCD_DISPLAYON | LCD_CURSOROFF | LCD_BLINKINGOFF);
15
  lcd_light(0);              // Licht an
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.

von STK500-Besitzer (Gast)


Lesenswert?

Wenn du das Display hinter den PCA9544 hängst, hast du dann auch die 
Pull-Up-Widerstände am Bus?
Kannst du das Control-Register des PCA auslesen?

von Mark (Gast)


Lesenswert?

Mit den Widerständen hattest du recht. Es müssen welche vorher und 
welche danach an jeden Channel. Damit klappt es. Danke für eure Hilfe

LG Mark

von STK500-Besitzer (Gast)


Lesenswert?

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).

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.