Wire Library hängt Arduino auf - Timeout (o.ä.) für fehlerhafte I2C Connection?

Mir fällt gerade auf, dass es 2 verschiedene Libraries mit dem selben Namen gibt:

  1. https://github.com/Tecsmith/DS3232RTC von Tecsmith

  2. https://github.com/JChristensen/DS3232RTC von JChristensen

ich verwende die 2. Welche von beiden verwendest Du @ HotSystems ?

Jemand noch Erfahrung mit der einen oder anderen? Vielen Dank!

Habe mal mit nem Oszzi nachgemessen, grün ist die Spannung (Vcc) der RTC und gelb ist SCL.

Aufbau A (Steckbrett), ohne 100nF:

https://picload.org/image/pggwrgr/2_ohne.jpg

mit 100nF:

https://picload.org/image/pggwrga/1_mit100nf.jpg

Ich seh das kein unterschied / Problem. ??

jim_beam: Mir fällt gerade auf, dass es 2 verschiedene Libraries mit dem selben Namen gibt:

  1. https://github.com/Tecsmith/DS3232RTC von Tecsmith

  2. https://github.com/JChristensen/DS3232RTC von JChristensen

ich verwende die 2. Welche von beiden verwendest Du @ HotSystems ?

Jemand noch Erfahrung mit der einen oder anderen? Vielen Dank!

Hallo, ich verwende auch die 2.

HotSystems: Hallo, ich verwende auch die 2.

Meinst Du es wäre möglich, dass ich mal deinen Code bei mir teste oder Du meinen bei Dir? Habe die Vermutung, dass es eher mit der Hardware zu tun haben könnte. Aber selbst wenn, warum hängt sich der Arduino dann auf?

Das ich dies bezglich nicht der erste bin entnehme ich diesem link von Nick Gammon: http://gammon.com.au/forum/?id=10896&reply=7#reply7 ""Wire" library expects certain interrupts to happen, and loops until they do. If the interrupt is lost, the library hangs."

Ja, ich denke schon das es möglich ist.
Ich muss allerdings meinen Sketch auf ein Minimum reduzieren.
Der hat “einiges” an Hardware, die du evtl. nicht dran hast. :wink:

Ich verwende ein 4x20 LCD, (nichts ungewöhnliches), eine OneWire-Analog-Tastatur, I2C-Port (PCF8574) zur Relaissteuerung und einen FS20 UART-Sender inkl. einer Menüsteuerung von Jomelo.
Sowie ein Pro-Mini und der RTC.

Das macht das ganze etwas unhandlich, aber wenn du etwas Geduld hast, baue ich das zurück.

Edit:
Und ein I2C-Luxmeter um die Helligkeit des LCD zu schalten.

HotSystems: Ja, ich denke schon das es möglich ist. ... Das macht das ganze etwas unhandlich, aber wenn du etwas Geduld hast, baue ich das zurück.

Vielen Dank, das hört sich ja doch nach einer ganzen Menge Arbeit an, die will ich Dir nicht unbedingt aufhalsen!! Ich habe noch etwas weiter gelesen: http://forum.arduino.cc/index.php?topic=37822.0 http://forum.arduino.cc/index.php?topic=117452.0 und den Eindruck bekommen, dass es doch etwas mit der wire Lib zu tun haben könnte. Besonders doof scheint zu sein, nur Vcc (5V) vom I2C Slave weg zu nehmen. Wird das ganze I2C Slave abgeklemmt scheint das nicht so schlimm zu sein.

Vielleich könntest Du mal einfach testen, was passiert, wenn Du ein paar mal nur Vcc von der RTC abziehst aber SDL und SCL sowie GND verbunden lässt? Idealer weise genau dann, wenn von der RTC gelesen wird.

Aber wie gesagt nur, wenn es keine großen Umstände macht, denn ich konnte bei mir das Problem schon deutlich eingrenzen und "beherrschbarer" machen. Auch am 2. Aufbau B (Gehäuse) tut es mit einem 1uF C jetzt. Also so kann ich es betreiben. Auch bleibt noch die Option die Alternative Wire Lib zu testen. Mal schauen, wann ich das schaffe.

Schöne Grüße

Ja, das wäre mir schon recht, wenn ich es nicht machen muss.

Da ich nicht die Uhr als Grundstock aufgebaut habe, sondern das Menü als Grundstock, ist natürlich auch keine Uhr als einzelner Block vorhanden.

Aber wenn du nicht weiter kommst, mache ich es auf jeden Fall.

Das mit dem Abziehen der einzelnen Adern werde ich heute Abend ganz sicher testen und dir umgehend schreiben.

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.

Mir ist nicht ganz klar, was Du mit dem vorübergehenden Abschalten der RTC und ohne Batterien überhaupt erreichen möchtest. Wie soll eine RTC denn ohne Strom laufen? Oder habe ich das falsch verstanden?

Wenn Du Kondensatoren verwendest, um die Uhr am Laufen zu halten, dann kostet das gleich viel Energie wie eine ununterbrochene Speisung, nur der Aufwand ist unnötig hoch.

Die Batterie bzw. Akku ist schon nochauf der RTC. Da ging es nur darum, die vorhandene Ladefunktion bei einer Batterie abzuschalten.

HotSystems: 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! :)

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

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

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.

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

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

@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'.

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

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

Ok, vielen Dank

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

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.

@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?

Die Wire library selbst hängt nicht.

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

    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 )