Arduino 2560 läuft instabil, resettet automatisch

Hallo,
ich arbeite jetzt seit ca. 3 Monaten mit meinem Arduino, mein Programm ist mittlerweile recht umfangreich geworden und läuft an sich sehr gut. Nur habe ich leider das Problem, dass sich Mein Arduino hin und wieder verabschiedet und resettet. Bevor Fragen aufkommen, ja es ist ein Resett da meine void setup() mit einem Willkommensbildschirm auf dem Display abläuft. Das ist auch kein Spezieller Abschnitt im Programm, es passiert in den unterschiedlichsten Situationen.
Nun meine Frage, welche Gründe gibt es, das der Resett durchgeführt wird?
Ich kenne bisher nur folgende 3:
den Kurzschluss zwischen Resett und GND
den Kurzschluss zwischen 5V und GND
Softwareresett beim Starten der Seriellen Kommunikation (mittels Widerstand zwischen 5V und GND deaktiviert)

Welche möglichkeiten gibt es noch?
RAM voll vielleicht?

Der Resett ist teilweise echt nervig ich weiß aber nicht wo ich mit der Fehlersuche anfangen soll da die 3 Möglichkeiten die ich kenne bereits unterbunden sind. Was kann es also noch sein, was zum Resett führt?

Vielen Dank schon mal für alle hilfreichen Tips

Bricht dir eventuell die Spannung ein? Was hängt alles an deinem Arduino?

Danek schonmal für die fixe Antwort,
aber nein habe eig keine Verbraucher, 4 Spannungseingänge die gemessen werden also kein Verbrauch, 3 Temperatursensoren minimaler Verbrauch, ein LCD (4x16) wohl der größte abnehmer^^, ein paar Taster und 2 LED's also alles keine großen Stromfresser...
Außerdem hängt es an einem Netzteil 12V 1A
Das reicht also auch locker.

Was gibt es noch für Resetgründe?

Da wäre ich mir nicht so sicher daß Du wenig Stromverbrauch hast.
Welche Temperatursensoren verwendest Du und wie sind sie angeschlossen?
Das LCD hat eine Hintergrundbeleuchtung? Welchse LCD und wie hast Du die Hintergrundbeleuchtung angeschlossen?
Hast Du Vorwiderstände an den LED?
Wird der Spannungsstabilisator auf dem Arduino heiß?
Grüße Uwe

Temperatursensoren sind folgende:
http://www.reichelt.de/Sensoren/KTY-81-120/3/index.html?;ACTION=3;LA=3;ARTICLE=9595;GROUPID=3190;SID=10T-1t4H8AAAIAACKbP5E19bc7d6faee23d6506e9e2545d01d099
Angeschlossen in reihe mit 6k Widerstand an einen Digital Pin und an GND, dazwischen natürlich der Analogpin. Die Digitalen Pins werden nur zur Messung einmal pro sekunde unter strom gesetzt. und naach der messung wieder auf 0. Um eigenerwärmung zu verhindern.
LCD hat eine LED-Hintergrundbeleuchtung mit 4k Vorwiderstand.
Die anderen LED's haben 2K Potis als vorwiderstände um die Helligkeit zu regulieren. Müsste ich erst messen wie groß genau ich tippe mal ich bin bei 1,1k da sind sie LED's aber auch recht dunkel...
Der Spannungsstabilisator ist der über der externen Stromversorgung richtig? Also rechts 3 Lötstellen links eine breite, das ist er oder?
Also das Teil wird jedenfalls schon recht warm... Nicht gut? Heißt was?
Edit: Hab grad nachgemessen 47°C

Wenn Dein Sketch umfangreich ist, könnte auch der RAM-Verbrauch anständig gross werden und somit das RAM überlaufen lassen, was auch zu einem Reset führt. Poste mal Deinen Sketch, vielleicht finden wir einfach umzusetzende Veränderungen, die den RAM-Verbrauch mindern.

Ein RAM-Überlauf führt in den seltesten Fällen zu einem Reset. Normalerweise zu unerlärlichen Reaktionen des Arduino.

Ich bezweifle daß die Hintergrundbeleuchtung mit 4 kOhm angesteuert wird. Das wären bei 5V gerade mal ca 0,5mA. Bist Du sicher daß es nicht 4 Ohm sind? Welches Display hast Du?
47 Grad sind unbedenklich.

Grüße Uwe

Guten Morgen,
ich habe das Display hier:
http://www.reichelt.de/Hintergrund-blau/LCD-164A-BL/3/index.html?;ACTION=3;LA=2;ARTICLE=53942;GROUPID=3006;artnr=LCD+164A+BL;SID=10T-1t4H8AAAIAACKbP5E19bc7d6faee23d6506e9e2545d01d099

Hatte erst nen 10k Poti dran und habe mir die Helligkeit gewünscht eingestellt und da kamen eben 4k raus, nun eben durch nen normalen widerstand ersetzt. Es sind ganz sicher 4k habe gestern ja auch nachgemessen. Und der Strom liegt bei 0,63mA (gemessen) Ist wirklich nich viel ich weiß aber das is hell genug. Angegeben ist es mit 15 - 60mA habs auch grad nochmal mit 110 Ohm getestet, macht rund 17mA aber dann blendet das ding ja schon...
Habe eben auch mal den Strom aus eingang gemessen, 85mA, 12V also 1W sprich maximal 200mA bei 5V für das ganze System, mehr is nich..

Aber um noch mal zu meiner Frage zurück zu kommen, welche Resettmöglichkeiten es gibt wir haben:
den Kurzschluss zwischen Resett und GND --> nicht der Fall
den Kurzschluss zwischen 5V und GND --> nicht der Fall
Softwareresett beim Starten der Seriellen Kommunikation --> mit Widerstand verhindert und es passiert auch ohne USB-Kabel
zu hoher Stromverbrauch --> gemessen, ist denke ich nicht der Fall
RAM-Überlauf (in seltesten Fällen) --> Weiß ich nicht

Gibt es noch weitere Resett-Gründe ? Sonst muss es ja der RAM sein oder?

Resetgründe sind auch Unterspannung (siehe 12.2.3 Brown-out Detection (BOD) im Datenblatt) Die Unterspannung kann auch nur sehr kurzzeitig sein, sodaß man sie weder mit einem Multimeter noch mit einem erschwinglichen Oszyloskop messen kann.
12.2 Reset Sources im Datenblatt listet 5 Resetquellen auf:
Einschalt-Reset
Reset-Pin
Watchdog
BOD (Unterspannung)
JTAG AVR Reset

Ich kann es nicht glauben, daß Du die Hintergrundbeleuchtung mit 0,6mA betreibst und die LED Licht abgeben. Im Datenblatt werden 20 bis 60mA bei Uf 4,6V für das EA W164B-NLW angegeben.

Wie verhält sich der Arduino, wenn Du ihn über USB mit Strom versorgst?

Grüße Uwe

Ich kann es nicht glauben, daß Du die Hintergrundbeleuchtung mit 0,6mA betreibst und die LED Licht abgeben. Im Datenblatt werden 20 bis 60mA bei Uf 4,6V für das EA W164B-NLW angegeben.

Ja ich habe das auch gelesen und du hast recht 0,6mA is nix aber es ist bei normalem Tageslicht mehr als ausreichend hell und im ernst bei 20mA ist es extrem hell, völlig unnötig, da kann ich das Ding im Freien mit vollster Sonne aufm Display lesen! Bei 60mA habe ich noch nicht getestet aber dann wirds mir wohl die augen verblitzen^^

Mit dem Spannungsabfall wäre echt noch ne Möglichkeit aber leider habe ich wie du dir schon dachtest habe ich keinen high-tech oszi
Kann ich das irgenwie anders testen?

Bei der Versorgung nur über USB ist nichts anders gleiche Probleme. mir fällt nur auf wenn ich die serielle Kommunikation mit dem PC starte ist er etwas anfälliger, dann kommt es schneller mal zu einem resett. Aber wie gesagt auch ganz ohne USB-Kabel passiert es hin und wieder

Ich werd noch wahnsinnig sonst funktioniert doch alles :frowning:

Ein RAM-Überlauf führt in den seltesten Fällen zu einem Reset.

Na, dann habe ich mehrere der sehr seltenen Arduinos bei mir rumliegen, die resetten relativ zuverlässig bei Speicherüberläufen, Freezes sind eher die Ausnahme. Bei der Symptombeschreibung würde ich es auf jeden Fall nicht ausschliessen. Kann es schaden, wenn wir den Sketch mal darauf untersuchen?

Die Unterspannung kann auch nur sehr kurzzeitig sein, sodaß man sie weder mit einem Multimeter noch mit einem erschwinglichen Oszyloskop messen kann.

Denkst Du nicht, dass die Kondensatoren bei der Stromversorgung Spannungsschwankungen von so kurzer Dauer, dass sie von einem normalen Scope nicht mehr gemessen werden können, ausgleichen können?
Zudem ist die maximal einstellbare Spannung für die BODLEVEL Fuses 4.3V mit einer maximalen Ansprechspannung von 4.5V. Ein Absinken der Spannung auf unter 4.5V sollte mit einem handelsüblichen Scope detektiert werden können, auch wenn es kaum eine Mikrosekunden dauert.

Na, dann habe ich mehrere der sehr seltenen Arduinos bei mir rumliegen, die resetten relativ zuverlässig bei Speicherüberläufen, Freezes sind eher die Ausnahme. Bei der Symptombeschreibung würde ich es auf jeden Fall nicht ausschliessen. Kann es schaden, wenn wir den Sketch mal darauf untersuchen?

Ich hatte das auch als erstes in Verdacht, hatte es aber wegen der angesprochenen seltenheit etwas verworfen da es manhcmal rehct oft passiert. Grund des Verdachts ist meine große menge an Variablen / Arrays die permanent mit aktuellen Werten überschrieben werden. Kennt der Arduino einen Befehl der den Speicherzustand des RAM's zurück gibt? Oder wie stellt man das am besten fest?

Hier meine ganzen Variablen(damit ihr wahrscheinlich gleich sagt das es zu viel für den gutsten ist^^):

  int temp[3];
  int minTemp[3];                         
  int maxTemp[3];                         
  int minTempLog[3][2];                   
  int maxTempLog[3][2];                   

  float span[4];                          
  float minSpan[4];                      
  float maxSpan[4];                                                 
  float minSpanLog[4][2];             
  float maxSpanLog[4][2];            
  
  boolean vz[4];
  boolean logger = false;                     
  boolean sprache = false;                  
  boolean watchdog = true;                
  boolean grenze = false;                   
  boolean notschalter = false;             
  boolean notfall = false;                
  
  int menu[4];                              
  int linksTaster, rechtsTaster, hochTaster, runterTaster = 0;                    
  int lastLinksTaster, lastRechtsTaster, lastHochTaster, lastRunterTaster = 0;
  
  int startzeit = 0;                           
  int testzeit = 0;                            
  int logZeit = 0;                               
  int menutimer = 0;                               
  int laufzeit = 0;                             
  long messtimer = 0;                          
  long pctimer = 0;                               
  long anzeigetimer = 0;                      
  
  String test;                                      
  String warnungT[3];                              
  String warnungS[4];                              
  String warnungW = "K";                        
  String statusWD;                               
  int counter = 0;                            
  int fehler[8];                                    
  int z = 0;

Gibst du über dein Dispaly auch Texte aus? Verwendest du PROGMEM dazu?

Schau mal hier nach:

http://www.arduino.cc/playground/Code/AvailableMemory

Ein zu großer Kondensator auf der Versorgungspannung sorgt für Startprobleme des Arduino. (aufgefallen mit 470µF bei einem Arduino NANO V3)
Versuch mal einzelne Komponenten (Display, LED, Taster zu entfernen) und zu kontrollieren ob der Fehler trotzdem auftritt.

@pylon: einen kurzzeitigen Spannungseinbruch der alle paar Stunden auftritt, ist fast unmöglich mit einem Oszyloskop aufzuzeichnen.

Grüße Uwe

Ich habe mich einfach mal für die einfachste Variante entschieden:

int freeRam () {
extern int __heap_start, *__brkval;
int v;
return (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval);
}

and call it anywhere in your program like that: Serial.println(freeRam());

Ich erhalte einen startwert von 5776 und es geht bis auf 5738 runter niedriger wirds nicht. Aber der Fehler tritt im moment auch nicht auf...

hab zwar auch alles abgezogen und wieder eingesteckt aber wie gesagt der fehler tritt im moment sowieso nicht auf... Was soll ich da noch machen im Moment läufts echt Problemlos... aber ich hab ja nix verändert. Selbst mit permanente kommunikation zwischen arduino und PC klappt alles, keine Fehler, kein Reset...

Was soll ich da jetzt machen. Ich wette morgen treten wieder Fehler auf, der wird nie ein Gehäuse von innen sehen -.-

Mein Entwicklungszeit heute ist leider vorbei, morgen sehe ich weiter. Danke an alle für die zahlreichen tips wem noch was einfällt dem bin ich sehr dankbar ansonsten hoffe ich das ich den Fehler morgen finden und beheben kann...

  String test;                                      
  String warnungT[3];                              
  String warnungS[4];                              
  String warnungW = "K";                        
  String statusWD;

Die String-Klasse solltest Du nicht verwenden. Zum einen zerklüftet sie Deinen Speicher derart, dass selbst bei noch vorhandenem freien Speicher keine genügend grossen Blöcke mehr alloziert werden können. Zum anderen hat die Klasse in den aktuellen Versionen der IDE einen Bug (Memory-Leak), der noch schneller als sonst zu einem Absturz und somit meist zu einem Reset führt.

Die restlichen Variablen sehen nicht auffällig aus.

Vielleicht finden wir noch mehr, wenn Du uns den vollständigen Code zeigst.

@uwefed:

einen kurzzeitigen Spannungseinbruch der alle paar Stunden auftritt, ist fast unmöglich mit einem Oszyloskop aufzuzeichnen.

Stimme ich zu. Mit genügend Aufwand liesse sich eine Umprogrammierung eines PC-Scopes realisieren (sofern ein SDK zur Verfügung steht), aber das liegt ausserhalb des sinnvollen Bereichs.