I2C BUS MIT PORTERWEITERUNG

Hallo Leute ich hab mir eine I2C Bus gebaut und an dem eine Porterweiterung(PCF8574) ich kann zwar die Porterweiterung ansprechen mit 0x20 aber ich kann die PINS auf der Porterweiterung nicht ansprechen so das ich sieh als Ausgang verwenden kann . Kann mir einer vielleicht helfen ? Dankeschön schon mal im Voraus :)

Mir hat die Seite Tutorial: Arduino and the I2C bus – Part Two geholfen.

Auch hier findest du noch weiterführende Informationen.

Dann zeig doch erst einmal, wie du deinen I2C Bus betreibst. Dazu zählt ua. Schaltplan und der Sketch.

Woher weißt Du, daß Du das Modul ansprechen kannst? Wenn das tatsächlich funktioniert, einfach noch ein Datenbyte übertragen, das sollte dann an den Ausgängen rauskommen.

Danke an alle die Geholfen haben.

sschultewolter: Dann zeig doch erst einmal, wie du deinen I2C Bus betreibst. Dazu zählt ua. Schaltplan und der Sketch.

Kann ich gerade leider nicht da ich momentan nichts dabei habe und nicht zuhause bin.

DrDiettrich: Woher weißt Du, daß Du das Modul ansprechen kannst? Wenn das tatsächlich funktioniert, einfach noch ein Datenbyte übertragen, das sollte dann an den Ausgängen rauskommen.

Weil ich mit der Adresse 0x20 ein byte paket an der Porterwiterung schicken konnte. Wire.beginTransmission(expander); Wire.write(B11111111); //Schreiben des Bytes. Jede Null stellt ein Bit an den Pins des PCF8574 dar (Auch m�glich in Hex Schreibweise) Wire.endTransmission(); //Schlie�en der Verbindung delay(1000); }

Ich weiß das ich mit B1 1 1 1 1 1 1 1 PIn1 etc etc etc etc etc etc

ABer ich kann kein pin definieren wohin ich ein Unterprogram schicken könnte.

Kraddy18: ABer ich kann kein pin definieren wohin ich ein Unterprogram schicken könnte.

Hä... Du möchtest ein Programm an einen Pin schicken?

Ich glaube, dass du so manche Wörter anders verwendest, als ich.

combie:
Hä…
Du möchtest ein Programm an einen Pin schicken?

Ich glaube, dass du so manche Wörter anders verwendest, als ich.

#define PIN 2
Adafruit_NeoPixel strip = Adafruit_NeoPixel(150, PIN, NEO_GRB + NEO_KHZ800);

Alles was ich doch jetzt Programmiere wird doch später an dem PIN 2 ausgegeben mit Nullen und Einsen (Strom an Strom aus) oder sehe ich das falsch ?

Ob Du etwas abschicken konntest, mußt Du erst prüfen. if (Wire.write(blabla)) Serial.writeln('Byte abgeschickt');

Zudem, was soll sich am Expander abspielen, wenn Du ihm lauter Einsen schickst? Was sagt das Datenblatt dazu? Oder was soll B11111111 sein, vielleicht 0b11111111?

Kraddy18:

define PIN 2

Adafruit_NeoPixel strip = Adafruit_NeoPixel(150, PIN, NEO_GRB + NEO_KHZ800);

Alles was ich doch jetzt Programmiere wird doch später an dem PIN 2 ausgegeben mit Nullen und Einsen (Strom an Strom aus) oder sehe ich das falsch ?

Du siehst das nicht ganz falsch, aber auch nicht ganz richtig.

Die NeoPixel Bibliothek arbeitet anders als die Wire Bibliothek, und beide machen das auf unterschiedliche Weise - sonst bräuchte man ja nur eine Bibliothek.Und damit sie überhaupt was machen, erzeugt man zuerst ein Objekt für jeden Port, und diesen Objekten kann dann sagen, was sie tun sollen, also z.B. strip.tuwas() oder Wire.tuwas() aufrufen,

DrDiettrich: ... einfach noch ein Datenbyte übertragen, das sollte dann an den Ausgängen rauskommen.

Nö, der PCF8574 möchte exakt ein Datenbyte, weitere werden ignoriert: "If other data bytes are sent from the master, following the acknowledge, they are ignored by this device." Das Adressbyte schickt die Bibliothek.

Kraddy18: Adafruit_NeoPixel strip = Adafruit_NeoPixel(150, PIN, NEO_GRB + NEO_KHZ800);

Nach meiner Einschätzung dürften NeoPixel an einem Portexpander nicht funktionieren, da NeoPixel eine feste Frequenz benötigen.

DrDiettrich: Oder was soll B11111111 sein, vielleicht 0b11111111?

Die Schreibweise mit "B" steht so in der Referenz.

Kraddy18: Weil ich mit der Adresse 0x20 ein byte paket an der Porterwiterung schicken konnte.

Bist Du sicher, die Adresse 0x20 stimmt? Das steht zwar so im Datenblatt, mein Chip möchte aber mit 0x38 angesprochen werden. Das findest Du mit dem I2C_scanner heraus.

Noch ein Tipp: Der Chip möchte Last gegen Masse schalten.

Der häufigste Fehler sind übrigens fehlende PullUp-Widerstände an SDA und SCL :)

Ich vermute auch ganz stark, dass der TO die Funktion der Porterweiterung noch nicht verstanden hat.

Dazu ist der Tipp mit dem I2C-Scanner sehr wichtig, sowie der mit den Pullup-Widerständen (4,7 k gegen +5V). Diese sind bei kurzen Leitungen allerdings nicht unbedingt notwendig, man sollte sich aber daran gewöhnen, diese einzusetzen.

Hier mal ein Test-Sketch zum Funktionstest des Expanders:

/****************************************************************
*
* PCF8574 I²C-Bus-Expander als Ausgabeport
*
*  Arduino analog input 5 - I2C SCL
*  Arduino analog input 4 - I2C SDA
*
****************************************************************/

#include <Wire.h>

#define I2C_ADDR    0x20                 // I2C-Addresse


void setup() {
  Serial.begin(9600); 
  
  Wire.begin(I2C_ADDR); 
  
  Serial.println("Testprogramm PCF8574 I2C-Bus-Expander (A4/A5)");
  Serial.println("-------------------------------------");
  Serial.println();
}


void loop() {
  Serial.println("Pins HIGH schalten");
  Wire.beginTransmission(I2C_ADDR);
  Wire.write(I2C_ADDR);      
  Wire.write(0xFF);              // Alle Pins HIGH, B11111111
  Wire.endTransmission(true);
  
  delay(3000);
  
  Serial.println("Pins LOW schalten");
  Wire.beginTransmission(I2C_ADDR);
  Wire.write(I2C_ADDR);      
  Wire.write(0x00);              // Alle Pins LOW, B00000000
  Wire.endTransmission(true);
  delay(3000);
}

Und wichtig auch, wie agmue schon angemerkt hat, der Ausgang schaltet gegen GND (auf LOW), also wenn eine Led, die mit einem Widerstand gegen +5V.

agmue: Nö, der PCF8574 möchte exakt ein Datenbyte, weitere werden ignoriert: "If other data bytes are sent from the master, following the acknowledge, they are ignored by this device." Das Adressbyte schickt die Bibliothek.Nach meiner Einschätzung dürften NeoPixel an einem Portexpander nicht funktionieren, da NeoPixel eine feste Frequenz benötigen. Die Schreibweise mit "B" steht so in der Referenz. Bist Du sicher, die Adresse 0x20 stimmt? Das steht zwar so im Datenblatt, mein Chip möchte aber mit 0x38 angesprochen werden. Das findest Du mit dem I2C_scanner heraus.

Noch ein Tipp: Der Chip möchte Last gegen Masse schalten.

Der häufigste Fehler sind übrigens fehlende PullUp-Widerstände an SDA und SCL :)

Ja ich bin mir sicher das es die richtige Adresse ist da ich ja das Datenpaket an die Portweiterleitung schicken konnte. Was ich auch an der Porterweiterung überprüft habe.

Kraddy18: Ja ich bin mir sicher das es die richtige Adresse ist da ich ja das Datenpaket an die Portweiterleitung schicken konnte. Was ich auch an der Porterweiterung überprüft habe.

Und wie hast du es überprüft? Und was meinst du mit "Portweiterleitung"?

Hast du denn die Ausgänge der Erweiterung mal mit einer oder mehr Leds überprüft?

Hast du denn hier noch eine Antwort?

Und wie hast du es überprüft? Und was meinst du mit "Portweiterleitung"?

Hast du denn die Ausgänge der Erweiterung mal mit einer oder mehr Leds überprüft?

Dann können wir auch weiter helfen.