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

HotSystems: Ups... das sieht mir dann aber doch nach einem internen Problem aus.

Dieses konnte ich bei meinen Projekten nie beobachten. Hatte es gerade noch mit meiner "Entwicklungsschaltuhr" getestet. RTC abgezogen und die Uhr läuft munter weiter.

hmm.. Kann es aber ganz klar, wiederholend eingrenzen, die letzte Serielle Ausgabe kommt genau nach dem Power on und vor dem lesen der Uhrzeit oder Temperatur.

ABER, welche Library nutzt Du für die RTC? Ich nutze diese hier:https://github.com/JChristensen/DS3232RTC

Vielelicht hat es ja auch damit zu tun?? :o

HotSystems: Fällt mir gerade ein, ist es eine Batterie oder Akku?

Bei mir steck ich die selbst in den Halter der RTC, und ich habe ne Batterie drinne :)

Ich glaube Du hast mir schon viel weiter geholfen! Werde mal eine andere Library testen, aber auch nicht mehr heute Abend/Morgen :sleeping:

Ok, die Lib setze ich auch ein.

Was die Batterie betrifft, hast du denn auch eine originale Platine ähnlich dieser hier:

Wenn ja und du hast die nicht geändert, dann lies bitte folgenden Artikel:

http://arduino-hannover.de/tag/ds3231/

Bingo! :o Klasse hinweise, vielen Dank! Das werd ich dann wohl mal schleunigst ändern müssen!! :fearful:

Gerne, gute Nacht, bin weg...

Danke Dir auch!

Aber hat das nun was mit dem Aufhängen zu tun?

oder wie hast du das nun gelöst?

Aber hat das nun was mit dem Aufhängen zu tun? Könnte höchstens sein, dass der Uhrenmodul seine I2C Funktion einstellt, wenn die CR Batterie auf 4,x V "geladen" ist. Die Uhr stellt dann fest, dass sie auf Batterie läuft, weil die normale Spannung zu wenig drüber liegt. Um Strom zu sparen, ignoriert sie den I2C Bus. Dann hängt es an der Library, ob sie Unsinn liefert oder Unsinn macht. Wire selbst hängt eigentlich nicht. (vgl. I2C Scanner)

Also ich habe es mal mit einer 2. Hardware getestet bzw. bin noch dabei und es läuft stabiler. Es scheint aber mit dem ein und aus schlalten der rtc zu tun zu haben. Teste gerade auch den selben code aber mit dauer 5v an der rtc.

Die Dioden habe ich mal entfetnt an beiden rtcs da ich keine akkus drinn habe und bei eingeschalteter rtc die spannung an der batterie schon bei 4,6v lag.

Melde mich, wenn ich mehr weiß.

jim_beam:
Also ich habe es mal mit einer 2. Hardware getestet bzw. bin noch dabei und es läuft stabiler. Es scheint aber mit dem ein und aus schlalten der rtc zu tun zu haben. Teste gerade auch den selben code aber mit dauer 5v an der rtc.

Die Dioden habe ich mal entfetnt an beiden rtcs da ich keine akkus drinn habe und bei eingeschalteter rtc die spannung an der batterie schon bei 4,6v lag.

Melde mich, wenn ich mehr weiß.

Ich befürchte, es hätte nicht lange gedauert und die Batterie wäre dir um die Ohren geflogen. :wink:

Durch das ein- und Ausschalten gelangen evtl. Impulse in den Arduino, die er nicht verkraftet.

Häng doch mal einen Logiganalyser an den Bus. wenn er Low ist, trennst du ihn auf und schaust ob die RTC oder der Controller Low ist. dann weißt du, wo du ansetzen musst.

Habe mal einige Messung gemacht mit 2 Aufbauten und der gleichen Software und mehrere Tage laufen lassen. (Nach dem Einschalten der RTC habe ich zur Sicherheit noch 100us und vor dem Ausschalten ebenfalls 100us delay eingefügt.) Dann habe ich über ca. 12h die Zeiten gemessen (bei beiden RTCs sind die Ladedioden abgetrennt, da kein Akku drin steckt):

Aufbau A) (Steckbrett): Hier wurde die RTC ständig (1x / sec) eingeschaltet, ausgelesen und ausgeschaltet. Zum erwarteten Synchronisationssignal wurde die RTC 10ms vorher eingeschaltet und danach wieder aus. Das hat ohne Probleme funktioniert, nachdem ich einen 100nF C in die VCC der RTC ergänzt hatte! Die 100us delays alleine halfen nicht. Konnte mir bei dem Aufbau die Spannung an der RTC leider noch nicht mit/ohne C ansehen. Aber es scheint mit der Versorgungsspannung der RTC zu tun zu haben. Mein Code selbst scheint nicht das Problem zu sein.

Nur warum bleibt der Code hängen, wenn die RTC nicht oder nicht richtig Antwortet da sie (offensichtlich) Versorgungsspannungsprobleme hatte?? Also doch die RTC-Library?

Laufzeit laut PC-Uhr: 12:12:30,991 Laufzeit laut RTC: 12:12:31,000 (ms werden von RTC nicht ausgegeben) Laufzeit laut millis(): 12:11:55,968 Laufzeit millisync(): 12:12:31,008 (basiert auf millis(), wurde aber alle 5s mit RTC Signal synchronisiert)

PC und RTC sind nahezu identisch, die millis() geht hoch gerechnet auf 24h 68,9s nach. Das entspricht 0,08% oder 797ppm. Für einen Datenlogger der Monate läuft schon doof, wenn (rechnerisch) nach 6 Monaten ca. 3,5h oder 12 Monaten fast 7h Versatz drin ist.

Aufbau B (Gehäuse): Hier lief die RTC nicht fehlerfrei, wenn sie ein- und aus geschaltet wird. Der Trick mit dem 100nF C hat hier nicht funktioniert, daher habe ich die RTC auf Dauer +5V geklemmt (muss unbedingt mal mit dem Osszi schauen). So lief sie zumindest mal auch mehrere Tage fehlerfrei durch. Die Zeitmessung hier:

Laufzeit laut PC-Uhr: 12:12:29,974 Laufzeit laut RTC: 12:12:30,000 (ms werden von RTC nicht ausgegeben) Laufzeit laut millis(): 12:12:19,440 Laufzeit millisync(): 12:12:29,999 (basiert auf millis(), wurde aber alle 5s mit RTC Signal synchronisiert)

Das sind 0,02% bzw. 240ppm Fehler oder 20sec/Tag, 20min/Monat 2h/Jahr, was schon viel besser und akzeptabel ist.

Besonders freue ich mich aber, dass das angedachte Prinzip, mit der RTC synchronisierte ms nutzen zu können anscheinend Funktioniert und gleichzeitig kann man Strom sparen indem die RTC 90% der Zeit aus bleibt (zumindest bei 1 von 2 Aufbauten). :)

PS: Wobei bei Verwendung eines Akkus in der RTC natürlich noch untersucht werden müsste, ob die RTC nicht doch einen mind. Anteil eingeschaltet bleiben sollte um den Ladezustand des RTC-Akkus zu waren. ;)

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.