PCA 9544 - wer kennt sich aus?

Dieses Thema im Forum "Software" wurde erstellt von achim S., 4. August 2018.

  1. achim S.

    achim S. Mitglied

    Registriert seit:
    16. Januar 2010
    Beiträge:
    401
    Zustimmungen:
    6
    Punkte für Erfolge:
    18
    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:

  2. Dirk

    Dirk Administrator
    Mitarbeiter

    Registriert seit:
    28. Januar 2007
    Beiträge:
    4.198
    Zustimmungen:
    119
    Punkte für Erfolge:
    63
    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:
     
  3. achim S.

    achim S. Mitglied

    Registriert seit:
    16. Januar 2010
    Beiträge:
    401
    Zustimmungen:
    6
    Punkte für Erfolge:
    18
    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
     
  4. Dirk

    Dirk Administrator
    Mitarbeiter

    Registriert seit:
    28. Januar 2007
    Beiträge:
    4.198
    Zustimmungen:
    119
    Punkte für Erfolge:
    63
    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.
     
  5. achim S.

    achim S. Mitglied

    Registriert seit:
    16. Januar 2010
    Beiträge:
    401
    Zustimmungen:
    6
    Punkte für Erfolge:
    18
    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
     
  6. Dirk

    Dirk Administrator
    Mitarbeiter

    Registriert seit:
    28. Januar 2007
    Beiträge:
    4.198
    Zustimmungen:
    119
    Punkte für Erfolge:
    63
    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)
     
  7. achim S.

    achim S. Mitglied

    Registriert seit:
    16. Januar 2010
    Beiträge:
    401
    Zustimmungen:
    6
    Punkte für Erfolge:
    18
    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
     
  8. Dirk

    Dirk Administrator
    Mitarbeiter

    Registriert seit:
    28. Januar 2007
    Beiträge:
    4.198
    Zustimmungen:
    119
    Punkte für Erfolge:
    63
    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
     
  9. achim S.

    achim S. Mitglied

    Registriert seit:
    16. Januar 2010
    Beiträge:
    401
    Zustimmungen:
    6
    Punkte für Erfolge:
    18
    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
     
  10. Pirx

    Pirx Mitglied

    Registriert seit:
    15. August 2009
    Beiträge:
    266
    Zustimmungen:
    8
    Punkte für Erfolge:
    18
    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
     
    #10 Pirx, 5. August 2018
    Zuletzt bearbeitet: 5. August 2018
  11. TommyB

    TommyB Premium Benutzer

    Registriert seit:
    17. Mai 2010
    Beiträge:
    1.725
    Zustimmungen:
    58
    Punkte für Erfolge:
    48
    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.
     
  12. achim S.

    achim S. Mitglied

    Registriert seit:
    16. Januar 2010
    Beiträge:
    401
    Zustimmungen:
    6
    Punkte für Erfolge:
    18
    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
     
  13. achim S.

    achim S. Mitglied

    Registriert seit:
    16. Januar 2010
    Beiträge:
    401
    Zustimmungen:
    6
    Punkte für Erfolge:
    18
    Sprachen:
    C
    Für alle Neugierigen erst mal die Hardware
     

    Anhänge:

  • Über uns

    Unsere immer weiter wachsende Community beschäftigt sich mit Themenbereichen rund um Mikrocontroller- und Kleinstrechnersysteme. Neben den Themen Design von Schaltungen, Layout und Software, beschäftigen wir uns auch mit der herkömmlichen Elektrotechnik.

    Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  • Coffee Time

    Unser makerconnect-Team arbeitet hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und unser eigener makerconnekt-Server regelmäßig gewartet wird. Wir nehmen das Thema Datensicherung und Datenschutz sehr ernst und sind hier sehr aktiv, auch sorgen wir uns darum, dass alles Drumherum stimmt!

    Dir gefällt das Forum und die Arbeit unseres Teams und du möchtest es unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft, unser Team freut sich auch über eine Spende für die Kaffeekasse :-)
    Vielen Dank!
    Dein makerconnect-Team

    Spende uns! (Paypal)
  1. Diese Seite verwendet Cookies, um Inhalte zu personalisieren und die Seite optimal für dich anzupassen. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden