Wie das sporatische "Einfrieren" des Ethernet-Shields erkennen?

Hallo,
wie in vielen Beiträgen hier im internationalen Forum zu lesen, ist die Zuverlässigkeit des Ethernet-Shields ja etwas heikel =(

Auch in meinem Sketch bleibt das Ehernet-Shield sporatisch hängen (von innerhalb 2-3 Tagen bis zu 2-3 Wochen). Eine Kombi (Arduino Mega 2560 + Ehernet-Shield läuft mit dem gleichen Sketch sogar seit 6 Monaten!).

Wochenlange Versuche haben bei mir ergeben, das mal die tägliche NTP-Abfrage, mal die E-Mail Versendung oder die NTP-Client-Funktion die Ursache dafür ist, das danach die Verbindung zum Webserver nicht mehr funktioniert.

Ich möchte jetzt mal einfach eine Funktion einbauen, welche den "Heart-Bead" des Ethernet-Shields kontrolliert und falls dabei ein Fehler auftritt, das Ethernet-Shield neu startet.

Frage 1: Gibt es eine Funktion, welche ich periodisch aufrufen und prüfen kann (a la "Ping" o.ä.) ???

Frage2: Was spricht eigentlich dagegen, einfach aller 10 Minuten die Funktion "Ethernet.begin()" neu aufzurufen ???

MfG paulinchen

Das Problem wird sein, dass ein Arduino nicht wirklich zwingend für diese Aufgaben ausgelegt ist. Zum einen der kleine Arbeitsspeicher, zum anderen die fehlende Rechenleistung. Beim RAM könnte ich mir das entsprechend vorstellen, dass der Mega so lange läuft.

Als etwas bessere Lösung sehe ich hier einen RaspPi, welcher vermutlich für den Aufwand überdimensioniert ist und deutlich umständlicher einzurichten. Jedoch gibt es auch eine Entsprechende Möglichkeit mit dem Arduino. Mit den Arduino YUN, der eine eigene Linux CPU mit sich bringt, die unabhängig vom Atmega läuft, hatte ich noch nie Probleme mit einem Aufhänger oder ähnlichem.

Ansonsten wäre die einfachste Möglichkeit, die auch Router nutzten, die Hardware täglich neuzustarten. Das könntest du über den Reset Pin erreichen. Müsstest jedoch eben schaun, wie du ihn schalten musst (Sink oder Source). Einfach in Verbindung mit einer RTC immer um zB. 5 Uhr den Reset betätigen. Ohne RTC würde es auch gehen, könnte jedoch Probleme geben, wenn du um 0Uhr immer reseten möchtest.

Software Reset ist auch möglich:

http://www.nongnu.org/avr-libc/user-manual/FAQ.html#faq_softreset

Software Reset ist auch möglich:

Öhmm...
Ein Prozessorreset hilft nicht.
Der Ethernetcontroller muss neu gestartet werden.
Denn dieser macht die Sorgen.

Mhh, ja stimmt.

Dann könnte man mal schauen ob der Reset Pin des Ethernet Controllers mit dem Arduino Reset Pin verbunden ist. Sollte eigentlich der Fall sein, aber wer weiß....

Außerdem hat das Ethernet Shield einen Reset Knopf, der gleichzeitig den Arduino rettetet. Da kann man auch was basteln, damit man das über einen Pin schaltet.

Hallo,
Danke für die Antworten.
Wie ich den Reset dann praktisch durchführen könnte, ist mir klar.

Die ursprüngliche Frage war ja, wie kann ich ermitteln (z.Bsp. mit einem periodischen Ping zum Router?), ob ein Reset überhaupt notwendig ist?

MfG paulinchen

Hallo,
vielleicht hast Du Dich ein wenig unglücklich ausgedrückt, "Lebensdauer"

Das was Du suchst ist eine Fehlerabfrage.
Ich habe keine Ahnung, was Du für ein Shield benutzt- noch welches Protokoll.
Es ist doch so- der Arduino sendet "etwas" zum Shield.
Wenn das Shield "etwas" empfangen hat, dann sendet es zum Arduino "sende das nächste"

Wenn der Arduino "sende das nächste" nicht erhält, dann liegt ein Fehler vor- diesen mußt Du abfragen.
Zwischen Shield und Router läuft es genau so.
Was genau Du da abfragen mußt, sollte dem Sketch und auch der Dokumentation der Lib zu entnehmen sein.
Gruß und Spaß
Andreas

Hallo,
ich habe mal den Titel angepasst, Danke für die Info...

Morgen werde ich mal versuchen, eine periodische Ping-Abfrage einzubauen.

MfG Paulinchen

Sehe aber keinen Vorteil, eine periodische ping Abfrage zu starten! Das Problem wird sein, wenn sich die EthKarte nach bei einem Ping nicht meldet, dass du ihn auch nicht einfach so mehr neustarten kannst. Dein Atmega hängt sich auf, nicht umbedingt das EthernetShield.

Hallo,
also Fehlerabfragen liegt Dir nicht. Dann probiere einmal etwas anderes...
Du hast doch sicher einen Sketch, der auf dem Arduino arbeitet?
Fang doch mal ab, wann und wo dieser Fehler auftaucht, einfach mit Serial.println
Dein Sketch:

  1. Zeile
    Serial.print("1. Zeile ");
    Serial.println(Time);

  2. Zeile
    Serial.print("10. Zeile ");
    Serial.println(Time);

  3. Zeile
    Serial.print("20. Zeile ");
    Serial.println(Time);

den Webserver läßt Du den "Verkehr" auch protokollieren.
So könntest Du es einmal eingrenzen.
Auch der Webserver sendet etwas zum Arduino, da könntest Du auch einen "Stempel" setzen.

Im übrigen ist es so, dass Du mit etwas wenig "technischer/Sketch/Information" hier etwas zu lösen versuchst.

"ist die Zuverlässigkeit des Ethernet-Shields ja etwas heikel"
Das sehe ich nicht so, wenn Du danach suchst, dann wirst Du etwas finden. Es melden sich aber nur Die, die Probleme damit haben.
Die, bei denen es läuft, melden sich nicht- und das wird der größte Teil sein.

Ping`s kannst Du bis ans Ende Deiner Tage senden, aber dem Fehler kommst Du damit nicht auf die Schliche. Damit kannst Du
feststellen, geht, geht- geht nicht. Und dann? Reset, und wieder von vorne?
Gruß und Spaß
Andreas

sschultewolter:
Sehe aber keinen Vorteil, eine periodische ping Abfrage zu starten! Das Problem wird sein, wenn sich die EthKarte nach bei einem Ping nicht meldet, dass du ihn auch nicht einfach so mehr neustarten kannst. Dein Atmega hängt sich auf, nicht umbedingt das EthernetShield.

Der Sketch läuft ja weiter, nur das Ethernet-Shield lässt keine neuen Verbindungen mehr zu.
Ansonsten würde ja der Watchdog auslösen...

Der Sketch ist ja fehlerfrei, und läuft auf 3 identischen Kombis (Mega + Ethernetshild). 1 Kombi läuft seit über 6 Monaten fehlerfrei, bei den 2 anderen friert das Ethernetshild mal nach 3 Tagen, mal nach 2-3 Wochen plötzlich ein. Ich protokoliere schon alles, es ist immer nach einer anderen Aktion (mal nach dem Versand einer E-Mail, mal nach einer NTP-Abfrage und mal nach einem FTP-Zugriff). Die letzte Aktion wird aber immer noch korrekt ausgeführt, nur der nächste Zugriff auf das Ethernet geht dann nicht mehr...

Ich habe jetzt die Ping-Abfrage zum Router eingebaut (1x pro Minute) und falls dabei ein Fehler auftritt, schreibe ich eine Meldung in meine LOG-Datei und starte das Ethernetshield mit "Ethernet.begin()" neu.

Mal sehen, wie oft das jetzt auftritt und was nach dem "Neustart" passiert...

MfG paulinchen