wdt reset load 0x4010f000, len 1384, room 16 tail 8 chksum 0x2d csum 0x2d v951ae

Hallo Experten, :slight_smile:
Ich brauche bitte eure Hilfe bzw. Unterstützung.
Mein Sketch verbindet sich mit einem NTP Server und syncronisiert die Uhrezit, wertet sie aus und wählt ein Wahlprogramm wo ein Ausgang geschaltet wird.
Interessanterweise funktioniert der Sketch aber NUR wenn ich die Funktion wahlprogramm_test() NICHT kommentiert habe. Ansonsten bekomme ich nämlich den im Betreff erwähnten Fehler und das Programm startet von neuem.
Zudem habe ich bemerkt, dass der Sketch bei Ausfall der WLAN Verbindung weiterläuft ABER leider nach einer Zeit interessanter weise resetiert wird…
Keine Ahnung ob die beiden Porbleme zusammenhängen. :confused:
Hat jemand von euch eine Ahnung wo der Fehler sein könnte?
Dass der Programmierstil nicht dem eines Profis entspricht ist mir klar. Es ist zZ nur eine “Rohfassung”. Eventuelle Tipps und Verbesserungsvorschläge sind aber dennoch immer gerne willkommen.
Wäre euch sehr dankbar!!! Danke.

main.cpp (20.3 KB)

    do {
      a = random(-1, 2);
    } while (a == 0);

Lang laufende Schleifen sind immer böse.
Und diese hat keine garantierte Abbruchbedingung.

Wenn loop nicht früh genug beendet wird, findet ein WDC Reset statt.

Alternativ:
Man ruft zwischendurch delay() oder yield() auf.

Hier schlägt ein Watchdog zu...
upps.: zu langsam... :wink:

Der Code passt nicht zur Beschreibung: wahlprogramm_1 gibt es darin nicht.

Gruß Tommy

Ein wahlprogramm_1() gibt es nicht. Ich nehme mal an du meinst ..._test()

& und && sind zwei verschiedene Dinge. Das eine ist eine Bit-weise Verknüpfung. Das andere ist eine logische Verknüpfung. Da kann das Gleiche herauskommen, aber muss nicht

Bei einem der Fälle im switch/case fehlt das break. Wenn das Absicht ist sollte man es vielleicht dazuschreiben

Vielen Dank für eure raschen und hilfreichen Informationen bzw. Hinweise!
Habe die Datei im Eingangspost abgeändert.
Wie aber bereits erwähnt, nur komisch, dass interessanterweise der Sketch funktioniert aber NUR wenn ich die Funktion wahlprogramm_test() NICHT kommentiert habe. Ansonsten bekomme ich nämlich den im Betreff erwähnten wdt Fehler und das Programm startet von neuem.... ::slight_smile:

@Combie:
Ups, Danke für deinen Hinweis. Da hast du vollkommen recht! Wie würdest du es eleganter lösen?

@Tommy56:
Danke für den Hinweis. Mein Fehler. Hab es korrigiert.

@Serenifly:
Danke für den Hinweis. Mein Fehler. Hab es korrigiert.
Ja das break habe ich leider vergessen. Danke für den Hinweis!
Danke für den Hinweis zwischen & und &&. Ich werde es korrigieren.

Wie aber bereits erwähnt, nur komisch, dass interessanterweise der Sketch funktioniert aber NUR wenn ich die Funktion wahlprogramm_test() NICHT kommentiert habe.

Du sprichst in Rätseln.
Kommentare haben keinen Einfluss auf das Laufzeitverhalten.

@Combie:
Ups, Danke für deinen Hinweis. Da hast du vollkommen recht! Wie würdest du es eleganter lösen?

Was denn?
Was gibts da überhaupt zu lösen?

Ich habe keine blasse Ahnung, was du mit dem Code erreichen möchtest.
Null!

Ja das ist mir schon klar, dass Kommentare keinen Einfluss auf das Laufzeitverhalten haben. Unso mehr vestehe ich nicht, dass wenn ich die Funktion wahlprogramm_test() ausklammere, dass das ganze Programm dann nicht läuft und bei der NTP Verbindung hängen bleibt…

Du hast mir ja den Hinweis gegeben, dass die folgenden Codezeilen nicht unbedingt ideal sind bezüglich garantierter Abbruchbedingung und wdt. Daher habe ich mir erklaubt dich zu fragen, wo du es eleganter lösen würdest. Ich möchte nämlich mit einer Funktion random mäßig eine -1 oder 1 ermitteln:

 do {
      a = random(-1, 2);
    } while (a == 0);

Hi

a=(random(255)>=127)?1:-1;

MfG

Danke postmaster-ino.
So gehts naürlich auch. 8)
Wie man sieht, ich hab zu fokusiert gedacht...

Zurückzukommen auf mein Problem:
Wie aber bereits erwähnt, nur komisch, dass interessanterweise der Sketch funktioniert aber NUR wenn ich die Funktion wahlprogramm_test() bzw den Funktionsaufruf NICHT kommentiert habe. Ansonsten bekomme ich nämlich den im Betreff erwähnten wdt Fehler und das Programm startet von neuem.... ::slight_smile:
Für mich nicht verständlich, da ja zum einen kommentierter Text nicht auf das Laufzeitverhalten Einfluss nimmt und zum anderen die Funktion wahlprogramm_test() keine "besonderen" Programmzeilen beinhaltet, meiner Meinung nach. Verwende einen Nodemcu.

Zu meinem Verständniss:
Du beziehst Dich hier auf diesen Teil des Codes?

   case wahlprogramm_0:
   //wahlprogramm_test();
   state = taster_abfrage_0;
   break;

Wenn Auskommentiert, dann Fehler?

Spricht dafür, dass in dem entsprechenden Unterprogramm **wahlprogramm_test();**der Watchdog "gefüttert" wird.

@hajos118:
Ganz genau. Dieser Teil des Codes ist gemeint.
Nein, interessanter weise genau das Gegenteil, dh. Wenn ich wahlprogramm_test() kommentiert habe funktioniert es nicht und bleibt bei folgender seriellen Ausgabe hängen und nach einer Zeit macht der Nodemcu ein Reset

....Connected: yes

Verbunden mit: FRITZ!Box XXXX
IP Adresse: XXXXXXXX
Starting UDP

Wenn ich es nicht kommentiert habe, funktioniert es ohne Probleme.
Für mich nicht nachvollziehbar. Daher habe ich mich an euch Experten gewannt.
Könnte es sein, dass ich irgendwo ein delay() oder yield() einbauen müsste?
zB auf dieser Iternetseite, dass zB "im Zweifel bei Schleifen die länger als 20ms dauern, zumindest ein yield oder delay einfügen."
Wie weiß ich wie lange ein Befehl in c/c++ braucht? Ich persönlich kenne leider nur die Zeiten in Asembler...

hajos118:
Wenn Auskommentiert, dann Fehler?

LOOIIS:
Nein, interessanter weise genau das Gegenteil,
dh. Wenn ich wahlprogramm_test() kommentiert habe funktioniert es nicht und bleibt bei folgender seriellen Ausgabe hängen...

Das Gleiche ist das Gegenteil? Du verwirrst mich.

Ja stimmt, sorry habe ich übersehen. Zwei Sachen gleichzeitig wie man sieht geht nicht :grin:
Danke für den Hinweis.
Hoffe, jetzt ist es klar für alle.

hajos118:
Zu meinem Verständniss:
Du beziehst Dich hier auf diesen Teil des Codes?

   case wahlprogramm_0:

//wahlprogramm_test();
  state = taster_abfrage_0;
  break;




Wenn Auskommentiert, dann Fehler?

Spricht dafür, dass in dem entsprechenden Unterprogramm **wahlprogramm_test();**der Watchdog "gefüttert" wird.

Aber wie ist das möglich, wenn ich das Unterprogramm auskommentiert habe?

Das Unterprogramm könnte den Zustand so verändern, dass später keine Endlosschleife (nach WDT-Maßstäben) betreten wird, oder

hajos118:
Spricht dafür, dass in dem entsprechenden Unterprogramm **wahlprogramm_test();**der Watchdog "gefüttert" wird.

LOOIIS:
Könnte es sein, dass ich irgendwo ein delay() oder yield() einbauen müsste?

Sollte das für einen Sketch notwendig sein um ihn am laufen zu halten, ist der Programmablauf meist schon falsch konzipiert!

int helligkeitsabfrage_1() {

  return 1;
}

Was erwartest du eigentlich nach dem Aufruf der Funktion "helligkeitsabfrage_1()" als Rückgabewert?

   if (helligkeitsabfrage_1() == 1) {
    state = wahlprogramm_0;
   }
   else {
    state = wahlprogramm_0;
   }

if
else

HÄ?

"wahlprogramm_0" ansonsten "wahlprogramm_0"

Klingt wie Freie Auswahl? (Losbude)

Gruß Fips

Hallo Derfips,
Wie bereits anfangs erwähnt handelt es sich bei meinem Code um eine "Rohfassung", welche step by step ausgebaut werden soll. Leider hämmt mein erwähntes Problem aber meinen Forschritt ein....

if (helligkeitsabfrage_1() == 1) {
state = wahlprogramm_0;
}
else {
state = wahlprogramm_0;
}

Dass die obigen Programmzeilen bei

int helligkeitsabfrage_1() {

return 1;
}

nicht ganz verständlich ist, ist mir schon klar und wie erwähnt wird das ganze noch ausgebaut daher habe ich das "else" bereits eingebaut.

Leider hämmt mein erwähntes Problem aber meinen Forschritt ein....

Darf ich ehrlich sein?

Es ist dein unaufgeräumter Code, welcher dir einen Stock in die Speichen schiebt.
Zumindest mich hält er vom verstehen des Ganzen ab.
(und ich bin ganz sicher kein kleiner Idiot in solchen Dingen)

Beispiel:

wahlprogramm_0
wahlprogramm_1

Zum verwechseln ähnlich.

Könntest du nicht auf das Switch-case und auch das enum ganz verzichten, in dem du deine Statemachine/Schrittkette mit Funktionspointern aufbaust?

Dann verschwinden die _0 und _1.
Wobei es aus meiner Sicht sowieso (eigentlich immer) eine dumme Idee ist Dinge zu nummerieren.

Weiterer Tipp:
Die einzelnen Abläufe so lose koppeln, dass du einzelne Teile aus dem Programm entfernen kannst, ohne dass dir der Kram sofort ganz zerfällt.

Und noch einer:
Programmfluss- und Datenflussdiagramme zeichnen.

Hallo combie,
bin relativ neu im Bereich Programmierung und bin daher für jede konstruktive Unterstützung und Tipps sehr dankbar.
Finde es schön, wenn Leute wie du uns Leihen weiterhilft!
Also werde ich versuchen meine Statemachine/Schrittkette mit Funktionspointern aufzubauen.
Könntest du mir ggf. bitte ein kurzes Beispiel machen wie so etwas aussehen kann? Wenn möglich auf Basis auf mein Programm...
Werde auch versuchen deinem Tipp bezüglich die "Abläufe lose zu koppeln" zu berücksichtigen. Wie könnte so etwas aussehen? Habe das schon vesucht durch die switch case - Schrittkette umzusetzen. Wie man sieht nicht mit Erfolg...
Den Programmfluss- und Datenflussdiagramme habe ich gezeichnet und diesen anschließend mit dem switch case Ablauf versucht umzusetzen.
Sorry für die Fragen aber aller Anfang ist nicht leicht und die richtige einfache Literatur habe ich diesbezüglich noch nicht gefunden. Ich hoffe ihr habt Verständnis!
Danke nochmals für eure Hilfe und Geduld!

Könntest du mir ggf. bitte ein kurzes Beispiel machen wie so etwas aussehen kann? Wenn möglich auf Basis auf mein Programm...

Ein Beispiel habe ich im Köcher, aber dein Programm schreibe ich nicht um.

Aus meiner Wühlkiste:

// ein Blinkautomat 


using StateFunctionPointer = void (*)(); // Typedefinition

// Prototypes
void startState();
void toggleState();
void waitState();


const unsigned long interval  = 500; // ms
unsigned long timeStamp; // ms
StateFunctionPointer state = startState;



void toggleState()
{
  digitalWrite(LED_BUILTIN, not digitalRead(LED_BUILTIN));
  timeStamp = millis();
  state = waitState;
}

void waitState()
{
  if(millis() - timeStamp >= interval)
  {
    state = toggleState;
  }
}

void startState()
{
  pinMode(LED_BUILTIN,OUTPUT);
  state = toggleState;
}




void setup() 
{
}

void loop() 
{
 state(); 
}