Forum: Mikrocontroller und Digitale Elektronik Wie kann man Ablauf WDT oder manuellen Reset unterscheiden


von Manu O. (der_heiler)


Lesenswert?

Hi Leute,

nach ewigem Probieren und Googlen seit ihr meine letzte Hoffnung.

Ich habe einen ESP8266 (WemosD1 mini) im Battiebetrieb laufen und im 
DeepSleep für jeweils ca. 1h. Er wacht auf, sendet seine Daten und geht 
wieder schlafen.

Am Gerät selbst befindet sich auch ein Resetknopf, welcher den RST Pin 
beim Drücken gegen Masse schaltet. Drückt man rauf, startet der ESP neu.

Soweit so gut. Funktioniert auch alles, aber:

Nun suche ich nach einer eleganten Lösung zu unterscheiden, ob der 
Wakeup durch das Ablaufen des WDT oder durch den Resetknopf ausgelöst 
wurde.

Hintergrund:
Die Daten werden stündlich an einen Server übermittelt.
Wenn ich auf den RST Button drücke, möchte ich jedoch, dass sich das 
OLED mit anschaltet und ich alle Infos auf diesem angezeigt bekomme. Das 
dauert eine Weile und kostet Strom. Daher sollte es eben auch nur beim 
Drücken des RST Buttons passieren.

Das Problem:
Befindet der ESP sich gerade im Deep Sleep und man drückt den Knopf 
bekomme ich immer den Reset Cause 5=Awake from Deep-sleep.

2 Lösungen habe ich schon gefunden, die aber nicht so dolle sind:

(1) Man drückt den Reset Knopf 2 mal schnell hintereinander. Beim ersten 
Start bekommen man Reset Cause 5=Awake from Deep-sleep, beim zweiten 
Mal, weil der ESP noch nicht im DeepSleep ist, korrekt den Reset Cause 
6=Hardware reset.

(2) Man tauscht den Resetknopf (NO) gegen einen NC aus und lässt die 
Stromversorgung darüber laufen. Das hat zur Folge, dass beim Drücken des 
Knopfes die Versorgungsspannung unterbrochen wird. Beim Loslassen und 
Starten des ESPs bekommt man dann den Reset Cause 0=Power reboot. Hier 
ist das Problem, dass man ca. 0,5s den Strom unterbrechen muss, damit 
der Restart auch sauber ist.

So jetzt strengt mal Eure Murmeln an :) Vielleicht gibts wirklich eine 
coole, verlässliche und intuitive Lösung dafür. Bin für alles dankbar.

: Bearbeitet durch User
von Roland E. (roland0815)


Lesenswert?

Bei vielen Controllern ist der Resetgrund über Register lesbar.

von erlöser (Gast)


Lesenswert?

Manu O. schrieb:
> Vielleicht gibts wirklich eine
> coole, verlässliche und intuitive Lösung dafür.

Ich denke schon. Das Zauberwort heist RTFM.

von Georg (Gast)


Lesenswert?

Roland E. schrieb:
> Bei vielen Controllern ist der Resetgrund über Register lesbar.

Wenn nicht: man schliesst den Resettaster zusätzlich an einen I/O-Pin an 
und liest in gleich als erstes ein.

Georg

von STK500-Besitzer (Gast)


Lesenswert?

Georg schrieb:
> Wenn nicht: man schliesst den Resettaster zusätzlich an einen I/O-Pin an
> und liest in gleich als erstes ein.

Oder setzt ein Registerflag bevor du ihn schlafen legst.
Bei einem Reset sollte das dann nicht gesetzt sein.

von Stefan F. (Gast)


Lesenswert?

Georg schrieb:
> man schliesst den Resettaster zusätzlich an einen I/O-Pin an
> und liest in gleich als erstes ein.

Das wird beim ESP nicht zuverlässig funktionieren, weil er etwa 1 
Sekunde zum Booten braucht.

Manu O. schrieb:
> Nun suche ich nach einer eleganten Lösung zu unterscheiden, ob der
> Wakeup durch das Ablaufen des WDT oder durch den Resetknopf ausgelöst
> wurde.

Lies diese Doku: 
https://www.espressif.com/sites/default/files/documentation/esp8266_reset_causes_and_common_fatal_exception_causes_en.pdf

von Manu O. (der_heiler)


Lesenswert?

erlöser schrieb:
> Manu O. schrieb:
>> Vielleicht gibts wirklich eine
>> coole, verlässliche und intuitive Lösung dafür.
>
> Ich denke schon. Das Zauberwort heist RTFM.

Ernsthaft? Also so kann man sich auch outen keine Ahnung zu haben. :(
Oder geht das etwas konstruktiver. Ich hoffte anhand meiner Beschreibung 
suggeriert zu haben, mich ausgiebig und leider erfolglos mit dem Thema 
beschäftigt zu haben.
Dachte der Sinn von Foren ist es genau in einer Situation in der man 
-warum auch immer- nicht weiterkommt hier auf gesammeltes Wissen 
zugreifen zu können.

von Manu O. (der_heiler)


Lesenswert?

STK500-Besitzer schrieb:
> Georg schrieb:
>> Wenn nicht: man schliesst den Resettaster zusätzlich an einen I/O-Pin an
>> und liest in gleich als erstes ein.
>
> Oder setzt ein Registerflag bevor du ihn schlafen legst.
> Bei einem Reset sollte das dann nicht gesetzt sein.

War auch eine meiner ersten Ideen :) Geht aber nicht, weil der Reset 
erst nach dem Release den Buttons ausgelöst wird und nicht beim Drücken.

Das bedeutet in dem Moment wo der ESP startet ist der Button schon nicht 
mehr gedrückt :)

von Stefan F. (Gast)


Lesenswert?

Manu O. schrieb:
> Ich hoffte anhand meiner Beschreibung
> suggeriert zu haben, mich ausgiebig und leider erfolglos mit dem Thema
> beschäftigt zu haben.

Glaube ich nicht. Das verlinkte PDF habe ich innerhalb 3 Sekunden mit 
Google gefunden, indem ich einfach nur die Stichworte "ESP8266 reset 
cause" eingab.

von RC-Kombi (Gast)


Lesenswert?

Manu O. schrieb:
> Das bedeutet in dem Moment wo der ESP startet ist der Button schon nicht
> mehr gedrückt :)
Ja schon, aber ein C könnte sich das merken. Mit Diode und zwei 
Widerständen für auf- und entladen, ist das eine saubere Lösung.

Viel Erfolg

von Gerald K. (geku)


Lesenswert?

Stefan ⛄ F. schrieb:
> Lies diese Doku:
> 
https://www.espressif.com/sites/default/files/documentation/esp8266_reset_causes_and_common_fatal_exception_causes_en.pdf

Ich denke, dass Stefans Hinweiß zielführend ist.

Siehe:

       1.2. Identifying Reset Cause Using User Program

: Bearbeitet durch User
Beitrag #7132371 wurde vom Autor gelöscht.
von Eduard I. (eiten)


Lesenswert?

Gerald K. schrieb:
> Ich denke, dass Stefans Hinweiß zielführend ist. Siehe:
>
> 1.2. Identifying Reset Cause Using User Program

Leider nein. Beim ESP kann man den Sleep aufgrund eines Bugs im ROM 
nicht beenden. Was aber funktionert ist, dass die RTC GPIO16 bei Ablauf 
des Timers auf 0 zieht. Das nutzt man, indem man GPIO16 auf den 
Reset-Pin verdrahtet. Somit kann der Controller nicht entscheiden, ob 
jetzt die RTC oder der Resetknopf zum Reset geführt hat. Anscheinend 
werden beim Reset nicht alle Register gelöscht, deshalb weiss der ESP, 
dass er zuvor am schlafen war. Aber nicht, wieso er aufgewacht ist.
Um einen Kondensator, ne Diode und nen Widerstand wird der TE nicht 
herumkommen.

: Bearbeitet durch User
von Stefan F. (Gast)


Lesenswert?

Eduard I. schrieb:
> Beim ESP kann man den Sleep aufgrund eines Bugs im ROM
> nicht beenden.

Das ist in diesem Fall egal, denn er will nur zwischen Watchdog und 
andere Quellen unterscheiden.

von Andre (Gast)


Lesenswert?

Du könntest ein kleines Flip-Flop an den Reset Taster anschließen, z.B. 
74LVC1G74
Das wird vom Taster gesetzt/gelöscht (je nach Funktionsweise des 
Tasters) und kann dann ganz bequem im Hauptprogramm ausgelesen werden.
Nachteil: Du brauchst einen Pin zum zurück setzen.

von Hannes J. (Firma: _⌨_) (pnuebergang)


Lesenswert?

So ins Blaue gedacht: Nach dem Aufwachen den RTC-Timer auslesen. Wenn 
der sagt dass 1 Stunde vergangen ist, dann war es wohl nicht der 
Reset-Taster.

von Manu O. (der_heiler)


Lesenswert?

Stefan ⛄ F. schrieb:
> Manu O. schrieb:
>> Ich hoffte anhand meiner Beschreibung
>> suggeriert zu haben, mich ausgiebig und leider erfolglos mit dem Thema
>> beschäftigt zu haben.
>
> Glaube ich nicht. Das verlinkte PDF habe ich innerhalb 3 Sekunden mit
> Google gefunden, indem ich einfach nur die Stichworte "ESP8266 reset
> cause" eingab.

Lieber Stefan,

diese Doku hatte ich sogar nach 1,423 Sekunden (lt. Google) gefunden. :P
Wie ich im Eröffnungsthread versucht habe zu verdeutlichen, funktioniert 
es eben so nicht.

Der Reset Cause 6 kommt nur bei einem Reset, wenn der ESP sich nicht im 
Deep Sleep befindet. War er im Deep Sleep kommt immer 5, unabhängig ob 
über WDT oder RST. Ich bekomme nur einen anderen Cause als 5, wenn ich 
den ESP von der Versorgungspannung nehme und damit quasi komplett 
resete.

_______________________

Die Variante mit dem Kondensator, ner Diode, den den Widerständen hatte 
ich tatsächlich auch schon versucht umzusetzen, damit ein zusätzlicher 
Eingangskanal bis kurz nach dem Start quasi hochgezogen wird. Tja was 
soll ich sagen. Ich hab´s nicht umgesetzt bekommen. Vielleicht hatte ich 
auch die falschen Werte für die Komponenten genommen. Wenn hier jemand 
mal Vorschläge hätte wäre das ne super Sache.

_______________________

Den FlipFlop Ansatz finde ich gar nicht so uninteressant. Zumindest in 
Punkto Zuverlässigkeit steht dieser wohl recht weit oben. Aber es gehen 
halt 2 Pins drauf. Einer zum Einlesen des Status beim Start und einer 
zum Resetten :( Die habe ich nicht mehr frei.

_______________________
Nach dem Aufwachen den RTC-Timer auslesen:

Geht das? Da muss ich mich mal schlau machen :) Hat natürlich auch eine 
gewisse Unschärfe, da die Genauigkeit vom WDT grottenschlecht ist 
(Schwankt bei mir um ca. 5 Minuten) aber bezogen auf die Stunde 
Deepsleep, könnte man evtl. sogar damit leben. Grenzwertig wird es eben 
nur wenn man z.B. innderhalb dieser 5 Minuten grundsätzlich von einen 
WDT Reset ausgeht :) Dann muss man in diesem Sonderfall eben wieder ein 
2. Mal drücken. Geht ja nicht um Leben und Tod ;)
_______________________

Alles sehr gute und konstruktive Vorschläge. Danke Euch. Der Thread 
bildet bestimmt eine gute Referenz, falls jemand ein ähnliches Problem 
hat. Jetzt haben wir schon 3 neue Lösungen, eine mit ohne zusätzlichen 
pin, einen mit einem und eine mit 2 Pins, die alle ihre Vor- und 
Nachteile haben :)

: Bearbeitet durch User
von Gerald K. (geku)


Lesenswert?

Ich habe das Problem mit dem "Sleep" umgangen in dem ich den ESP nur für 
die Kommunikation verwende und diesen durch einen andern MC während den 
Kommunikationspausen von der Versorgung trennen lasse. Dieser zweite MC 
ist ein MSP430G2553, dieser übernimmt die eigentliche Verarbeitung, die 
Funktion zur Peripherie und kommuniziert mit dem ESP mittels AT 
Kommandos über die serielle Schnittstelle. Der MSP430 schaltet sich in 
den Sleepmodus und lässt sich über die Peripherie oder spätesten nach 
einer Stunde von einen Timer aufwecken. Der MSP430 schaltet dann den ESP 
an die Versorgung und schickt über diesen Zustandsmeldungen an einen 
übergeordneten Server (ein Raspberry Pi).

von Bauform B. (bauformb)


Angehängte Dateien:

Lesenswert?

Manu O. schrieb:
> Den FlipFlop Ansatz finde ich gar nicht so uninteressant. Zumindest in
> Punkto Zuverlässigkeit steht dieser wohl recht weit oben. Aber es gehen
> halt 2 Pins drauf. Einer zum Einlesen des Status beim Start und einer
> zum Resetten

Normalerweise kann man Pins umprogrammieren, ob sie Eingang oder Ausgang 
sein sollen. Und, das Einlesen und das Resetten passiert nacheinander. 
Da müsste man doch mit einem Pin auskommen?

- alle AND-Pins sind high, DER_LETZTE_FREIE_PIN ist Eingang
- ein Watchdog-Reset steuert hoffentlich(!) den Reset-Pin nicht an
- das Programm startet neu und liest den Eingang (high)
- jemand drückt den Taster, Reset
- der erste Eingang wird low
- der Ausgang wird low
- der zweite Eingang wird low
- der Taster öffnet wieder
- der erste Eingang wird high
- der Ausgang bleibt low
- das Programmm startet und liest den Eingang (low)
- der Pin wird auf Ausgang, high, umgeschaltet
- beide AND-Eingänge sind high, der Ausgang wird high
- der Pin wird wieder zum Eingang
- der AND-Ausgang bleibt high

Statt 74AUP1G97 sollte fast jedes CMOS-AND-Gatter funktionieren.

von Eduard I. (eiten)


Lesenswert?

Bauform B. schrieb:
> - ein Watchdog-Reset steuert hoffentlich(!) den Reset-Pin nicht an

Leider doch. Lässt sich aber mit 2 Dioden beheben.

von Jefe (Gast)


Lesenswert?

Gerald K. schrieb:
> Ich denke, dass Stefans Hinweiß zielführend ist.

ALter geht es noch? Hinweis!!!

von Gerald K. (geku)


Lesenswert?

Jefe schrieb:
> Gerald K. schrieb:
>
>> Ich denke, dass Stefans Hinweiß zielführend ist.
>
> ALter geht es noch? Hinweis!!!

Danke, hat nichts mit weiß zu tun!

von Stefan F. (Gast)


Lesenswert?

Manu O. schrieb:
> Wie ich im Eröffnungsthread versucht habe zu verdeutlichen,
> funktioniert es eben so nicht. Der Reset Cause 6 kommt nur
> bei einem Reset, wenn der ESP sich nicht im Deep Sleep befindet.

Das ist mir schon klar. Deine Frage war aber:

Manu O. schrieb:
> Nun suche ich nach einer eleganten Lösung zu unterscheiden, ob der
> Wakeup durch das Ablaufen des WDT oder durch den Resetknopf ausgelöst
> wurde.

Der WDT kann im Deep-Sleep Modus nicht ablaufen. Wenn der WDT abläuft, 
kann man dies als Reset-Cause einwandfrei abfragen. Du willst offenbar 
den Reset durch Wakeup-Timer erkennen. Wenn du das geschrieben hättest, 
hätte ich dir passend geantwortet. Denn dass der Timer-Ausgang mit dem 
externen Reset-Pin verbunden werden muss (und welche Konsequenz das 
hat), ist mir durchaus bekannt.

Nächstes mal bitte die Frage präzisieren, sobald offensichtlich wird, 
dass sie falsch verstanden oder falsch gestellt wurde.

von STK500-Besitzer (Gast)


Lesenswert?

Manu O. schrieb:
> War auch eine meiner ersten Ideen :) Geht aber nicht, weil der Reset
> erst nach dem Release den Buttons ausgelöst wird und nicht beim Drücken.
>
> Das bedeutet in dem Moment wo der ESP startet ist der Button schon nicht
> mehr gedrückt :)

Wie jetzt?
Der Watchdog leert auch den kompletten Speicher? (Ich kenne das 
"Problem" nur vom AVR, bei dem es ein Register mit der Angabe der 
letzten Resetquelle gibt.)

von Stefan F. (Gast)


Lesenswert?

STK500-Besitzer schrieb:
> Der Watchdog leert auch den kompletten Speicher?

Der Watchdog nicht, aber danach kommt der Bootloader und danach das C 
Programm. Ich habe das auch mal kontrolliert, vom RAM bliebt offenbar 
nichts erhalten.

von STK500-Besitzer (Gast)


Lesenswert?

Stefan ⛄ F. schrieb:
> Der Watchdog nicht, aber danach kommt der Bootloader und danach das C
> Programm. Ich habe das auch mal kontrolliert, vom RAM bliebt offenbar
> nichts erhalten.

schade.
Man könnte noch ein externes FlipFlop anbinden, das auch durch den 
Reset-Taster resettet wird.

von Εrnst B. (ernst)


Lesenswert?

Stefan ⛄ F. schrieb:
> vom RAM bliebt offenbar
> nichts erhalten.

Gibt's da nicht die ~500 Byte "RTC Memory"-Region, die nicht explizit 
genullt wird?

system_rtc_mem_read & system_rtc_mem_write

bzw. ESP.rtcUserMemoryRead/Write im Arduino-Core?


Aber hilft das weiter? Dieser Speicher bleibt ja beim Deep-Sleep-Wakeup 
genau wie beim Reset-Button-Drücken erhalten.

von STK500-Besitzer (Gast)


Lesenswert?

Εrnst B. schrieb:
> Aber hilft das weiter? Dieser Speicher bleibt ja beim Deep-Sleep-Wakeup
> genau wie beim Reset-Button-Drücken erhalten.

Dachte ich mir auch.
Man könnte vielleicht das Weckdatum mit dem aktuellen vergleichen.
Oder, wenn es sich um einen Countdown handelt, den auf "0" vergleichen.

von Manu O. (der_heiler)


Lesenswert?

Stefan ⛄ F. schrieb:
>
> Der WDT kann im Deep-Sleep Modus nicht ablaufen. Wenn der WDT abläuft,
> kann man dies als Reset-Cause einwandfrei abfragen. Du willst offenbar
> den Reset durch Wakeup-Timer erkennen. Wenn du das geschrieben hättest,
> hätte ich dir passend geantwortet. Denn dass der Timer-Ausgang mit dem
> externen Reset-Pin verbunden werden muss (und welche Konsequenz das
> hat), ist mir durchaus bekannt.
>
> Nächstes mal bitte die Frage präzisieren, sobald offensichtlich wird,
> dass sie falsch verstanden oder falsch gestellt wurde.

Da entschuldige ich mich. Hatte versucht das so präzise es geht mit 
meinem begrenztem Vokabular zu beschreiben. Wahrscheinlich steckst du 
tiefer in der Materie und hast es deshalb anders verstanden.

Nun hast du mich aber abgehängt. Wenn gilt:

>*"Wenn der WDT abläuft, kann man dies als Reset-Cause einwandfrei abfragen"*

wie du das geschrieben hast, würde mir das völlig reichen. Bei allen 
anderen Fällen gehe ich dann eben von einen Reset über den Button aus.

Oder verstehe ich das falsch. Der WDT (Watchdog Timer) wird beim 
"schicken" in den Deep Sleep auf einen bestimmten Wert gesetzt. Nach 
Ablauf (0) oder erreichen des Wertes, je nachdem wie das intern 
funktioniert, schickt der µC ein (Masse)Impulse auf einen Pin (D0 beim 
Wemos Mini) Wenn ich diesen Pin auf den RST Pin verbinde wird der ESP 
neu gestartet. Der RST Pin am Wemos selbst "sieht" aber nicht ob der 
Impuls vom D0 Pin (also über den WDT/D0) oder vom RST-Button ausgelöst 
wurde.

von Bauform B. (bauformb)


Lesenswert?

Gibt es keinen anderen Pin mit er aus dem Deep Sleep aufwacht? Normale 
uC haben mehrere solche Pins.

von noiasca (Gast)


Lesenswert?

Εrnst B. schrieb:
> Aber hilft das weiter? Dieser Speicher bleibt ja beim Deep-Sleep-Wakeup
> genau wie beim Reset-Button-Drücken erhalten.

ich denke schon.
Man kann ja genau vor dem Deepsleep einen Marker setzen.
Im Normalbetrieb ist der Marker eben nicht gesetzt.

Ist beim boot der Marker gesetzt, war er vorher im deepsleep.

https://hutscape.com/tutorials/rtc-memory

von noiasca (Gast)


Lesenswert?

Manu O. schrieb:
> Hintergrund:
> Die Daten werden stündlich an einen Server übermittelt.
> Wenn ich auf den RST Button drücke, möchte ich jedoch, dass sich das
> OLED mit anschaltet und ich alle Infos auf diesem angezeigt bekomme. Das
> dauert eine Weile und kostet Strom. Daher sollte es eben auch nur beim
> Drücken des RST Buttons passieren.

wenn du mit dem RTC nicht zurecht kommst, könntest ja nach dem Aufwachen 
zunächst den Server abfragen, wie alt die Daten dort sind - und wenn sie 
jünger als 1h sind, wars nicht ein deepsleep.

von Manu O. (der_heiler)


Lesenswert?

Bauform B. schrieb:
> Gibt es keinen anderen Pin mit er aus dem Deep Sleep aufwacht? Normale
> uC haben mehrere solche Pins.

Naja, der ESP hätte vielleicht mehrere Alternativen.

Pin7: CHIP_EN I an input pin. When CHIP_EN pin is HIGH chip works 
properly when LOW chip consumed an only small amount of current.

Es gibt sogar:
Pin32: EXT_RSBT is an input pin used to rest the chip by providing an 
external reset signal which is active at a low voltage level.

Das Problem ist, ich komme beim Wemos D1 Mini Board nicht an die Pins 
ran. Und selbst wenn, müsste ich bei jeder Platine dann nochmal extra 
das Board bearbeiten. Und die Pins beim ESP8266 sind schon ziemlich 
klein :)

von Εrnst B. (ernst)


Lesenswert?

noiasca schrieb:
> ich denke schon.
> Man kann ja genau vor dem Deepsleep einen Marker setzen.
> Im Normalbetrieb ist der Marker eben nicht gesetzt.

Das Problem ist ja:
Der ESP setzt den Marker, geht in den Deep-Sleep, und jetzt drückt 
jemand den Reset-Knopf, bevor der Wake-Up-Timer abgelaufen ist.

d.H. der Marker im RTC-Memory ist gesetzt, egal ob's ein Tastendruck 
oder eine vom Timer-IO ausgelöste Flanke am RST war.

Man könnte vor dem Sleep die aktuelle Zeit wegspeichern, und beim 
Aufwachen nachsehen, ob weniger als eine Stunde vergangen ist. Dafür 
braucht der ESP aber die Uhrzeit.
Wenn die aus dem Netzwerk kommt, wird die Reaktion auf den Tastendruck 
sehr träge ausfallen, das Display schaltet sich erst nach 
Verbindungsaufbau, DHCP, NTP-Abfrage ein.

von Manu O. (der_heiler)


Lesenswert?

noiasca schrieb:
> Manu O. schrieb:
>> Hintergrund:
>> Die Daten werden stündlich an einen Server übermittelt.
>> Wenn ich auf den RST Button drücke, möchte ich jedoch, dass sich das
>> OLED mit anschaltet und ich alle Infos auf diesem angezeigt bekomme. Das
>> dauert eine Weile und kostet Strom. Daher sollte es eben auch nur beim
>> Drücken des RST Buttons passieren.
>
> wenn du mit dem RTC nicht zurecht kommst, könntest ja nach dem Aufwachen
> zunächst den Server abfragen, wie alt die Daten dort sind - und wenn sie
> jünger als 1h sind, wars nicht ein deepsleep.

Der Ansatz ist auf jeden Fall gut, hat aber einige Fallstricke:
- der WDT ist nicht präzise (Schwankung ca. 5 Minuten bei einer Stunde)
- es kann vorkommen, dass (durch Wifi o.Ä.) mal Daten nicht den Server 
erreichen. Dann würde das Programm in Folge immer von einen WDT Reset 
ausgehen.
- die Kommunikation läuft über MQTT, da hat man nicht besonders gut in 
der Hand, wie/was/wann gesendet und empfangen wird. Wie gesagt, manchmal 
verschluckt er auch Daten oder sendet vor dem Empfangen ect.
- Er braucht immer erst eine WiFi Verbindung, das dauert ca. 5 Sekunden. 
Haptisch also nicht so der Knaller ;)

Ich denke alles was in die Richtung Zeitmessung geht ist unsauber, es 
sei denn, man kommt an den Wert des WDT irgendwie ran. Und selbst da ist 
es nicht 100% präzise, weil man nicht genau weiß, wann (also wie lange 
nach dem Rebboot) man diesen ausliest. Cool wäre so ein Wert wie "WDT 
abgelaufen" oder so :)

: Bearbeitet durch User
von Stefan F. (Gast)


Lesenswert?

Manu O. schrieb:
> wie du das geschrieben hast, würde mir das völlig reichen.

Offenbar nicht.

Der Watchdog Timer hat nichts mit dem Wakeup Timer zu tun. Das sind zwei 
völlig unabhängige Dinge!

Den Ausgang des Wakeup-Timer muss man mit dem Reset-Pin verbinden, weil 
der ESP sonst nur aufwacht aber nicht bootet (vermutlich Bug im 
Bootloader). Durch diese Verkabelung löst der Wakeup-Timer faktisch 
einen externen Reset am Reset Pin aus.

Das heißt: Du kannst nicht zwischen Wakeup (aus dem Deep-Sleep) und 
einem externen Reset unterscheiden.

Der WatchDog Reset ist eine ganz andere Sache, hat mit dem Aufwachen aus 
dem Deep-Sleep Modus nichts zu tun. Der Watchdog Reset tritt auf, wenn 
dein Programm in einer Endlosschleife hängt.

> Gibt es keinen anderen Pin mit er aus dem Deep Sleep aufwacht?

Nein leider nicht. Der ESP8266 ist halt eine beschränkte Gurke. Ich 
erwarte ja nicht viel von den Chinesen, aber dass sie nicht einmal den 
Bug im Bootloader beheben, das erstaunt mich doch sehr. Und die 
oftwareentwicklung lief ja auch nicht gerade gut. Dementsprechend wenig 
Interesse habe ich an weitere Produkt von dieser Firma. Nur wenn es 
ultra-billig sein muss nehme ich den ESP8266.

von Stefan F. (Gast)


Lesenswert?

noiasca schrieb:
> Ist beim boot der Marker gesetzt, war er vorher im deepsleep.

Was allerdings nichts darüber aussagt, ob er via externem Reset oder 
Wakeup-Timer aufgeweckt wurde.

von Stefan F. (Gast)


Lesenswert?

Manu O. schrieb:
> Naja, der ESP hätte vielleicht mehrere Alternativen.
>
> Pin7: CHIP_EN I an input pin. When CHIP_EN pin is HIGH chip works
> properly when LOW chip consumed an only small amount of current.

Funktioniert nicht. Man muss wirklich einen Reset machen, um den Chip 
aus dem Deep-Sleep Modus zu holen.

> Es gibt sogar:
> Pin32: EXT_RSBT is an input pin used to rest the chip by providing an
> external reset signal which is active at a low voltage level.

Das ist keine Alternative, sondern der normale Reset Eingang, der 
üblicherweise mit dem Ausgang des Wakeup-Timers verbunden wird (GPIO16).

von Manu O. (der_heiler)


Lesenswert?

Hab nochmal genauer über die AND Gate Lösung nachgedacht, weil ich die 
im Ansatz richtig cool fand. Die zusätzliche Diode(n) zum trennen von 
WDT oder Button Signal wäre ja jetzt kein Problem.

Ich vermute mal das wird aber dennoch nicht funktionieren. Das Problem 
ist DER_LETZTE_FREIE_PIN

Dieser müsste vor dem DeepSleep als Ausgang und High definiert werden 
und während des DeepSleep auf High gehalten werden, damit der Zustand 
definiert ist. Kommt der Reset über den WDT läuft alles wie bauformb 
beschrieben hat.

Wird jetzt aber der Resetbutton gedrückt,schaltet für die Zeit des 
Drückens zwar alles auf Low, beim Loslassen aber auch alles wieder auf 
High, weil der DER_LETZTE_FREIE_PIN noch auf OUTPUT und High ist.

Oder hab ich jetzt einen Denkfehler?

von Stefan F. (Gast)


Lesenswert?

Manu O. schrieb:
> Die zusätzliche Diode(n) zum trennen von
> WDT oder Button Signal wäre ja jetzt kein Problem.

Das ist unmöglich. Der Watchdog Timer hat keinen herausgeführten 
Ausgang. Da gibt es nichts, wo man eine Diode anschließen könnte.

von Stefan F. (Gast)


Lesenswert?

Manu O. schrieb:
> Wird jetzt aber der Resetbutton gedrückt,schaltet für die Zeit des
> Drückens zwar alles auf Low, beim Loslassen aber auch alles wieder auf
> High, weil der DER_LETZTE_FREIE_PIN noch auf OUTPUT und High ist.
> Oder hab ich jetzt einen Denkfehler?

Kann ich nicht sagen, weil nicht klar ist, welchen Pin du dafür nehmen 
willst. Wie sich die Pins beim Starten verhalten, habe ich auf meiner 
Homepage beschrieben.

von Manu O. (der_heiler)


Lesenswert?

Stefan ⛄ F. schrieb:
> Manu O. schrieb:
>> Die zusätzliche Diode(n) zum trennen von
>> WDT oder Button Signal wäre ja jetzt kein Problem.
>
> Das ist unmöglich. Der Watchdog Timer hat keinen herausgeführten
> Ausgang. Da gibt es nichts, wo man eine Diode anschließen könnte.

Ich glaube wir reden noch immer aneinander vorbei. :( Der WDT gibt ein 
Signal an D0, wenn die Zeit die für den DeepSleep definiert wurde 
abgelaufen ist.

ESP.deepSleep(<wert>);

Damit kann ich jetzt alles Mögliche machen, und wenn ich D0 mit dem RST 
Pin des Wemos verbinde starter dieser neu.

Möglich das es technisch anders oder korrekter zu beschreiben ist und 
das nicht der WDT macht, sondern irgendeine andere Komponente im ESP die 
auf den WDT "guckt". Möglich auch, dass die Zeit nicht abläuft, sondern 
verrinnt und auch möglich das die Komponente nicht "guckt" sonder "hört" 
oder das Signal nicht "an" sondern "auf" D0 gegeben/geschoben/gelegt 
wird.

Aber du verstehst doch hoffentlich mein grundsätzliches Anliegen?!

von Manu O. (der_heiler)


Lesenswert?

Stefan ⛄ F. schrieb:
> Manu O. schrieb:
>> Wird jetzt aber der Resetbutton gedrückt,schaltet für die Zeit des
>> Drückens zwar alles auf Low, beim Loslassen aber auch alles wieder auf
>> High, weil der DER_LETZTE_FREIE_PIN noch auf OUTPUT und High ist.
>> Oder hab ich jetzt einen Denkfehler?
>
> Kann ich nicht sagen, weil nicht klar ist, welchen Pin du dafür nehmen
> willst. Wie sich die Pins beim Starten verhalten, habe ich auf meiner
> Homepage beschrieben.


Langsam kommtich dahinter. Du magst mich vorführen :(

Konstruktive Antwort wäre:
Geht doch, du musst aber PIN<sowieso> nehmen.
Kannst du auch unter meiner HP (www.guckstdumalhiernach.de) nachlesen.

___________________________________________________________________

Ich unterstelle mal, das es KEINEN Pin gibt, der solange ohne Code und 
im Deepsleep als OUTPUT und HIGH definiert ist bis er ein LOW Signal 
bekommt, und dieses dann hält und zum INPUT wird. Lasse mich aber gerne 
vom Gegenteil überzeugen.

: Bearbeitet durch User
von Robert (Gast)


Lesenswert?

Manu O. schrieb:
> Stefan ⛄ F. schrieb:
>> Manu O. schrieb:
>>> Die zusätzliche Diode(n) zum trennen von
>>> WDT oder Button Signal wäre ja jetzt kein Problem.
>>
>> Das ist unmöglich. Der Watchdog Timer hat keinen herausgeführten
>> Ausgang. Da gibt es nichts, wo man eine Diode anschließen könnte.
>
> Ich glaube wir reden noch immer aneinander vorbei. :( Der WDT gibt ein
> Signal an D0, wenn die Zeit die für den DeepSleep definiert wurde
> abgelaufen ist.
>
> ESP.deepSleep(<wert>);
>
> Damit kann ich jetzt alles Mögliche machen, und wenn ich D0 mit dem RST
> Pin des Wemos verbinde starter dieser neu.

Ja, ihr redet aneinander vorbei. Du solltest nach diversen Erklärungen 
kapiert haben, daß der Watchdog Timer dir beim Deep Sleep nicht helfen 
kann und nichts mit dem D0 Pin zu tun hat. Über D0 und Reset kann der 
ESP von der RTC neu gestartet werden, die im Deep Sleep weiterläuft.

Also nutze nicht mehr den Begriff Watchdog Timer oder WDT in 
Zusammenhang mit deinem Problem, dann stellt sich Stefan vielleicht auch 
nicht mehr so begriffstutzig an.

Du könntest doch einfach einen Kondensator nehmen, der beim Drücken des 
Reset Knopf (aber nicht von D0) entladen wird (beide über Schottky 
Dioden entkoppeln), und den hängst du an den übrigen Eingangspin. 
Geladen wird er über einen hochohmigen Widerstand, mit einer 
Zeitkonstante die gewährleistet, daß die Kondensatorspannung nach dem 
Bootvorgang noch sicher als LOW erkannt wird.

von Manu O. (der_heiler)


Lesenswert?

Hab ich tatsächlich erst jetzt kapiert.

Dachte bisher wirklich der WDT wird hergenommen um den DeepSleep zu 
beenden. Tatsächlich scheint er also nur zu greifen, wenn ein z.B. ein 
anderer Fehler vorliegt, also das µC sich z.B. aufgehangen habt.

Okay, danke für die Erläuterung. Der Reset Impuls kommt also von der 
RTC. Das Problem bleibt allerdings das gleiche! Man kann nicht 
unterscheiden, was den Reset ausgelöst hat. :(

Die Variante mit dem Kondensator scheint sich nun mit als beste Lösung 
zu entpuppen. Da werde ich noch ein bisschen Hirnschmalz drauf 
verwenden.

von Stefan F. (Gast)


Lesenswert?

Manu O. schrieb:
> Der WDT gibt ein
> Signal an D0, wenn die Zeit die für den DeepSleep definiert wurde
> abgelaufen ist.

Nein, das macht der Wakeup-Timer.

von Stefan F. (Gast)


Lesenswert?

Robert schrieb:
> dann stellt sich Stefan vielleicht auch
> nicht mehr so begriffstutzig an.

Entschuldige mal, ich bin hier ganz gewiss nicht Begriffstutzig. Ich 
habe auf die richtige Doku verwiesen und konsequent korrekt zwischen WDT 
und Wakeup-Timer unterschieben.

Stefan ⛄ F. schrieb:
> Lies diese Doku:
> 
https://www.espressif.com/sites/default/files/documentation/esp8266_reset_causes_and_common_fatal_exception_causes_en.pdf

Stefan ⛄ F. schrieb:
> Der WDT kann im Deep-Sleep Modus nicht ablaufen. Wenn der WDT abläuft,
> kann man dies als Reset-Cause einwandfrei abfragen. Du willst offenbar
> den Reset durch Wakeup-Timer erkennen

Stefan ⛄ F. schrieb:
> Der Watchdog Timer hat nichts mit dem Wakeup Timer zu tun. Das sind zwei
> völlig unabhängige Dinge!

> Den Ausgang des Wakeup-Timer muss man mit dem Reset-Pin verbinden, weil
> der ESP sonst nur aufwacht aber nicht bootet...

> Der WatchDog Reset ist eine ganz andere Sache, hat mit dem Aufwachen aus
> dem Deep-Sleep Modus nichts zu tun. Der Watchdog Reset tritt auf, wenn
> dein Programm in einer Endlosschleife hängt.

Stefan ⛄ F. schrieb:
> Das (EXT_RSBT) ist keine Alternative, sondern der normale Reset
> Eingang, der üblicherweise mit dem Ausgang des Wakeup-Timers
> verbunden wird (GPIO16).

Stefan ⛄ F. schrieb:
> Das ist unmöglich. Der Watchdog Timer hat keinen herausgeführten
> Ausgang. Da gibt es nichts, wo man eine Diode anschließen könnte.

Manu O. schrieb:
> Der WDT gibt ein Signal an D0, wenn die Zeit für den DeepSleep
> definiert wurde abgelaufen ist.

Nein! Wie kann es sein, dass du nach so vielen wiederholten Erklärungen 
immer noch diese falsche Schlussfolgerung ziehst? Also wenn ich 
begriffsstutzig bin, dann hier. Ich begreift nicht, wie das sein kann.

Also naochmal zum mitmeißeln:
Nicht der Watchdog Timer, sondern der Wakeup Timer gibt dieses Signal an 
D0 aus, welches man mit dem Reset Eingang verbinden muss.

Manu O. schrieb:
> Konstruktive Antwort wäre:
> Geht doch, du musst aber PIN<sowieso> nehmen.

Es gibt aber keinen geeigneten Pin! Das haben dir andere mehrfach 
geschrieben.

> Kannst du auch unter meiner HP (www.guckstdumalhiernach.de) nachlesen.
Wenn ich den Link zu oft poste, bekomme ich Shitstorm. Es ist 
http://www.stefanfrings.de

von Robert (Gast)


Lesenswert?

Stefan ⛄ F. schrieb:
>
> Nein! Wie kann es sein, dass du nach so vielen wiederholten Erklärungen
> immer noch diese falsche Schlussfolgerung ziehst? Also wenn ich
> begriffsstutzig bin, dann hier. Ich begreift nicht, wie das sein kann.
>
> Also naochmal zum mitmeißeln:
> Nicht der Watchdog Timer, sondern der Wakeup Timer gibt dieses Signal an
> D0 aus, welches man mit dem Reset Eingang verbinden muss.

Sorry Stefan, ich schätze deine Beiträge und wollte dir nicht zunahe 
treten. Aus dem Kontext heraus war es mir klar was der TO möchte, und 
ich dachte dir ebenso. Deshalb haben ich mich über deine wiederholten 
Erklärungen gewundert.

von Bauform B. (bauformb)


Lesenswert?

Die Verwirrung kommt wohl von den chinesischen Abkürzungen. Mit "WDT" 
ist natürlich der "Wake-up from Deep sleep Timer" gemeint ;)

von Stefan F. (Gast)


Lesenswert?

Bauform B. schrieb:
> Die Verwirrung kommt wohl von den chinesischen Abkürzungen. Mit "WDT"
> ist natürlich der "Wake-up from Deep sleep Timer" gemeint ;)

Bitte nicht, ich finde das nicht lustig.

von Manu O. (der_heiler)


Lesenswert?

Bauform B. schrieb:
> Die Verwirrung kommt wohl von den chinesischen Abkürzungen. Mit "WDT"
> ist natürlich der "Wake-up from Deep sleep Timer" gemeint ;)

So würde ich nochmal aus der Nummer rauskommen. :)

Nee, Nee. Mal im Ernst, mein einziger Denkfehler war doch, dass der WDT 
eben nicht genutzt wird, um dein Wakeup zu triggern. Sorry das ich den 
Fokus nicht drauf gelegt habe, sondern auf das eigentliche Problem, was 
ja erst nach dem Triggern kommt.

: Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.