Hallo,
hat von euch jemand Erfahrung mit der Verwendung von TWI / I2C mit dem
Arduino Due?
Ich benutze einen Atmega32U4 mit dieser I2C Bibliothek
Beitrag "AVR TWI Master und Slave Funtionen in C"
und einen Arduino Due mit dem Wire-Library.
Eine von beiden verursacht bei mir Probleme, und ich vermute, dass es
die Arduino-Library ist...
Funktioniert die von Arduino mitgelieferte Library mit einem Arduino
Due bei euch problemlos?
Viele Grüße,
Christian
Christian schrieb:> Funktioniert die von Arduino mitgelieferte Library mit einem Arduino> Due bei euch problemlos?
Du solltest die Fehler erst einmal bei dir suchen, anstelle von einer
Arduino Lib welche täglich Tausende von Menschen verwenden.
San Lue schrieb:> Christian schrieb:>> Funktioniert die von Arduino mitgelieferte Library mit einem Arduino>> Due bei euch problemlos?>> Du solltest die Fehler erst einmal bei dir suchen, anstelle von einer> Arduino Lib welche täglich Tausende von Menschen verwenden.
Da in der Wire-Lib für den Due aber einige Fehler bekannt sind, wollte
ich erstmal eure Erfahrungen hören, denn die Lib, die ich für den Atmega
verwende wird auch von vielen Leuten verwendet und ich hatte mit dieser
auch noch nie Probleme.
Kassiopeia schrieb:
>Die Wire library ist ziemlich buggy!>http://forum.arduino.cc/index.php?topic=144700.0>https://github.com/arduino/Arduino/pull/1994
Genau auf die Fehler bin ich auch schon gestoßen und habe auf die
Arduino 1.5.9 Version gewechselt, wo der Fehler gepatcht ist.
San Lue schrieb:> Kassiopeia schrieb:>> Die Wire library ist ziemlich buggy!>> Bei einem Arbeitskollegen seit mehreren Montaten Fehlerfrei in Betrieb..
Auch auf dem Arduino DUE ???
Christian schrieb:> Auch auf dem Arduino DUE ???
zu 99,9 % sicher. Schreibe ihm gleich noch ne SMS und Frage ihn noch
kurz, bin derzeit nicht auf der Arbeit. Vielleicht lässt er mir paar
Bilder oder Code zukommen, dann würde ich sie dir hier zur Verfügung
stellen.
San Lue schrieb:> Du solltest die Fehler erst einmal bei dir suchen, anstelle von einer> Arduino Lib welche täglich Tausende von Menschen verwenden.
Oder aber auch nicht! Bei den AVR basierten Arduinos mag das stimmen,
der DUE hat leider noch nicht die Verbreitung, da klemmen noch ein paar
Dinge.
Das Problem ist wohl auch, das die Arduino-Libraries sich zunächst sehr
an den Möglichkeiten des 328P orientiert haben, und der
Kompatibilitätsanpruch auch hardwareseitig zu merkwürdigen Dingen führt.
Zum Beispiel werden jeweils zwei Pins des SAM3X8E einfach
kurzgeschlossen auf jeweils einen PIN des DUE geführt: PC29 und PA28
auf PIN 10
PA29 und PC26 auf PIN 4
Dies nur deswegen, dass somit auf diesem Pin sowohl PWM als auch SPI-CS
angeboten werden kann. Keine Möglichkeit vorgesehen, eine der beiden
Leiterbahnen wenigstens kontrolliert trennen zu können...
Wenn nun beide PINs des SAM auf Output gesetzt werden, der eine High,
der andere Low .....
Der DUE und seine Clones, insbesondere der DigiX sind interessante
Boards, weit leistungsfähiger als die AVRs, aber die Arduino-Libs sind
dafür in vielen Bereichen noch bestenfalls BETA
Christian schrieb:> Auch auf dem Arduino DUE ???
Gerade auf dem DUE, wie die Links zeigen!
Kommt jeweils drauf an, was man damit macht. Bibliotheken, die z.B. den
Returncode von Wire.endTransmission() nicht auswerten laufen.
Bibliotheken, oder Programme, die das Auswerten haben Probleme.
Bei mir laufen auch einige Dinge, andere liefen erst, als ich gepatcht
habe.
Kassiopeia schrieb:> Christian schrieb:>> Auch auf dem Arduino DUE ???>> Gerade auf dem DUE, wie die Links zeigen!
Vermute die Aussage war eher auf mein Post bezogen.
Melde mich, sobald ich Antwort vom Kollegen habe ;)
Kassiopeia schrieb:> sorry, falsche Nachricht markiert ... ;-)>> Da der TO nun auf die 1.5.7 umgestiegen ist, wird er bald melden, ob es> das war.
Ja ich bin schon vor ein paar Tagen umgestiegen. Danach war ein Problem
behoben. Aber das war scheinbar noch nicht alles. Der Arduino beendet
das Senden von Daten scheinbar noch immer nicht sauber. Ich erstelle im
Laufe des nachmittags mal ein Minimalbeispiel, das auch die Codes des
Statusregiserts zeigt. Da wird mein Problem deutlich!
Danke schonmal!
So ich konnte das Problem eingrenzen. Es passiert, wenn ich vom Arduino
mehr als 1 Byte an den Atmega sende.
Der Arduino fordert alle 500ms ein Byte Daten vom Atmega. Der Atmega
sendet daraufhin Decimal 36
Wenn ich nun ein Zeichen in die Arduino-Konsole eingebe, soll der
Arduino einmalig die beiden Bytes mit den Decimalwerten 37 und 38 senden
Ausgabe des Atmegas (Slave):
Der Arduino scheint irgendwie das Senden der Daten nicht korrekt zu
beenden und sendet Byte 1 immer wieder und Byte 2 auch, aber mit einem
falschen Wert... :-S
Wenn ich nur ein Byte sende, ist alles Prima!
Übersehe ich etwas?
Okay ich bin noch einen Schritt weiter:
Das zweite "falsche" Byte ist immer das erste Byte*2. Das spricht dafür,
dass irgendwie das Byte nach links geshiftet und nochmal gesendet wird.
Das spricht für mich irgendwie dafür, dass der Arduino das zweite Byte
als Adresse interpretiert.
Die Adresse wird dann um 1 Bit nach links geshiftet und um 0 erweitert,
sodass sich SLA+R (Slaveaddress und Read-Bit) ergibt.
in der Wire.cpp von Arduino hat die Funktion Wire.EndTransmission den
parameter sendStop. Diesen kann man zwar übergeben, aber er wird
nirgends verwendet :-S
Was ist denn das für ein Murks?
1
//
2
// Originally, 'endTransmission' was an f(void) function.
3
// It has been modified to take one parameter indicating
4
// whether or not a STOP should be performed on the bus.
5
// Calling endTransmission(false) allows a sketch to
6
// perform a repeated start.
7
//
8
// WARNING: Nothing in the library keeps track of whether
9
// the bus tenure has been properly ended with a STOP. It
10
// is very possible to leave the bus in a hung state if
11
// no call to endTransmission(true) is made. Some I2C
12
// devices will behave oddly if they do not see a STOP.
weitere Frage:
Wie sind die beiden Controller verbunden? Hast Du einen
Levelconverter/Zenerdiode etc. dazwischen?
Ich gehe mal davon aus, dass der AVR mit 5V betrieben wird.
Die laufen beide auf 3,3V. Die Pullups sitzen auf dem Board vom Atmega.
Die Massen der beiden Controller sind verbunden. Levelconverter und
Dioden gibs nicht.
Kenne mich mit I2C nur sehr flüchtig aus, hatte aber mal ein ähnliches
Problem. Lag daran dass ich nicht bedacht hatte, dass beim ersten Byte
das Bit 0 für R/W steht. Vielleicht hilft dir ja das irgendwie weiter...
Vielleicht ist es auch totaler Müll was ich erzähle, aber ein versuch
ist es wert hehe
TWI schrieb:> Kenne mich mit I2C nur sehr flüchtig aus, hatte aber mal ein> ähnliches> Problem. Lag daran dass ich nicht bedacht hatte, dass beim ersten Byte> das Bit 0 für R/W steht. Vielleicht hilft dir ja das irgendwie weiter...> Vielleicht ist es auch totaler Müll was ich erzähle, aber ein versuch> ist es wert hehe
Damit hast du schon recht, aber das sollte normalerweise nur bei der
Übertragung der Adresse eine Rolle spielen.
Die anschließenden Datenbytes sind volle 8 Bit.