PCA 9544 - mehrere Temperatuen lesen

Gast #5508365
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
Gast #5508429
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?
Gast #5509381
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?
Gast #5509476
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?
Gast #5509752
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.
Gast #5509762
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?
Gast #5509866
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
Gast #5509942
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?
Gast #5510028
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.
Gast #5510088
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.
Gast #5510280
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).

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren