Fehler in Wire.h?

Hallo,

nachdem ich schon einige Erfahrungen mit der AVR-Programmierung in BASCOM gemacht habe, versuche ich mich seit einigen Tagen an einem Arduino Pro Mini.
An diesen habe ich testhalber per I2C-Bus den Portexpander PCF8574A angeschlossen.
Nach dem ich mehrfach erfolglos versuchte, den 8574 zur Mitarbeit zur Zusammenarbeit mit dem Arduino zu überreden, testete ich die Verkabelung auf dem Breadbord mit einem in Bascom programmierten ATMega48 und alles funktionierte perfekt.
Arduino wieder angeschlossen - nichts passiert :(.

Da ich glücklicherweise Zugriff auf ein Speicheroszi habe, habe ich mir mal angeschaut, was da eigentlich auf dem Bus passiert und festgestellt, dass der Arduino die Slave-Adresse des PCF8574A nicht korrekt überträgt.
Statt wie im Programm mittels

Wire.beginTransmission(0x70);

den Wert 70h zu senden, sendet er 0xE0!

Nachdem ich den Wert von 70h auf 38h geändert habe, sendet er den korrekten Wert 70h und die Schaltung tut das, was sie soll...

Ist dieses Verhalten normal oder ist das ein Bug?

Viele Grüße
Kurt

daran gedacht?

There are both 7- and 8-bit versions of I2C addresses. 7 bits identify the device, and the eighth bit determines if it's being written to or read from. The Wire library uses 7 bit addresses throughout.

Grüsse

farbtoaster:
daran gedacht?

There are both 7- and 8-bit versions of I2C addresses. 7 bits identify the device, and the eighth bit determines if it's being written to or read from. The Wire library uses 7 bit addresses throughout.

Grüsse

Aber wenn es sich um das höchste Bit handelte, dann müsste aus 0x70 ja eher 0xF0 werden. Und warum man anstelle von 0x70 den Wert 0x38 wählen muss, wird damit auch nicht erklärt... dann würde aus 0x38 ja 0xB8 werden - ich kann mir nicht vorstellen, dass es daran liegt.

Rudi

Hm?
schon die 0x70 stimmen nicht, http://www.ti.com/lit/ds/symlink/pcf8574a.pdf (seite 4 oben)
Datenblatt sagt 0x38 und folgende
Irgendwo ne '0' verloren (MSB)???
auf dem Oszi taucht aber auch noch das letzte Bit auf (R/W) das nicht zur Adresse gezählt wird.
also wird aus dem 0111000 auf dem Bus ein 01110000.

Grüsse

Danke für die Antworten.
Da gibt es offensichtlich einen Unterschied, wie der Bus in Bascom und in der Arduino-IDE angesprochen wird.
In Bascom wird der 8574A nämlich mit 70h adressiert (funktioniert auch ;-)). Ich hätte vielleicht auch mal ins Datenblatt gucken sollen .... ;-). Aber das wäre ja zu einfach gewesen :D.

Viele Grüße
Kurt

So jetzt habe ich nochmal in meinem, zugegeben etwas älteren, Datenblatt (2.April 1997 ;-)) geschaut und folgendes zur Slaveadresse des 8574A gefunden:

      slave address
S|0|1|1|1|A2|A1|A0|0|A

Das ergibt bei mir 70h, wenn die Adressbits A2-A0 Lowpegel haben. Und damit funktioniert es, wie schon geschrieben, in Bascom prima. Offenbar führen beim Arduino andere Wege nach Rom ;-). Egal, Hauptsache jetzt funktioniert es...

Gruß
Kurt

wie von farbtoaster schon genannt

Die "echte" Adresse des Gerätes ist 0x70/0x71, je nachdem ob geschrieben oder gelesen wird. In Wire reicht aber 0x38 da die Library das letzte Bit (RW) selber kontrolliert.

0x38 : 0011 1000

0x70 : 0111 0000

Das hab ich inzwischen gemerkt :).
Nur ist man als Anfänger, der die englische Sprache nicht perfekt beherrscht, erstmal etwas verwirrt ;-).
Vielleicht hilfts ja dem einen oder anderen Umsteiger, der auf das gleiche Problem stößt...

Gruß
Kurt

Es ist auch verwirrend daß man im Datenblatt die I2C Adresse immer extra suchen muß und immer eine Binärzahl erhält. Beides ist für nicht profis nicht leicht.
Grüße Uwe

thewknd:
wie von farbtoaster schon genannt

Die "echte" Adresse des Gerätes ist 0x70/0x71, je nachdem ob geschrieben oder gelesen wird. In Wire reicht aber 0x38 da die Library das letzte Bit (RW) selber kontrolliert.

0x38 : 0011 1000

0x70 : 0111 0000

Sorry, aber ich habe es immer noch nicht kapiert... das "letzte" Bit (weiter oben wird auch vom 8th bit gesprochen) ist aber das Bit ganz links - die Nummerierung der Bits geht von rechts nach links. Bei deinem Beispiel wurden nur die Bits um eine Stelle nach links geschoben. Und das letzte Bit ist meiner Ansicht nach in beiden Fällen "0".

Da scheint mir die Erklärung etwas unklar zu sein... in einem meiner Bücher habe ich gerade die Erklärung gefunden, da wird das R/W-Bit als Bit 0 dargestellt, das passt dann auch zu eurer Darstellung.

Rudi

Die
0x38 : 0011 1000
ist als 8-bit Zahl dargestellt.
In Wahrheit ist sie eine 7 bit Zahl und damit:
0x38 : 011 1000
mit den R/W bit rechts wird sie zur 8bit Zahl, die übertragen wird, also
0x70 : 0111 0000 bzw
0x71 : 0111 0001

Da ist das gleiche wie wenn Du dezimal
00172 oder 0172 oder 172 schreibst.

Grüße Uwe

rz259:
Da scheint mir die Erklärung etwas unklar zu sein... in einem meiner Bücher habe ich gerade die Erklärung gefunden, da wird das R/W-Bit als Bit 0 dargestellt, das passt dann auch zu eurer Darstellung.

Ja, das war etwas missverständlich formuliert.
Wenn Daten über den I2C Bus transferiert werden, wird von jedem Byte das Bit 0 als letztes übertragen, daher die Aussage mit "letztes" Bit.

Aber wenn wie hier in diesem Fall nur das Byte mit der Adresse betrachtet wird, ist Bit 0 oder LSB die korrekte Bezeichnung.