Hallo,
mit Wire.h werden doch nur 7 Bits für die Device Adresse übertragen. Nur gibt es doch noch das ominöse R/W Bit was Bit7 (das 8.) sein soll. Was hat es damit auf sich wenn es nie genutzt und auch nicht übertragen werden kann?
Und warum lassen viele Programmierer beim lesen den Adressierungsbefehl weg?
Wire.beginTransmission(I2C_Adresse);
Womit ich auch noch nicht so recht klar komme ist, dass ein Port-Direction Register fehlt.
Wenn ich jetzt 1111 0000 schreibe, dann sind für mich alles Ausgänge mit H oder L Pegel. Wenn ich dann lese erhalte ich wieder 1111 0000. Soweit noch okay, sind immer noch LEDs angeschlossen.
Wenn ich aber einen Pin der Ausgang Low hat, fest auf H legen würde, dann müßte das doch im IC einen Kurschluss geben? Denn der interne Transistor zieht das Signal immer noch auf Masse.
Kennst sich jemand mit dem Teil aus?
/*
Arduino Mega2560
PCF8574 - 8bit Portexpander, I2C Adressbereich A6-A3 fest auf b0100
PCF8574 - 8bit Portexpander, I2C Adressbereich von 0x20 = B?010 0000
bis 0x27 = B?010 0111 )
PCF8574 - max. I2C Takt = 100kHz Bit7 ist R/W
*/
#include <Wire.h>
#define PCF8574 0x20 // PCF8574 Adresse, A2-A0 auf Masse
void setup()
{
Wire.begin();
Serial.begin(57600);
}
void loop()
{
schreiben_PCF8574(PCF8574, 0xAA);
Serial.println( lesen_PCF8574(PCF8574), BIN );
delay(500);
schreiben_PCF8574(PCF8574, 0x00);
Serial.println( lesen_PCF8574(PCF8574), BIN );
delay(500);
}
void schreiben_PCF8574(int I2C_Adresse, byte data)
{
Wire.beginTransmission(I2C_Adresse); // Connect
Wire.write(data); // data Byte senden
Wire.endTransmission(); // Disconnect
delay(1);
}
byte lesen_PCF8574(int I2C_Adresse)
{
byte data = 0xFF;
Wire.beginTransmission(I2C_Adresse); // Connect
Wire.requestFrom(I2C_Adresse, 1); // ein Byte (8 Bit) anfordern
if (Wire.available()) data = Wire.read(); // Daten vorhanden?
Wire.endTransmission(true); // Disconnect
return data;
delay(1);
}