PCA 9544 - wer kennt sich aus?

achim S.

Premium Benutzer
16 Jan 2010
485
7
18
Nähe Basel
Sprachen
C
Hallo
habe mir vor kurzem ein kleines Board mit dem PCA9544 zugelegt. Damit kann ich nach Angabe des Herstellers von einem I2C Bus auf 4 Channel gehen. Dadurch kann ich z.B. bei Sensorem die gleiche Adresse verwendet werden. Soweit so gut. Und begann das Problem. Leider ist im Netz so gut wie nichts zu finden. Auch in anderen Foren nachgefragt. Kaum was zu bekommen. Habe mir das Datenblatt vorgenommen und selber was versucht. Wenn ich es rechtig verstanden habe sind das die Schreibadressen:

224 – 0xe0
226 – 0xe2
228 – 0xe4
230 – 0xe6
232 – 0xe8
234 – 0xea
236 – 0xec
238 – 0xea

Ich habe mal das DB angefügt und daraus verschiedene Tabellen zur Einstellung.

Figur 5 - Slave Adresse PCA
Figur 6 - Controllregister mit Einstellung des gewählten Channels
Tabelle 5 - Einstellung Interrupt
Tabelle 4 - Auswahl des Ausgang Channels


CodeBox C und C++
i2c_start(0xe2);  // Start i2C mit Adresse Slave
   i2c_write(0x14);  // Sende Daten
   i2c_stop();

Habe es mal mit diesem Stück Code probiert. eingestellte Adresse 0xe2, Ausgangschannel 0, Interrupt 0. Die Angaben nach Anleitung vom DB gemacht. Leider ohne Erfolg
Hat jemand eine Idee dazu?

achim
 

Anhänge

Dirk

Administrator
Teammitglied
28 Jan 2007
4.252
135
63
Mittelhessen, Giessen
Sprachen
C, Assembler, Pascal, C++, PHP, Java
Hallo Achim,

du hast die Adresspins in diesem Zustand (mindestens pullup oder pulldown, nicht floatend) ...

A2 = 0
A1 = 0
A0 = 1

?


Noch ein Hinweis:
Beim Schreiben veränderst du nur die Bits B2..0. Wenn du 0x14 schreibst, adressierst du auch Bits ausserhalb B2..0, was allerdings keine Wirkung hat.

Dirk :ciao:
 

achim S.

Premium Benutzer
16 Jan 2010
485
7
18
Nähe Basel
Sprachen
C
Hallo Dirk
wenn ich die Figur 6 richtig verstanden habe bedeutet:

B0 - Auswahl Channel - 0- beide 0 ist Channel 0 gewählt
B1 - Auswahl Channel - 0
B2 - enable Bit immer 1 damit der Ausgang eingeschaltet ist
B3 - frei (0 oedr 1)
B4 - Auswahl Interrupt - 1
B5 - 0
B6 - 0
B7 - 0

das müste 00010100 ergeben, umgerechnet sind das 0x14. Damit sollte die Einstellung des Channels 0 und freigabe erfolgen.
Ich verwende die Adresse wie du gesagt hast. Habe vorher noch einen Scanner drüber laufen lassen und die 0xe0 ermittelt. Wenn die Adresse ausgelesen wurde muss der Bus funktionieren.
Doch was ich genau übertragen damit etwas durch den PCA9544 am Channel 0 angesteuert wird?

achim
 

Dirk

Administrator
Teammitglied
28 Jan 2007
4.252
135
63
Mittelhessen, Giessen
Sprachen
C, Assembler, Pascal, C++, PHP, Java
Du adressierst ja in deinem Beispiel mit 0xE2, dein Scanner hat 0xE0 ermittelt?!
Dies passt irgendwie nicht.
Sind die Hardware Adresspins wirklich auf 0xE2 eingestellt?


Für Channel 0 enabled müsstest du 0x04 bertragen, so wie ich es verstehe

B2 = 1 (enabled)
B1..0 = 00 (Channel 0)

Schreiben kannst du nur die Bits B2..0.
Da du 0x14 schreibst, sollte Channel 0 enabled sein (low nibble 0x04 hat Wirkung high nibble 0x10 allerdings nicht).

B7..3 finde ich nicht, du meinst wahrscheinlich die Bits INT3..0 zum Lesen.
 

achim S.

Premium Benutzer
16 Jan 2010
485
7
18
Nähe Basel
Sprachen
C
Sorry, hatte es zum testen geändert und nicht zurück genommen. Ermittelte Adresse vom PCA9544 ist 0xe0 und eingestellt durch A0-A2 auf 3xLow = 0xe0. Ohne die die Angabe Int3..0 ergibt sich 0x04. Damit kommt aber auch nichts
 

Dirk

Administrator
Teammitglied
28 Jan 2007
4.252
135
63
Mittelhessen, Giessen
Sprachen
C, Assembler, Pascal, C++, PHP, Java
Deine I2C Signale sollten dann eigentlich mit dem Channel 0 Bus verbunden sein.

SDA <---> SD0
SCL <---> SC0

Also Adresspins A2..0 = 000
Schreibadresse 0xE0 (8bit, Schreibbit = 0)

Weitere Ideen habe ich im Moment leider nicht.

(der PCA9544 ist echt interessant)
 

achim S.

Premium Benutzer
16 Jan 2010
485
7
18
Nähe Basel
Sprachen
C
Hallo Dirk
Hatte die Hoffnung das ich was im Datenblatt übersehen hatte. Kann leider das Datenblatt nur mit übersetzer lesen. Ist aber nicht google. der ist viel zu blöd. Im Netz findest so gut wie nichts dazu. Meistens kommt nur so blöde Bemerkunden, wo ich ein Komma vergessen habe oder so. Bei Arduino gibt es was doch, leider versteh ich es nicht.
Meine Gedanken waren zu Anfang so:

- Adresse angeben vom PCA9544
- Adresse Channel 0 verschalten und enable einschalten. Damit müsste der Bus mit dem Bus von Channel 0 verbunden sein. Channel bleibt offen solange Spannung oder Channel umgeschaltet wird
- damit müsste der PCA und der PCF am Bus liegen und erreichbar sein, wie üblich,

Habe den Scanner am laufen, erst das Display direkt am Atmega, wenn Adresse ermittelt ist stecke ich das Display auf Channel 0. Wenn die Ansprache des PCA korrekt ist müsste der Scanner über den PCA laufen. Da das init LCD auch nicht geht wird der PCF nicht gesehen.
Habe ich da einen Denkfehler?

achim
 

Dirk

Administrator
Teammitglied
28 Jan 2007
4.252
135
63
Mittelhessen, Giessen
Sprachen
C, Assembler, Pascal, C++, PHP, Java
Wenn du die Adresse von deinem Display kennst, dann an Channel 0 anschließen.
Dein Programm schaltet beim PCA9544 Channel 0 an und aktiv. Dann solltest du wie gewohnt dein Display ansteuern können, wenn dieses an SD0/SC0 angeschlossen ist.

Pullup-Widerstände
  • zwischen Master MC und PCA9544 und
  • zwischen PCA9544 und Display
 

achim S.

Premium Benutzer
16 Jan 2010
485
7
18
Nähe Basel
Sprachen
C
Hallo Dirk
habe noch ein zusätzliches Modu auf den Bus gehängt vor dem PCA mit schaltbaren Widerständen. Damit läuft das Display sofort an und das Programm läuft so wie es soll. Haben als die 5V auf dem Bus zum Prozessor gefehlt. Noch einige testen was die anderen in der Zeit machen. Vielen Dank für deine Hilfe.
Eine Frage bleibt noch. Was machen die Interrups bei diesem IC oder weiter zum Prozessor?
achim
 

Pirx

Mitglied
15 Aug 2009
271
10
18
Möckern
Sprachen
Assembler
Hallo Achim,

so wie ich das Datenblatt verstehe, passiert folgendes, wenn ein Interrupt ausgelöst wird (durch INT0, INT1, INT2 oder INT3 auf 0) :
- die Adresse der Interruptquelle (also INT0, INT1, INT2 oder INT3) wird in den I2C-Controller übernommen
- der INT-Ausgang geht auf 0

Bei einem INT-Signal kann der den PCA steuernde Controller die Adresse der Interruptquelle aus dem PCA lesen und entsprechend reagieren. Praktisch können damit zum Beispiel die I2C-Module an SCx/SDx dem den PCA steuernden Controller etwas signalisieren.

Edit:
Laut Tabelle 5 wird ein Interrupt durch "1" an INTx ausgelöst. Über der Tabelle steht jedoch : "If unused, interrupt inputs must be connected to VDD through a pull-up resistor.", was nach einen low-aktiven Eingang aussieht. Und am Blockschaltbild steht INT(3:0) mit einem Strich darüber, was ebenfalls low-aktiv bedeutet. Da bleibt wohl nur ein Test ....

Gruß
Pirx
 
Zuletzt bearbeitet:

TommyB

Premium Benutzer
17 Mai 2010
2.001
74
48
35
127.0.0.1 ;)
Sprachen
Assembler, LunaAVR, VB.Net, Python, C#
:offtopic:
zumindest mehr oder weniger.

Ich hatte bisher nur was mit dem PCA 9516 gemacht.
Vorteile:
* Der ist auch bei 3.3Vcc tolerant gegenüber 5V Bussen (ich nutze den als "Pegelwandler" / "Sicherung" am RasPi)
* Der belegt keine eigene Busadresse
Nachteile:
* Da keine eigene Busadresse nutzt er 4 Pins für die Auswahl des Busses. Lustigerweise ja, 4. 1 Pin für jeden Bus. Man könnte also auch "Broadcasten" wenn man will, oder den Chip deaktivieren. Afaik ergibt dies allerdings bei I2C keinen Sinn.

https://www.makerconnect.de/index.php?threads/raspberry-pi.2948/page-6#post-35417

Nur der Vollständigkeit halber, falls wer mal Multiplexer sucht und hier landet.
 

achim S.

Premium Benutzer
16 Jan 2010
485
7
18
Nähe Basel
Sprachen
C
Habe es geschafft. Kann jetzt bis zu vier verschiedenen Modulen an einem Bus mit gleicher Adresse betreiben. Es ist leichter zu machen als ich dachte. Eigentlich steht alles im Datenblatt, man muss nur lesen können und ein wenig Programm dazu.


CodeBox C und C++
i2c_start(0xe0);  // Start i2C mit Adresse Slave PCA9544
       i2c_write(0x04);  // Sende Daten Cha 0
       //i2c_write(0x05);  // Sende Daten Cha 1
       //i2c_write(0x06);  // Sende Daten Cha 2
       //i2c_write(0x07);  // Sende Daten Cha 3
       i2c_stop();

Mit diesem Code kann ich zwischen den einzelnen Channel umschalten. Habe sgleich mit den Möglichkeiten angegeben. Man muss nur drauf achten das vor jedem Aufruf eines anderen Channels die richtige Einstellung gemacht werden muss.
achim
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)