Forum: Mikrocontroller und Digitale Elektronik Zwei PCF8574 am Arduino Code Adressierung


von Udo S. (Firma: allround) (1udo1)


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

von Εrnst B. (ernst)


Lesenswert?

https://github.com/MSZ98/PCF8574

Klingt komisch, ist aber so:
1
pinMode(expander1, 1, OUTPUT);

von Patrick C. (pcrom)


Lesenswert?

Foto und diagramm von die schaltung bitte
Wie meinst du Pin 1 ? Das ist A0.
Anfangen mittels code aus zu lesen welche I2C chips gefunden werden

Patrick aus die Niederlande

von Udo S. (Firma: allround) (1udo1)


Lesenswert?

@ pcrom,

es ist jeweils PIN 4, also P0 an den PCF8574 angeschlossen. Der Nano ist 
über SCL und SCK mit beiden PCF8574 verbunden.

@ ernst
Danke, ich probier den Code mal aus
1
pinMode(expander1, 1, OUTPUT);

von Arduino F. (Firma: Gast) (arduinof)


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.

von Patrick C. (pcrom)


Lesenswert?

Udo S. schrieb:
> es ist jeweils PIN 4, also P0 an den PCF8574 angeschlossen

Ich kenne die library nicht aber must dann nicht '0' statt '1' benutzt 
werden?
expander1.pinMode(0, OUTPUT);
expander1.digitalWrite(0, HIGH);

von Patrick C. (pcrom)


Lesenswert?

Udo S. schrieb:
> Der Nano ist über SCL und SCK mit beiden PCF8574 verbunden.
Bist du da ganz sicher von ?

von Udo S. (Firma: allround) (1udo1)


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 vom Autor gelöscht.
von Udo S. (Firma: allround) (1udo1)


Lesenswert?

habe mich verschrieben. SDA und SCL meinte ich natürlich....

von Arduino F. (Firma: Gast) (arduinof)


Lesenswert?

Udo S. schrieb:
> wo ich sie editieren muss, um die
> Fehlermeldung zu eliminieren.

Fehlermeldungen löschen ist keine gute Idee!

Udo S. schrieb:
> dass er unabhängig vom ersten PCF8575
> per Adresse angesteuert werden kann.

Wie hast du die Adresse am PCF8575 eingestellt?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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?

: Bearbeitet durch Moderator
von Steve van de Grens (roehrmond)


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

: Bearbeitet durch User
von Udo S. (Firma: allround) (1udo1)


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

von Steve van de Grens (roehrmond)


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

: Bearbeitet durch User
von Arduino F. (Firma: Gast) (arduinof)


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.

von Udo S. (Firma: allround) (1udo1)


Angehängte Dateien:

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.

von Steve van de Grens (roehrmond)


Angehängte Dateien:

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.

: Bearbeitet durch User
von Udo S. (Firma: allround) (1udo1)


Lesenswert?

Ich habe ein DIL IC. Lasse für 0x20 A0, A1, A2 offen und für 0x21 lege 
ich A0 auf "HIGH"

von Steve van de Grens (roehrmond)


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.

: Bearbeitet durch User
von Udo S. (Firma: allround) (1udo1)


Lesenswert?

Datenblatt hatte ich bisher nicht. Werde aber die Pins mal auf Potential 
legen.
Bleibt aber immer noch die passende Adressierung. Die wurde ja im 
Compiler angemeckert. Es gab ja einige Anregungen, was den Code angeht. 
Werde mal aus den vorausgegangenen Antworten die Vorschläge 
versuchsweise umsetzen.

von Arduino F. (Firma: Gast) (arduinof)


Lesenswert?

Udo S. schrieb:
> Bleibt aber immer noch die passende Adressierung. Die wurde ja im
> Compiler angemeckert.
Nein!

Udo S. schrieb:
> Datenblatt hatte ich bisher nicht.
Aua!

von Steve van de Grens (roehrmond)


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.

: Bearbeitet durch User
von Harald K. (kirnbichler)


Lesenswert?

Udo S. schrieb:
> Datenblatt hatte ich bisher nicht.

Da: https://www.ti.com/lit/ds/symlink/pcf8574.pdf

von Manfred P. (pruckelfred)


Lesenswert?

Steve van de Grens schrieb:
> Diese Vorgehensweise solltest du dir sofort abgewöhnen.

Na immerhin hat sich wieder mal ein Schwachkopf gefunden, der einen 
Link mit 420 Zeichen Lebenslauf anhängt und damit den Textumbruch im 
Browserfenster versaut.

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.