Go Down

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

jim_beam

Hallo,

kann es sein, dass eine Fehlerhafte I2C Verbindung den Arduino "einfriert", z.B. wenn der I2C Slave während der Kommunikation aus schaltet (oder noch nicht eingeschaltet ist) oder die Verbindung gestört ist?

Gibt es da eine Option eines Timeouts oder eine ähnliche Fehlerbehandlung?

Habe nur ältere Einträge zu diesem Thema gefunden.


Hintergrund:  Nutze Arduino Mega als Master mit std. Wire Lib. (IDE 1.6.5, Ubuntu) und eine DS3132 RTC als Slave. Die RTC wird nur eingeschaltet um die Zeit aus zu lesen.
(Ob das ganze Sinn hat, sei gerne dahin gestellt, auch dass die Leitung nur wenige cm lang sein darf und Pull-Ups benötigt ist klar. Es geht mir rein um die Fehlerbehandlung im Code und ob es zu einem einfrieren kommen kann.  ;) )

Vielen Dank.

HotSystems

Gegenfrage: Wie hast du festgestellt, das der Arduino einfriert?

Ich setze seit längerem I2C mit diversen Sensoren oder RTC und der Standard Lib ein und habe dies bisher nicht feststellen können.

Allerdings wurde das System (Uno oder Pro Mini) nie sehr lange ohne die angeschlossenen (also kurze Zeit entfernt) Sensoren betrieben, so dass ich nicht sagen kann, ob ein Absturz doch nach längerer Zeit vorkommen kann.

Gruß Dieter

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

jim_beam

Habe primitiv aber umfänglich Serial-Debuged so in dieser Art:

#define SerialDebug(x); Serial.print(__LINE__);Serial.println(x);

und an etlichen Stellen im Code geschrieben. So konnte ich sehen, dass die letzte Ausgabe der Serial direkt nach dem Einschalten der I2C-Slave Power und vor dem ersten Lesebefehl des Slaves war.
(Zugegeben: Ich gebe der Power keine extra Zeit (delay) zum Einschwingen, dass kann natürlich eine Fehlerquelle sein! Aber meine Frage, ist Wire da robust gegen, oder kanns endlos werden? Störung auf Leitung kann ja immer mal sein) (Controller läuft gerde über Nacht zum Test mit 1ms Pause nach dem einschalten. Bisher kam Fehler schon nach 8-120min. RTC wird aber auch jede Sek. an, auslesen, aus)

Zusätzlich wird eine LED in jedem loop() durchlauf getoggelt. Die steht auch still. Der Code ist ansonsten in Tasks organisiert.

..hmm Du bringst mich auf die Idee... da könnte ich noch einen ext. Interrupt hinzufügen, der eine weietre LED toggelt und schauen ob er darauf noch reagiert oder total fest steht. Aber selbst wenn er den Interrupt noch bedient, bekomme ich ihn nicht mehr aus der vermutete I2C-Falle (Schleife) heraus, WENN ES DENN DIE IST! Will ich (noch) nichts unterstellen. Zu 99,9% sitzt der Fehler ja bekanntlich VOR dem Bildschirm  ;)

HotSystems

Ok, soweit bin ich da noch nicht in die Tiefe gegangen.

Bei mir hat das bisher (wie beschrieben) immer sauber und ohne Hänger funktioniert. Der einzige Test war, mal die RTC oder einen Sensor für einige (ca. 15 Min.) rausgezogen. Dabei keinen Ausfall erhalten.

Ein Lux-Meter mit I2C und Pro Mini läuft jetzt seit gut einem 1/2 Jahr ohne Ausfall und eine Schaltuhr seit ca. 3 Monaten ebenso.

Aber warum schaltest du die RTC?
Ich lass diese immer durchlaufen, der Stromverbrauch ist doch vernachlässigbar.  :smiley-confuse:
Gruß Dieter

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

jim_beam

Meine DS3231N RTC auf kleinem Board mit Backup-Batt von e-bucht auch China gönnt sich 7,3 -7,7mA.
Das ist mir zu viel, zumal sie 990ms nix tut und nur 1% der Zeit aktiv sein muss.

Es sei angemerkt, dass ich auch meinen Arduino komplett schlafen lege im Low-Power-Mode um lange mit einer Batterie zu leben (nutze dafür auch eigenen Aufbau).

Habe es gerade mal provoziert und den Strom der RTC gänzlich geklaut, dann steht der Code still...

HotSystems

Ups...
Quote
Habe es gerade mal provoziert und den Strom der RTC gänzlich geklaut, dann steht der Code still...
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.

Allerdings werden meine Projekte bisher alle mit Netzteil betrieben, daher stört mich der Stromverbrauch nicht wirklich. Ist ebenso eine DS3231N.

Edit:
Fällt mir gerade ein, ist es eine Batterie oder Akku?
Gruß Dieter

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

jim_beam

Das war eine gute Idee mit dem Interrupt. Er reagiert noch auf den Interrupt, aber der Code steht ansonsten still.

Hin und wieder läuft der Code auch weiter, wenn ich die RTC weider anklemme, kommt scheinbar auf den richtigen/falschen moment drauf an.


Ok, ich kann als work arround mit nem delay(1) nach Power on warten bis Spannung ein geschwungen ist, UND zur Sicherheit Vor jeder I2c Datenübertragung mit digital read (oder sogar analog.read()) checken, dass die Power wirklich on ist.


Dennoch die Frage bleibt:

Kann jemand etwas zur Robustheit/Fehlerverhalten der wire Library sagen? Kann man eine Art Time-out setzen?


Vielen Dank!

HotSystems

Ok, da ich dir diese Frage nicht beantworten kann, werde ich mich jetzt schlafen legen.  :smiley-sleep:
Gute Nacht.


P.S. Ist auf deiner RTC eine Batterie oder Akku?
Gruß Dieter

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

jim_beam

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


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

jim_beam

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

HotSystems

Ok, die Lib setze ich auch ein.

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

http://www.amazon.de/Echtzeituhr-Speichermodul-Arduino-AT24C32-IIC-Modul/dp/B00MLVENI6

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

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


Gruß Dieter

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

jim_beam

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

HotSystems

Gruß Dieter

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


ElEspanol

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

oder wie hast du das nun gelöst?

Go Up