Pages: [1]   Go Down
Author Topic: Fehler in Wire.h?  (Read 1070 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 4
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 smiley-sad.

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
Logged

Bayern
Offline Offline
Newbie
*
Karma: 0
Posts: 20
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

daran gedacht?
Quote
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
Logged

Offline Offline
Jr. Member
**
Karma: 0
Posts: 92
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

daran gedacht?
Quote
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
Logged

Bayern
Offline Offline
Newbie
*
Karma: 0
Posts: 20
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 4
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 smiley-grin.

Viele Grüße
Kurt
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 4
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Code:
      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
Logged

Offline Offline
Full Member
***
Karma: 3
Posts: 137
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

duemilanove / OSX & WIN
Arduino & Teensy: http://bit.ly/13rbdtQ

Offline Offline
Newbie
*
Karma: 0
Posts: 4
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Das hab ich inzwischen gemerkt smiley.
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

Logged

Forum Moderator
BZ (I)
Offline Offline
Brattain Member
*****
Karma: 258
Posts: 21488
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Offline Offline
Jr. Member
**
Karma: 0
Posts: 92
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Forum Moderator
BZ (I)
Offline Offline
Brattain Member
*****
Karma: 258
Posts: 21488
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Logged

Offline Offline
Full Member
***
Karma: 3
Posts: 137
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

duemilanove / OSX & WIN
Arduino & Teensy: http://bit.ly/13rbdtQ

Pages: [1]   Go Up
Jump to: