Forum: Mikrocontroller und Digitale Elektronik Raspberry Pi & PCF8574 wird nicht erkannt


von Julian (Gast)


Lesenswert?

Hallo,
Ich habe an mein Raspberry Pi über ein IDE-Kabel ein PCF8574 
angeschlossen. Wenn ich mit "i2cdetect -y 0" die angeschlossenen Geräte 
suchen möchte, dann finde ich keine Geräte. Bei i2cdetect -y 1 kommt bei 
der Adresse 3f der Wert 3f. Ich habe allerdings gelesen, dass der 2. I2C 
Bus gar nicht auf dem 26-pol Stecker liegt... Trenne ich die 
Stromversorgung, dann fällt auch dieser Wert weg und ich habe gar keine 
Geräte mehr.
Wenn ich dann "i2cdump -y 1 0x3f" benutze, bekomme ich eine 
2-dimensionale hexadezimale Tabelle, in der ein Großteil mit "XX" 
gefüllt sind und andere meistens den Adresswert besitzen oder teilweise 
1 senkrecht verschoben. Ich bezweifel, dass diese Werte irgendeinen Sinn 
haben.
Auffällig ist noch:
Die Adresse wechselt ständig. So zwischen 38 und 3f. Verbinde ich ein 
Adresspin oder ein I/O Pin mit einem Widerstand auf die 3,3V, dann 
ändert sich meistens ebenfalls nichts.

Ich habe ehrlich gesagt keine Ahnung, was genau schief läuft bzw. wo ich 
den Fehler suchen muss. Ich bin mir 100%ig sicher, dass ich das Ding 
richtig angeschlossen habe:
PCF - Pi
8 - 6
14 - 3
15 - 5
16 - 1

5V des Pis haben die gleichen Resultate gebracht.

Julian

von Jobst Q. (joquis)


Lesenswert?

0x38-0x3F ist die 7-Bitadresse vom PCF8574A. Der PCF8574 ohne A müsste 
über 0x20-0x27 ansprechbar sein.

Aber du hast wohl auch  SDA und SCL vertauscht: SDA ist Pin 15 am 
PCF8574 und Pin 3 am Pi. SCL ist Pin 14 am PCF8574 und Pin 5 am Pi.

von Harry L. (mysth)


Lesenswert?

http://rpp.it-livetalk.de/index.php?title=Belegung_des_GPIO-Connector
40-Pol. Kabel auf 26-Pol. Stecker.....ähh...peinlich!

von Lemming (Gast)


Lesenswert?

>40-Pol. Kabel auf 26-Pol. Stecker.....ähh...peinlich!
Na ja, es gibt Naturen die knoten sich ihren Strick selber.

von Julian (Gast)


Lesenswert?

Da habe ich wohl hier 2 Pins vertauscht, der Aufbau war richtig. Ich 
habe sie testweise mal gewechselt und dann habe ich erneut kein Chip 
mehr angezeigt bekommen. Also SDA Pin 15 ist beim Pi an 3 und SCL, Pin 
14 an Pin 5 beim Pi.
Um genau zu sein, habe ich auch ein PCF8574AP. Hat das P da noch etwas 
zu sagen? Im Datenblatt werde ich da nicht so richtig schlau zu, da 
finde ich nur die mit A und die ohne.

Woran könnte es sonst noch liegen? Kann es sein, dass das IDE-Kabel in 
Kombination mit dem Entwicklungsboard, auf dem der PCF8574AP sitzt evtl. 
zu störanfällig ist?

Ich benutze momentan das 40-pol-IDE-Kabel, weil ich kein 26-pol-Kabel 
habe. Mir ging es erstmal darum, überhaupt einmal diesen I2C-Bus mit dem 
PCF8574AP zum Laufen zu bringen. Wenn das soweit klappt, dann kommt da 
auch ein richtiges Kabel hin und richtige Platinen und und und...

von Jobst Q. (joquis)


Lesenswert?

Das P ist nur die Gehäuseform (DIP).

Wie hast du die 3 Adresspins angeschlossen? Sie müssen klar entweder auf 
GND oder VCC liegen. Wenn das IC mal als 0x38 und mal als 0x3F angezeigt 
wird,könnte das auf offene Pins hindeuten.

von Julian (Gast)


Lesenswert?

Ich dachte es mir ja fast... aber in den Anleitungen, die ich fand, 
wurde das nie genannt... Danke für den Hinweis!

Jetzt habe ich sie alle auf 1 und bekomme die 3f raus. Ich schaffe es 
sogar, mit i2cset den ersten Port ein und auszuschalten. Allerdings nur 
diesen einen Port. Alle anderen werden komplett ignoriert. Befehl ist 
folgender:
sudo i2cset -y 1 0x3f 0x01 0x01
Wenn ich die Spannung auf diesen Port messe wird mir keine angezeigt. 
Die LED hinter einem Transistor reagiert ebenfalls nicht darauf. 
Gleicher Aufbau für Port 0 funktioniert.

2. Frage, wenn ich die I/O-Ports als Eingänge benutzen möchte, wie 
erreiche ich das? Wenn ich mit i2cget abfrage bekomme ich bei allen 
Ports jeweils deren Adresse zurück. Auch beim 0. Port, wenn er 
eingeschaltet ist.

von Rene S. (Firma: BfEHS) (rschube)


Lesenswert?

Womit programmierst du?

Hier ist ein ordentlich erklärtes und funktionierendes Beispiel
in Python:
-> 
http://www.rpiblog.com/2012/07/interfacing-16x2-lcd-with-raspberry-pi.html

und hier in C:
-> http://www.roboternetz.de/community/threads/59420-Raspberry-Pi-I2C

oder auf der Console:
-> http://kampis-elektroecke.de/?page_id=2035

Eigentlich kannst du auch google benutzen, kostet nichts :)
Grüße aus Berlin

von Julian (Gast)


Lesenswert?

Okay, so langsam habe ich es glaube ich auch. Ich hatte das ganze etwas 
falsch verstanden ;)
Mit
i2cset -y 1 0x00 0xXX
setze ich die Outputs XX ist hexadezimal und steht binär für die 
verschiedenen Ausgänge.

Jetzt ist meine Frage: Welche Register muss ich denn ansprechen, um die 
I/O als Input oder Output zu definieren? Und mit welchem Register kann 
ich die Inputs dann abrufen? Aus deinen Anlagen bin ich da leider nicht 
mehr schlau geworden...

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

Meine Güte, dann les das Datenblatt!
Das gibts nich umsonst...

von isnah (Gast)


Lesenswert?

Beim PCF8574 musst du den Port nicht speziell als input oder output 
definieren, das geschieht über das R/W-Bit im I2c-Befehl.
Lies den Beitrag:
 http://kampis-elektroecke.de/?page_id=2035
den dir schon rschube ans Herz gelegt hat durch.

von Julian (Gast)


Lesenswert?

Okay, danke für die Hilfe. Ich glaube, jetzt habe ich es verstanden...

von André A. (qwerty1234)


Lesenswert?

Hi Leute,

ich hätte auch mal eine Frage bezüglich des PCF8574.
Ich habe folgenden Code verwendet um digitale Signal einzulesen
und auszugeben :

#include <iostream>
#include "wiringPi/wiringPi.h"
#include "wiringPi/pcf8574.h"

using namespace std;

#define BASE_I2C        0x80

int main (void)
{
    wiringPiSetup(); // initialise wiringPi
    pcf8574Setup(BASE_I2C, 0x38); // initialise PCF8574

    for (int i = 0 ; i < 7 ; ++i) // define remaining GPIOs as output
    {
         pinMode(BASE_I2C + i, OUTPUT);
    }

    while (1)
    {
         digitalWrite(BASE_I2C + 7, 1); // P7 EIN
         delay(500); // 500µs warten

         digitalWrite(BASE_I2C + 7, 0); // P7 AUS
         delay(500); // 500µs warten

    }
    return 0;

}


Mit einem PCF8574 funktioniert das alles einwandfrei.
Ist aber möglich mehrere PCF8574 über diesen Code bzw. eingebundenen 
Header zu verwenden. Ich komme da auf keine Lösung.

Ich bin dankbar für jede Lösung.

Gruß

von Jobst Q. (joquis)


Lesenswert?

Jeder pcf8574 braucht seine eigene Adresse,die mit seinen 3 Adresspins 
eingestellt wird.

Du hast jetzt 0x38 als (7Bit-)Adresse, das ist die Grundadresse vom 
pcf8574A. Wenn du weitere pcf8574A hast, wären die nächsten Adressen 
0x39 bis 0x3F. Dann kannst du außerdem noch 8 weitere pcf8574 (ohne A!) 
einsetzen im Adressbereich 0x20 bis 0x27.

Mit pcf8574Setup() werden vermutlich die 8 Pin eines pcf8574 gemapt, so 
dass du statt BASE_I2C für jeden pcf8574 eine solche Definition brauchst 
mit 8-er Abstand.

 #define PCF8574_1        0x80
 #define PCF8574_2        0x88
 #define PCF8574_3        0x90
...usw

von André A. (qwerty1234)


Lesenswert?

Erstmal Danke für deine Antwort.
Das ist mir schon alles klar. :-)
Ich will aber mit dem Code mehrere Objekte erstellen um so
wietere Ausgänge als acht schalten bzw einlesen zu können.


Ich initialisire ja mit:
"pcf8574Setup(BASE_I2C, 0x38);"
einen PCF8574 mit der Adresse 0x38 und der PinBase 0x80.

mit:
"pinMode(BASE_I2C + i, OUTPUT);"
setzte ich jetzt P0 von 0x38 als Ausgang.

mit:
"digitalWrite(BASE_I2C + 7, 1);"
setzt ich das Ausgangssignal der Pins 0x80 bis 0x87 auf HIGH


Wie soll ich da jetzt einen weitere Adresse zB. 0x39 und deren P0
ansprechen können?

Vielen Dank im Voraus

Gruß

von Falk B. (falk)


Lesenswert?

@ André Aaaa (qwerty1234)

>Das ist mir schon alles klar. :-)

Wirklich? Das glaube ich nicht so ganz.

>Ich will aber mit dem Code mehrere Objekte erstellen um so
>wietere Ausgänge als acht schalten bzw einlesen zu können.

Dann mal los.

>"pcf8574Setup(BASE_I2C, 0x38);"
>einen PCF8574 mit der Adresse 0x38 und der PinBase 0x80.

Was auch immer PinBase sein soll.

>"pinMode(BASE_I2C + i, OUTPUT);"
>setzte ich jetzt P0 von 0x38 als Ausgang.

>"digitalWrite(BASE_I2C + 7, 1);"
>setzt ich das Ausgangssignal der Pins 0x80 bis 0x87 auf HIGH

OK.

>Wie soll ich da jetzt einen weitere Adresse zB. 0x39 und deren P0
>ansprechen können?

Also muss die Software irgendwie ein solches Objekt erzeugen. 
Möglicherweise kann sie das gar nicht, weil sie nur auf einen einzigen 
PCF ausgelegt ist.

Dazu müsste man die Funktionen für den PCF8574 im Detail sehen.

: Bearbeitet durch User
von Jobst Q. (joquis)


Lesenswert?

pcf8574Setup(PCF8574_2, 0x39);
pcf8574Setup(PCF8574_3, 0x3A);
...


digitalWrite(PCF8574_2 + 3, 1);
würde dann den vierten IO-Pin des zweiten PCF8574A schalten



>mit:
>"digitalWrite(BASE_I2C + 7, 1);"
>setzt ich das Ausgangssignal der Pins 0x80 bis 0x87 auf HIGH

Vermutlich setzt du damit nur Ausgang 7 auf HIGH. Wo bekommt wiringpi 
gesagt, dass er 0x80 bis 0x87 setzen soll? "BASE_I2C + 7" ist dasselbe 
wie 0x87.

Das pinmode wird höchstens intern von wiringpi gebraucht, da der PCF8574 
weder umgeschaltet werden muss noch kann.

von André A. (qwerty1234)


Lesenswert?

Danke joquis für Deine Antwort.

Jobst Quis schrieb:
> pcf8574Setup(PCF8574_2, 0x39);
> pcf8574Setup(PCF8574_3, 0x3A);
> ...

ja so habe ich es auch versucht.


Jobst Quis schrieb:
> digitalWrite(PCF8574_2 + 3, 1);
> würde dann den vierten IO-Pin des zweiten PCF8574A schalten

und genau da ist mein Problem.
Wie kann ich jetzt zum Beispiel den Pin 2 von 0x39 schalten?

in digitalWrite steht ja nur die Adresse des Pins und High ode Low.
Aber die Adressen der Pins sind immer die gleichen (0x80 bis 0x87).
Oder kann ich diese ändern?

Ich hoffe du hast mich jetzt besser verstanden was mein Problem ist.
Danke im Voraus

von Jobst Q. (joquis)


Lesenswert?

Wenn du die defines meiner ersten Antwort eingetragen hast:

 #define PCF8574_1        0x80
 #define PCF8574_2        0x88
 #define PCF8574_3        0x90

und das Setup
 pcf8574Setup(PCF8574_2, 0x39);

müsste mit
digitalWrite(PCF8574_2 + 1, 1);

der 2 Pin von 0x39 zu schalten sein. Statt PCF8574_2 + 1 wäre auch 0x89 
möglich, ist nur eine andere Schreibweise

Wichtig ist natürlich auch, dass die Hardware die richtige Adresse hat. 
Für 0x39 muss A0 auf HIGH sein und A1 und A2 auf LOW.

Das pinmode wird vielleicht auch gebraucht.

von André A. (qwerty1234)


Lesenswert?

Achso. Du legst die Geräte Sub Adresse mit deinen Ausgängen fest.
Das geht leider bei mir nicht. Da ich eine Flachbaugruppe habe mit drei 
PCF8574A und deren jeweilige A0-A3 verlötet sind um so die Adresse fest-
zulegen. Ich bräuchte ja demnach 9 zusätzliche Leitungen

Dann werde ich mir wohl was anderes überelgen müssen.

Aber vielen Dank für Deine HIlfe !

Grüße

von Falk B. (falk)


Lesenswert?

@André Aaaa (qwerty1234)

>Achso. Du legst die Geräte Sub Adresse mit deinen Ausgängen fest.

Musser doch. Wei soll er sonst die Ausgänge unterscheiden?

>Das geht leider bei mir nicht. Da ich eine Flachbaugruppe habe mit drei
>PCF8574A und deren jeweilige A0-A3 verlötet sind um so die Adresse fest-
>zulegen. Ich bräuchte ja demnach 9 zusätzliche Leitungen

Bitte? Wozu das denn? Die I2C Adressen deiner drei PCF8574 sind 
festgelegt, hoffentlich unterschiedlich. Da muss KEINER mer ran!

Ich kenn die Funktion hier nicht wirklich, es sieht aber so aus, dass 
die Adressen nur VIRTUELL sind, um sie zu verwalten!

>Dann werde ich mir wohl was anderes überelgen müssen.

Ja, nämlich die Funktion

pcf8574Setup(PCF8574_2, 0x39);

WIRKLICH verstehen! Gibt es dafür keine Dokumentation?

von Falk B. (falk)


Lesenswert?

Google pcf8574Setup

http://wiringpi.com/extensions/i2c-pcf8574/

Der ERSTE Treffer! Den Text muss man nur mal lesen! Es ist immer das 
Gleiche mit BASCOM, Arduino & Co :-(

"You can call pcf8574Setup() as many times as needed for each PCF8754 
you have in the system – just give it a different pin base and I2C bus 
address.

You don’t need to specify the number of pins here – the PCF8754 has 8 
pins."

Das sagt doch alles! Und ich hab mal wieder richtig geraten! Es sind 
virtuelle Ports/Pins!

1
#define PCF8574_1        0x80
2
#define PCF8574_2        0x88
3
#define PCF8574_3        0x90
4
5
pcf8574Setup(PCF8574_1, 0x38);
6
pcf8574Setup(PCF8574_2, 0x39);
7
pcf8574Setup(PCF8574_3, 0x3A);

Beitrag "Re: Raspberry Pi & PCF8574 wird nicht erkannt"

von (prx) A. K. (prx)


Lesenswert?

Julian schrieb:
> Wenn ich mit "i2cdetect -y 0" die angeschlossenen Geräte
> suchen möchte, dann finde ich keine Geräte. Bei i2cdetect -y 1 kommt bei
> der Adresse 3f der Wert 3f. Ich habe allerdings gelesen, dass der 2. I2C
> Bus gar nicht auf dem 26-pol Stecker liegt...

Die Zuordnung der I2C-Module zu den GPIO-Anschlüssen hat sich beim RasPi 
im Laufe der Zeit geändert. Anfangs war es das erste, später das zweite.

von André A. (qwerty1234)


Lesenswert?

Die Seite kenne ich, habe es versucht, nicht hinbekommen und mich hier 
gemeldet. Also behaupte nicht Dinge, die nicht der Wahrheit entsprechen.

Meine Adressen sind fest vergeben, da eventuell noch weitere PCF8574 
hinzukommen. Das heißt von 0x38 bis 0x3F. Pinadressen sind jeweils die
gleichen 0x80 bis 0x87.

Meine Frage ist doch jetzt einfach, ob es möglich ist mit dem Code und 
einer festen Adressierung mehrere ICs anzusprechen oder nicht.

: Bearbeitet durch User
von Jobst Q. (joquis)


Lesenswert?

André Aaaa schrieb:
> Da ich eine Flachbaugruppe habe mit drei
> PCF8574A und deren jeweilige A0-A3 verlötet sind um so die Adresse fest-
> zulegen. Ich bräuchte ja demnach 9 zusätzliche Leitungen

Wenn drei PCF8574A auf einer Baugruppe sind und auf dieselben Adressen 
festgelegt wären, wäre das ein schwerer Konstruktionsfehler der 
Baugruppe.

Meist sind sie per Jumper oder Lötbrücken einstellbar, wenn sie fest 
verlötet sind, dann wohl mit Adressen 0x38 bis 0x3A.

Was ist das für eine Baugruppe ? Ist da keine Dokumentation dabei?

von Falk B. (falk)


Lesenswert?

@ André Aaaa (qwerty1234)

>Die Seite kenne ich, habe es versucht, nicht hinbekommen und mich hier
>gemeldet. Also behaupte nicht Dinge, die nicht der Wahrheit entsprechen.

Woher sollen wir das erkennen? Das hast du weder direkt noch indirekt 
gesagt.

>Meine Adressen sind fest vergeben, da eventuell noch weitere PCF8574
>hinzukommen. Das heißt von 0x38 bis 0x3F.

Das sit der normale Adressbereich, den man am PCF8574 einstellen kann. 
Wo ist das Problem?

> Pinadressen sind jeweils die gleichen 0x80 bis 0x87.

Ich glaube hier liegt ein Irrtum vor. Die Adressen 0x80-0x87 werden mit 
dem Befehl

pcf8574Setup(PCF8574_1, 0x38);

dem 1. PCF zugeordnet. Jede Adresse entspricht den Pins P0-P7

Den 2. PCF spricht man über die Adressen 0x88-0x8F an. Dito den dritten.

Natürlich muss man bei diesem Befehl jeweils die ECHTEN I2C Adressen 
deiner PCFs angeben!

>Meine Frage ist doch jetzt einfach, ob es möglich ist mit dem Code und
>einer festen Adressierung mehrere ICs anzusprechen oder nicht.

Ja sicher, aber nicht mehrere ICs über die gleichen Adressen. Jeder PCF 
muss eine ANDERE eingestellt haben, dazu braucht man keine Pins an der 
Himbeere, sondern legt die Pins am Chip auf GND oder VCC.

Irgendwie hast du das Konzept hier noch nicht wirklich verstanden.

: Bearbeitet durch User
von André A. (qwerty1234)


Lesenswert?

Falk Brunner schrieb:
> Ich glaube hier liegt ein Irrtum vor. Die Adressen 0x80-0x87 werden mit
> dem Befehl
>
> pcf8574Setup(PCF8574_1, 0x38);
>
> dem 1. PCF zugeordnet. Jede Adresse entspricht den Pins P0-P7
>
> Den 2. PCF spricht man über die Adressen 0x88-0x8F an. Dito den dritten.
>
> Natürlich muss man bei diesem Befehl jeweils die ECHTEN I2C Adressen
> deiner PCFs angeben!

Genau das war mein Problem. Das habe ich nicht verstanden.
Es war einfach schwierig die Frage richtig zu stellen. Bzw euch klar zu 
machen was ich wissen wollte. Jedenfalls geht es jetzt :-)

Danke an alle

von Martin (Gast)


Lesenswert?

Sorry aber irre ich mich da? Mit setzt man doch einen GPIO und sendet 
nichts auf dem I²C Bus. Probiert es doch mal mit

int wiringPiI2CWrite (int fd, int data) ;

http://wiringpi.com/reference/i2c-library/

von Jobst Q. (joquis)


Lesenswert?

Mit pcf8574Setup() wird ein pcf8574 in wiringpi gemapt bzw ins System 
eingeordnet, so dass seine IO-Pins wie originale GPIOs mit 
digitalWrite()angesprochen werden können.

wiringPiI2CWrite() ist universeller für beliebige I2C-Bausteine, die 
muss man dann aber genauer kennen.

: Bearbeitet durch User
von Falk B. (falk)


Lesenswert?

@André Aaaa (qwerty1234)

>Es war einfach schwierig die Frage richtig zu stellen. Bzw euch klar zu
>machen was ich wissen wollte. Jedenfalls geht es jetzt :-)

Heureka!

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.