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
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.
http://rpp.it-livetalk.de/index.php?title=Belegung_des_GPIO-Connector 40-Pol. Kabel auf 26-Pol. Stecker.....ähh...peinlich!
>40-Pol. Kabel auf 26-Pol. Stecker.....ähh...peinlich!
Na ja, es gibt Naturen die knoten sich ihren Strick selber.
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...
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.
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.
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
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...
Meine Güte, dann les das Datenblatt! Das gibts nich umsonst...
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.
Okay, danke für die Hilfe. Ich glaube, jetzt habe ich es verstanden...
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ß
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
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ß
@ 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
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.
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
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.
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
@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?
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"
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.
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
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?
@ 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
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
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/
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
@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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.