Zwei PCF8574 am Arduino Code Adressierung

(Firma: allround) #7647491
Lesenswert?

Hallo, ich möchte am Arduino zwei PCF8574 mit den Adressen 0x20 und 0x21 anschließen. An Pin 1 ist bei beiden PCF8574 jeweils nur eine LED angeschlossen. Sie sollen im Abstand einzeln mit einer Sekunde Pause auf HIGH und LOW angesteuert werden. Alle Versuche, den zwei PCF8574 die Adressen zuzuweisen, funktionieren nicht. Die unten aufgeführten Codes sind im Adafruit „PCF8574.h“ nicht implementiert. Es kommt die Meldung "class PCF8574' has no member named 'pinMode'"

Ich verstehe die Aussage nicht.

Kann jemand helfen?

1
PCF8574 expander1(0x20);     // PCF8574 an Adresse 0x20
2
PCF8574 expander2(0x21);     // PCF8574 an Adresse 0x21
3

4
expander1.pinMode(1, OUTPUT);  // PCF8574 Modul 1
5
expander2.pinMode(1, OUTPUT);  // PCF8574 Modul 1
6

7
// Set pin 1 on PCF8574 expander1 to HIGH (turn on LED)
8
expander1.digitalWrite(1, HIGH);    // PCF8574 Modul 1
9
expander2.digitalWrite(1, HIGH);    // PCF8574 Modul 2
(Firma: Gast) #7647511
Lesenswert?

Εrnst B. schrieb:

Klingt komisch,

Nur für C Jünger usw. Freunde des C++ kennen (mehrfach)überladene Funktionen und Methoden zur Genüge. Prominentes und wohl am häufigsten genutztes Arduino Beispiel: Print::print()

Udo S. schrieb:

ich probier den Code mal aus

Tipp: Wenn du ein Problem mit einer Arduino Lib hast, lohnt es sich deren Doku anzusehen. Und wenn das nicht hilft, gar in den Quellcode.

(Firma: allround) #7647525
Lesenswert?

Ja, das ist richtig. Die SDA und SCL, so ist es richtig, sind alle miteinander verbunden. Mit einem einzelnen PCF8574 und dem Nano funktionieren alle Ansteuerungen. Bloß will es nicht gelingen einen zweiten PCF8574 so einzubinden, dass er unabhängig vom ersten PCF8575 per Adresse angesteuert werden kann. Die Headerdatei habe ich mir angesehen. Kann aber nicht ersehen, wo ich sie editieren muss, um die Fehlermeldung zu eliminieren. So viel Kenntnisse habe ich nicht.

Beitrag #7647526 wurde von einem Moderator gelöscht.
Moderator (Firma: Titel) Persönliche Seite #7647531
Lesenswert?

Udo S. schrieb:

Bloß will es nicht gelingen einen zweiten PCF8574 so einzubinden, dass er unabhängig vom ersten PCF8575 per Adresse angesteuert werden kann.

Der "zweite" PCF reagiert gleich wie der "erste"?

Zeig doch mal deinen Schaltplan. Und ein brauchbares Foto vom Aufbau.

Mit einem einzelnen PCF8574 und dem Nano funktionieren alle Ansteuerungen.

Funktioniert mit einem einzelnen PCF auch die Adresse 21?

Gast #7647538
Lesenswert?

Udo S. schrieb:

// Set pin 1 on PCF8574 expander1 to HIGH (turn on LED)

Die PCF8574 haben Open-Drain Ausgänge mit etwa 50kΩ Pull-Up Widerstand. Sie können daher nur bei LOW Pegel einige Milliampere liefern. Beim HIGH Pegel fließt nur sehr wenig Strom, damit wird die LED nur schwach glimmen.

Schließe die LED anders herum an:

1
PCF8574 out o-----|<|---[===]---o +5V
(Firma: allround) #7647539
Lesenswert?

Fehlermeldungen habe ich nicht gelöscht. Habe verschiedene Codes versucht, nachdem ich diverse Beiträge, ob falsch oder richtig ausprobiert habe. Ich weiss es einfach nicht, wie ich die beiden PCF8574 adressieren muss, um die LEDs an den jeweiligen Ports zu steuern.....

1
PCF8574 expander1(0x20);     // PCF8574 an Adresse 0x20
2
PCF8574 expander2(0x21);     // PCF8574 an Adresse 0x21
Gast #7647540
Lesenswert?

1
/* PCF8574 does not support different pin modes. Input mode is just a HIGH state (high state is always pull-up). It also does not support pull-down. */
2

3
void pinMode(PCF8574 &expander, int pin, int mode) {
4
  if(mode != OUTPUT) digitalWrite(expander, pin, HIGH);
5
}

Die Aufrufe von pinMode() sind in diesem Programm also überflüssig.

Udo S. schrieb:

Ich weiss es einfach nicht, wie ich die beiden PCF8574 adressieren muss, um die LEDs an den jeweiligen Ports zu steuern.

Das hast du schon richtig gemacht. Aber die Zugriffe darauf musst du anders schreiben, nämlich so:

1
digitalWrite(expander1, 1, HIGH);
2
digitalWrite(expander2, 1, HIGH);

Mit der "1" sprichst du den Ausgang A1 an. Pin 1 ist jedoch der Ausgang A0.

Also wenn deine LED wirklich an Pin 1 hängt, dann musst du im Quelltext die "0" benutzen, nicht die "1":

1
digitalWrite(expander1, 0, HIGH);
2
digitalWrite(expander2, 0, HIGH);
(Firma: Gast) #7647547
Lesenswert?

Udo S. schrieb:

Ich weiss es einfach nicht, wie ich die beiden PCF8574 adressieren muss, um die LEDs an den jeweiligen Ports zu steuern.....PCF8574 expander1(0x20); // PCF8574 an Adresse 0x20 PCF8574 expander2(0x21); // PCF8574 an Adresse 0x21

Scheint doch so richtig zu sein. Nur am PCF8574 muss du die Adresse noch einstellen. Physikalisch, nicht im Code.

(Firma: allround) #7647554
Lesenswert?

Habe von +5V über Widerstand und die LED den Pin4, also P0, angeschlossen. Das funzt. Die LEDs leuchten am ersten PCF8564 wie gewünscht. Die angesteuerten LEDs, auch am zweiten PCF8574, leuchten aber synchron an beiden PCF8574, obwohl ich sie unabhängig ansteuern will. Aber es liegt an der Adressierung, die ich nicht auf die Kette kriege. Und wegen des falschen Codes kann ich keine andere Adresse, 0x21, einstellen. Standardmässig ist in der Headerdatei ja 0x20 eingetragen.

Angehängte Dateien:
Gast #7647565
Lesenswert?

Oh, ich sehe gerade, dass ich eben die Ausgänge irrtümlicherweise als A0 und A1 bezeichnet habe, aber sie heißen P0 und P1.

Udo S. schrieb:

Die angesteuerten LEDs, auch am zweiten PCF8574, leuchten aber synchron an beiden PCF8574, obwohl ich sie unabhängig ansteuern will.

Du musst eins der Module hardwaremäßig auf 0x21 konfigurieren, also dessen A0 Eingang auf HIGH legen. Solange du das nicht machst, fühlen sich beide Module unter der Adresse 0x20 angesprochen.

https://www.ti.com/lit/ds/symlink/pcf8574.pdf?ts=1713421172656&ref_url=https%253A%252F%252Fwww.ti.com%252Fproduct%252FPCF8574%253Futm_source%253Dgoogle%2526utm_medium%253Dcpc%2526utm_campaign%253Dasc-null-null-GPN_EN-cpc-pf-google-eu%2526utm_content%253DPCF8574%2526ds_k%253DPCF8574+Datasheet%2526DCM%253Dyes%2526gad_source%253D1%2526gclid%253DEAIaIQobChMInfTqm4_LhQMVJZ2DBx3WPgM0EAAYASAAEgJAm_D_BwE%2526gclsrc%253Daw.ds

Hast du so ein Modul mit drei gelben Jumpern verwendet? Dann stecke den A0 Jumper um.

Angehängte Dateien:
Gast #7647591
Lesenswert?

Udo S. schrieb:

Lasse für 0x20 A0, A1, A2 offen

Du musst die Pins mit HIGH oder LOW belegen, nicht "in der Luft" hängen lassen.

Das ergibt sich doch schon aus der Zeichnung auf Seite 1 im Datenblatt.

Weiterhin steht in den "Electrical Characteristics" dass dabei maximal 5 µA fließen, also ein Leckstrom. Wenn der Chip interne Pull-Down Widerstände hätte, würden diese Eingänge mindestens 100x so viel Strom aufnehmen. Weiterhin ist in der Tabelle "Address Reference" der Zustand Z (unbeschaltet) nicht vorgesehen.

Gast #7647609
Lesenswert?

Udo S. schrieb:

Datenblatt hatte ich bisher nicht

Diese Vorgehensweise solltest du dir sofort abgewöhnen.

Bleibt aber immer noch die passende Adressierung. Die wurde ja im Compiler angemeckert.

Auch da frage ich mich, wie man auf die Idee kommt, die Doku nicht zu lesen.

Es ist doch alles so leicht im Internet verfügbar !!!!!

Als ich mit dem Hobby anfing, musste man Briefe nach Japan schicken und auf Antwort hoffen. Nicht selten bekam man dann schlechte Kopien von Telefaxen, bei denen man froh sein konnte, wenn sie vollständig lesbar waren.

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