ESP8266 reset loop LCD Menü

Woran kann es liegen, dass der Wemos D1 (oder auch andere) permanent rebooten? Hello World test Sketch funktioniert, wenn aber das Menü von Jomelo drauf ist, rebootet der. Delay 10 Sekunden im loop und setup probiert, wifi.mode OFF hab ich auch probiert.

Debugmeldungen aktivieren, und auch beobachten, an GPIO2 horchen.

Und er wird dir sagen, aus welchem Grund er seinen Reset macht. Glaube ihm!

wenn aber das Menü von Jomelo drauf ist,

Bahnhof!

Genau die Meldung ist gemeint!

  1. Du hast kein Reset Problem!
  2. Du hast ein Exception Problem!

Der Reset folgt nur zwangsläufig auf die Exception.

,rst cause:2,

Da wird dir der Resetgrund genannt.

Es gibt einen Exception Decoder für die IDE, der zeigt dir wo es klemmt.

Es hat zuerst wdt reset angezeigt, dann drück ich den Reset oder öffne den Serial Monitor nochmal und dann zeigt diese Meldung an.

Es hat zuerst wdt reset angezeigt,

Dann glaube auch das! Korrigiere den Code, so dass der WDT nicht mehr zuschlägt.

Trotzdem darf die Exception nicht geworfen werden. Analysiere die Exception.


Stromversorgung? Schaltplan? Code?

Hab schon gesucht wie man den Watchdog ausschalten kann, weiß nicht wozu der ist und wie man den ausschaltet. Wahrscheinlich ist der dazu da um automatisch zu resetten wenn das Programm nicht mehr reagiert. Was könnte an dem Code nicht richtig sein, wenn du meinst man soll da was korrigieren? ESP.wdtfeeder (oder sowas in der Art) hab ich auch schon probiert.

Den WDT kann man nicht abschalten. Sorge dafür, dass loop häufig durchlaufen wird. Unter 20ms. Ist das nicht möglich, dann in lang laufende Schleifen yield() oder delay(0) einstreuen

Was könnte an dem Code nicht richtig sein, wenn du meinst man soll da was korrigieren?

Schau doch bitte mal in Zeile 42 nach! Meist klemmt es da...

Kann es sein, dass Du das Board nur am USB-Anschluss betreibst (ohne ext. Stromquelle)? Ich hatte nämlich bei einem nackten ESP8266-01 genau die gleichen Probleme/Fehlermeldungen, bis ich es an eine stabile 3.3 Stromquelle angeschlossen hatte.

Ja, am PC und Ladegerät mit 2.1A Das war mein erster Gedanke, also Stepdown angeschlossen, dasselbe. Im Setup hab ich noch lcd.print ausgabe, im loop macht der nen reset.

combie: Schau doch bitte mal in Zeile 42 nach! Meist klemmt es da...

In welcher Datei?

https://github.com/Jomelo/LCDMenuLib Ich nimm das Beispiel I2C, mit kleinen änderungen:

LiquidCrystal_I2C lcd(0x27, 16, 2); // Set the LCD I2C address

// LCD Begin lcd.begin();

In welcher Datei?

;-)

Habe die Lib mal ein klein wenig untersucht.... Kann schwer einschätzen, ob sie überhaupt mit dem ESP funktioniert.

Was sagen die Exceptions? Wo werden sie geworfen? Immer an der gleichen Stelle?

Ich weiß noch nicht mal was ist es, wie es entsteht usw.

Dass mit der Zeile 42 hab ich also richtig verstanden :D

Ich denke es hängt an den Makros.

Ich weiß noch nicht mal was ist es, wie es entsteht usw.

Was das ist? Da kannst du dich kundig machen! :o Ich muss das nicht mehr, ich weiß das schon :o

Und wie es entsteht? Die Ausnahme wird geworfen! Beispiel:

throw std::invalid_argument("Fehlergrund");

Vermutlich in irgendeiner Funktion. Wohl nicht in deinem Code Wohl nicht in der MenuLib In den Arduino Funktionen? In dem vorkompilierten ESP Gedöns? KA!

Und darum interessiert mich brennend WO sie geworfen wird! Ich kann die Exception nicht auswerten, aber du. Dir ist die Exception, dir ist der Quellcode. Es ist deine IDE!

Ein bisschen habe ich das Gefühl, du möchtest gar nicht wissen, wo sie, warum sie, geworfen wird... Was ich aber gar nicht verstehe, denn andererseits machst du den Eindruck, als würde dich der Fehler stören und du möchtest ihn beheben.

Ich wiederhole mich einfach nochmal, vielleicht hast du das ja übersehen:

Es gibt einen Exception Decoder für die IDE, der zeigt dir wo es klemmt.

Und ich möchte dich bitten, diesen Dekoder in deine IDE zu integrieren, und dann damit die Meldung auszuwerten.

Ich habe den Dekoder integriert, aber für die Auswertung sind zusätzlich die Dateien im Temp Ordner nötig. Die hast nur du.

Ich denke es hängt an den Makros.

Mag sein.... KA.. Das schlimme am spekulieren ist immer, dass man sich da vertun kann, und dann muss man einen Irrtum eingestehen. Eingestehen, dass man in die falsche Richtung gelaufen ist. Und noch schlimmer: Umdenken! usw. Dafür bin ich zu faul.

Aber andererseits sind der AVR und ESP grundsätzlich unterschiedlich. Und ich habe keine Ahnung, ob die Menulib je damit getestet wurde.

Mensch, sag doch dass es ne extra installierbare Funktion ist, ich hab doch kein Plan davon :D Ich bin grad dabei.

Lesetipp: https://github.com/esp8266/Arduino/blob/master/doc/exception_causes.md Es ist auf jeden Fall eine spannende Exception!

Was muss ich denn da einfügen, dass zwischen

stack>>> <<<stack<<<

Decoding 4 results
0x40203312: LCDMenuLib::display() at /Arduino/libraries/LCDMenuLib/src/LCDMenuLib.cpp line 564
0x40202a8a: setup at /Arduino/libraries/LCDMenuLib/examples/LCDML_DISPLAYTYPE/LCDML_i2c_display/LCDML_CONTROL.ino line 44
0x40203b44: loop_wrapper at /Arduino15/packages/esp8266/hardware/esp8266/2.3.0/cores/esp8266/core_esp8266_main.cpp line 56
0x40100114: cont_norm at /Arduino15/packages/esp8266/hardware/esp8266/2.3.0/cores/esp8266/cont.S line 109

oder das nach Exception (28):

Decoding 1 results
0x40203ebf: strncpy_P(char*, char const*, unsigned int at /Arduino15/packages/esp8266/hardware/esp8266/2.3.0/cores/esp8266/pgmspace.cpp line 155

Das finde ich interessant: esp8266_reset_causes_and_common_fatal_exception_causes_en

Exceptions.png

Was muss ich denn da einfügen

Nunja…
Teile der Meldung!

oder das nach Exception (28):

Decoding 1 results
0x40203ebf: strncpy_P(char*, char const*, unsigned int at /Arduino15/packages/esp8266/hardware/esp8266/2.3.0/cores/esp8266/pgmspace.cpp line 155

Das ist doch schon mal ganz gut!

Ich schließe daraus:
Die Exception wird in strncpy_P() geworfen, bzw. in einer darunter liegenden Schicht.

Wenn man annimmt, dass strncpy_P() ausreichend getestet wurde, und OK ist, wird da ein Problem mit der Adresse oder dem Speicher an sich vor liegen. Der ESP hat da so seine Eigenheiten.

Und ja, das auslagern von Strings im Flash, funktioniert bei beiden Prozessoren(ESP vs. AVR) gänzlich unterschiedlich.

dass zwischen

stack>>> <<<stack<<<

Auch da steckt durchaus wichtige Information drin!
Die Aufrufhierarchie .
Also, auf welchem Wege zum Fehler gelaufen wurde.
Dröselt man den den Weg rückwärts auf, besteht Chance auf den Fehler zu stoßen.

Nachtrag:
In der Lib wird an 2 Stellen include <avr/pgmspace.h> gemacht.
Für mich ein klares Zeichen, dass die Lib für den AVR vorgesehen ist.
Warum der Kompiler da nicht mit einem fatalen Fehler abbricht ist mir erstmal ein Rätsel.

deswegen:

#if defined ( ESP8266 )
#include <pgmspace.h>
#else
#include <avr/pgmspace.h>
#endif

kleine Modifikation von mir.

Bekomme aber trotzdem ne Meldung:
WARNUNG: Bibliothek LCDMenuLib behauptet auf [avr] Architektur(en) ausgeführt werden zu können und ist möglicherweise inkompatibel mit Ihrem derzeitigen Board, welches auf [esp8266] Architektur(en) ausgeführt wird.

Kompilieren lässt es sich, im Setup komme ich bis booting1, dann reset.

    // LCD Begin
    lcd.begin();  
    
    lcd.home ();                   // go home       
    // set special chars for scrollbar
    lcd.createChar(0, (uint8_t*)scroll_bar[0]);
    lcd.createChar(1, (uint8_t*)scroll_bar[1]);
    lcd.createChar(2, (uint8_t*)scroll_bar[2]);
    lcd.createChar(3, (uint8_t*)scroll_bar[3]);
    lcd.createChar(4, (uint8_t*)scroll_bar[4]);
    lcd.setCursor(0,0);
    lcd.print(F("booting"));
  
    // Enable all items with _LCDML_G1
    LCDML_DISP_groupEnable(_LCDML_G1); // enable group 1
    lcd.print(F("booting1"));
    // LCDMenu Setup
    LCDML_setup(_LCDML_BACK_cnt);  
  lcd.print(F("booting2"));
  }

Die gute alte Salami Taktik ......

Nee... ich gebe an dieser Stelle auf.

Für mich sehe ich keinen Sinn darin, die Lib, für dich, auf den ESP umzubauen. Vielleicht könnte ich es, aber es ist mir zuviel Arbeit das alles zu durchdringen. Da bin ich u.U. lange Tage mit beschäftigt. Außerdem fehlt mir ein solches Display, kann also gar nicht testen, usw....

Das ist eine Arbeit für den Ersteller der Lib. Und der wird sich schon was dabei gedacht haben, wenn er sagt "AVR only"