Go Down

Topic: Wire Library hängt Arduino auf - Timeout (o.ä.) für fehlerhafte I2C Connection? (Read 9093 times) previous topic - next topic

jim_beam

Hallo jim_beam,

ich habe den Test durchgeführt und es zeigt nach mehrmaligem ein- und ausstecken der VCC an der RTC, mein Arduino hängt.

Lasse ich mir Zeit mit dem ein- und ausstecken passiert nichts und die Uhr läuft weiter.


Hallo HotSystems,
vielen Dank dass Du dir die Mühe gemacht hast!
Damit ist für mich klar, dass die Wire Lib doch unter bestimmten Umständen hängen bleiben kann (vgl. Artikel v. Nick Gamonn). Wichtig ist also vor und während der I2C Kommunikation sicherzustellen, dass Vcc nicht einbricht/aus geschaltet wird. Dann sollte alles weitere klappen. Zusätzlich werde ich die Tage mal die alternative Wire Lib testen (wenn ich Zeit finde).

Vielen Dank Dir und schöne Grüße!  :)

jensgutsche

@jim_beam:

Es gibt schon länger einen Pull-Request um ein Timeout einzubauen, aber den Leuten ist die IDE ja lieber als sich um die Bibliotheken zu kümmern und nützliche Sachen zu implementieren:

https://github.com/arduino/Arduino/pull/2489

Probier es doch einfach mal.

HotSystems

Hallo jim_beam,

ok, war keine Mühe und hoffe, das es dir hilfreich ist.
Interessant ist auch der Post von jensgutsche. Solltes du dir auch ansehen.

Viele Grüße
Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. 8)

jim_beam

@jim_beam:

Es gibt schon länger einen Pull-Request um ein Timeout einzubauen, aber den Leuten ist die IDE ja lieber als sich um die Bibliotheken zu kümmern und nützliche Sachen zu implementieren:

https://github.com/arduino/Arduino/pull/2489

Probier es doch einfach mal.
Vielen Dank für die Bestätigung und den Hinweis! Ich sehe auf der Website die geänderten Code Passagen, aber nicht, wo ich die Library runter laden kann?? Bin da gerade etwas blind.  :o

HotSystems

@jim_beam,
du hast recht, ich kann auch keinen Download finden.
Vermutlich muss man die Library selbst anpassen.  :smiley-sad-blue:

Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. 8)

jensgutsche

@jim_beam und @HotSystems


Nein soviel arbeit muesst Ihr Euch nicht machen.

Geht einfach oben auf 'Files changed', danach bei jeder Datei auf 'View' und danach auf 'Raw'.

HotSystems

@jim_beam und @HotSystems


Nein soviel arbeit muesst Ihr Euch nicht machen.

Geht einfach oben auf 'Files changed', danach bei jeder Datei auf 'View' und danach auf 'Raw'.
@jim_beam und @HotSystems


Nein soviel arbeit muesst Ihr Euch nicht machen.

Geht einfach oben auf 'Files changed', danach bei jeder Datei auf 'View' und danach auf 'Raw'.
Ok, vielen Dank
Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. 8)

jim_beam

Vielen Dank auch von mir, bin leider noch nicht dazu gekommen es zu testen...

jim_beam

@jim_beam:

Es gibt schon länger einen Pull-Request um ein Timeout einzubauen, aber den Leuten ist die IDE ja lieber als sich um die Bibliotheken zu kümmern und nützliche Sachen zu implementieren:

https://github.com/arduino/Arduino/pull/2489

Probier es doch einfach mal.

@jim_beam und @HotSystems


Nein soviel arbeit muesst Ihr Euch nicht machen.

Geht einfach oben auf 'Files changed', danach bei jeder Datei auf 'View' und danach auf 'Raw'.
Bin leider erst jetzt wieder dazu gekommen die geänderte wire.h/c und twi.h/c unter IDE 1.6.6 zu zu testen. Leider ohne Erfolg. uC hängt in I2C Kommunikation fest, wenn I2C-Slave wegen fehlender Stromversorgung nicht antwortet. ;(

Sollte es denn so einfach sein, die Dateien (wire und twi) tauschen fertig?

michael_x

Die Wire library selbst hängt nicht.

Schau z.B. http://www.gammon.com.au/i2c an, und du siehst, dass dies schon reicht:

Code: [Select]
    byte addr = 0x68; // Uhr
    Wire.beginTransmission (addr);
    if (Wire.endTransmission () == 0) { /* Uhr vorhanden */ }
    else {
    // Fehler: Slave antwortet nicht
    }

( Darauf basiert z.B. der I2C Scanner )

jim_beam

...es scheint meine IDE nicht zu stören, was mit den Dateien passiert. Habe sie mal in *.old umbenannt. Code compiliert dennoch ohne Fehlermeldung! ??? :o

wire.c.old in
/Arduino166/hardware/arduino/avr/libraries/Wire

twi.c.old in
Arduino166/hardware/arduino/avr/libraries/Wire/utility

Habe ich da die falschen Dateien am wickel oder nimmt sich die IDE die Dateien von einer ebenfalls vorhanden IDE auf meinem PC? (Linux LUBUNTU 14.04)


jim_beam

Die Wire library selbst hängt nicht.

Schau z.B. http://www.gammon.com.au/i2c an, und du siehst, dass dies schon reicht:

Code: [Select]
    byte addr = 0x68; // Uhr
    Wire.beginTransmission (addr);
    if (Wire.endTransmission () == 0) { /* Uhr vorhanden */ }
    else {
    // Fehler: Slave antwortet nicht
    }

( Darauf basiert z.B. der I2C Scanner )
Ich widerspreche Dir sehr ungern und es ist schon etwas her, dass ich hier recherchiert hatte. Aber wenn ich mich recht erinnere war es ein unterschied, ob ein Slave am Bus hängt, aber keine Spannungsversorgung hat.

Ziehe ich meine RTC einfach (im Betrieb) ganz ab, läuft der Code fleißig weiter (kontroll-Blinken einer LED). Entferne ich nur die 5V von der RTC hängt der Code komplett. Entferne ich nur SDA und/oder SDA läuft alles weiter ohne Probleme. *grübel*

nix_mehr_frei

Hallo,

ich kann das Einfrieren durch einen anderen Busteilnehmer bestätigen. Bei mir war es ein MLX90614 (berührungsloses IR-Thermometer). Ich habe mir auch erstmal einen Wolf gesucht, weil ich den elektrischen Aufbau nach dem Steckbrett stufenweise in Betrieb nehmen wollte. Ohne den Sensor stellte sich das LCD Display tot, nothing! das Display ist herkömmlich am Controller, ohne I2C.
Bis ich dann auf die Idee kam, den I2C Teil auszukommentieren und den Controller neu zu flashen. Das ist schon hundsgemein, der Fehler  :smiley-evil:
rot ist blau und Plus ist Minus

michael_x

OK, die Leitungen dauerhaft runterziehen darf bei I2C wohl keiner.
Das ist was anderes als gar nicht da zu sein.

Das hatte ich nicht bedacht.

jim_beam

Hallo,

ich kann das Einfrieren durch einen anderen Busteilnehmer bestätigen. ... Das ist schon hundsgemein, der Fehler  :smiley-evil:
Danke für die Bestätigung.  :)

Es gibt da ja auch schon entsprechend geänderten Code mit Timeout für wire.c/.h und twi.c/.h:
https://github.com/arduino/Arduino/pull/2489/files

Bekomme es aber unter LUBUNTU (wie UBUNTU) 14.04 nicht hin, die Dateien zu tauschen. Habe mehrere Arduino IDEs inzwischen auf meinem System. Neuste mit der ich egrade arbeite ist 1.6.6. Wenn ich dort unter
/Arduino166/hardware/arduino/avr/libraries/Wire
die wire.c/.h ändere oder sogar in wire.c.old umbenenne hat das gar keine Auswirkungen!?? (auch nicht nach IDE Neustart).

Kann es sein, dass die IDE sich die Dateien von einer anderen Version holt? Kann man nachschauen welche wire.c Datei bzw. von wo diese eingebunden/benutzt wird?? Ist wohl eher eine Ubuntu Frage.

Danke!

Go Up