ESP32 externer Watchdog Reset stört Flashvorgang

OP #7885337
Lesenswert?

Ich habe einen externen Resetgenerator im LDO den ich gern nutzen würde, klappt auch alles soweit. Die main loop() toggled den Watchdog und der Reset Pin des LDO ist mit dem EN Pin des ESP32 DevBoard verdrahtet.

Nun möchte ich das Signal unterbrechen mit einem NPN der über GPIO0 angesteuert wird, so dass sich der ESP32 flashen lässt. Problem der Reset funktioniert dann nicht mehr, Vce geht nicht bis auf GND runter.

Moderator (Firma: Titel) Persönliche Seite #7885386
Lesenswert?

Alexander schrieb:

Nun möchte ich das Signal unterbrechen mit einem NPN der über GPIO0 angesteuert wird

Welche Signale willst du mit welchen Pegeln wie/wann ansteuern? Was soll am EN ankommen, wenn der GPIO angesteuert wird?

Vce geht nicht bis auf GND runter.

Sondern wie weit? Braucht der EN-Pin evtl. einen Pulldown? Oder kannst du den einfach so "offen" lassen?

im Schaltplan.

Welcher LDO? Was ist "Reset"? Ist der high- oder low-aktiv?

Nun möchte ich das Signal unterbrechen mit einem NPN der über GPIO0 angesteuert wird, so dass sich der ESP32 flashen lässt. Problem der Reset funktioniert dann nicht mehr, Vce geht nicht bis auf GND runter.

Wo ist diese Vce? Kann ich diese Prosa so lesen, dass du am EN Signal dauernd low haben willst, wenn der Pin "angesteuert" wird? Falls ja, warum machst du es dann nicht einfach so:

1
         Reset
2
           |
3
          10k
4
           |
5
GPIO ------o---- EN
OP #7885394
Lesenswert?

TLE4271, im Datenblatt steht: Reset Output; the open collector output is connected to the 5 V output via an integrated resistor of 30 kΩ

ESP32 GPIO0: must be LOW to enter flashing mode https://randomnerdtutorials.com/esp32-pinout-reference-gpios

Mit Vce meine ich die Kollektor-Emitter-Spannung am Transistor, z.B. BC547.

Wenn ich mit Arduino IDE flashen will soll der GPIO0 doch als Output LOW den Transistor ausschalten. Der Reset (Active Low) vom Watchdog wird dann nicht an den ESP32 durchgeschaltet (falls einer auslöst)

Im Normalbetrieb ist der GPIO0 HIGH und der Transistor sollte mit 3,3V gesättigt sein.

Ich geh jetzt noch mal rein messen, antworte gleich..

#7885397
Lesenswert?

Alexander schrieb:

Nun möchte ich das Signal unterbrechen mit einem NPN der über GPIO0 angesteuert wird, so dass sich der ESP32 flashen lässt. Problem der Reset funktioniert dann nicht mehr, Vce geht nicht bis auf GND runter.

dann nutze ein Photomos Relais, das schaltet erst durch wenn du genügend IR Strom auf die LED freischaltest also wenn die CPU aus dem Reset ist und das normale Programm läuft, nur wie soll es ohne Reset dort hinkommen?

Sieht nach einem typischen Logikfehler oder Trollthread vom Alex aus

#7885431
Lesenswert?

Dem kann ich mich nur anschließen: Dein Problem wird am schnellsten gelöst, wenn Du hier zumindest den relevanten Teil des Schaltplans eindeutig und mit allen notwendigen Informationen darstellst!

Falls ich es bisher richtig verstanden habe: Du willst den WD per Software abschalten, um ungestört Deinen Prozessor flashen zu können? Einen WD per Software abschaltbar zu machen, schränkt den Sinn des WD ziemlich ein. Und wenn es unbedingt sein muß, wegen aufspielen von Software aus der Ferne, dann muß das wirklich wasserdicht sein. Wie gesagt, so habe ich es bisher verstanden.

OP #7885435
Lesenswert?

Peter D. schrieb:

Und was soll dann die Geheimniskrämerei und nennst ihn nicht endlich?

Alexander schrieb:

TLE4271

Hab jetzt einen BC337-25 versucht zu messen, leider bekomme ich es nicht gemessen da ich den Resetgenerator auf 1 Sek gestellt habe, und das DMM ist etwas träge.

Also der Reset Pin liefert 3,3V als HIGH und 0V als Reset. Der EN Pin des ESP32 hat 4V als Floating. Verdrahte ich die Pins direkt miteinander sind es 4V. Reset wird korrekt ausgelöst. Funktioniert wie es soll.

Setze ich den NPN dazwischen (wie im Schaltplan s.o.) und beschalte die Basis mit 3,3V und 1k löst der Reset nicht mehr aus. Ich messe irgendwas mit 1,6V am Kollektor wenn der Reset auslöst. Setze ich den Reset Pin gewaltsam auf GND so bricht die Basisspannung zusammen auf 0,64V obwohl 3,3V anliegen. Durch den kleinen Basiswiderstand zieht es außerdem den GPIO runter auf 0,7V was nicht sein darf. Am Emitter messe ich 4V d.h. der Transistor schaltet den Reset nicht durch obwohl er es sollte.

Axel V. schrieb:

Falls ich es bisher richtig verstanden habe: Du willst den WD per Software abschalten, um ungestört Deinen Prozessor flashen zu können?

Jein, der GPIO0 muss zum flashen auf Low gezogen werden. Das alte Arduino 1.8.19 konnte das irgendwie automatisch, bei der neuen Arduino IDE 2.3.6 muss man auf dem DevBoard einen Taster zum flashen betätigen. Frag mich nicht wie das geschaltet ist, müsste ich mal den Schaltplan dazu finden. Der Resetgenerator kann ruhig weiterlaufen, soll aber während des Flashvorgangs ignoriert werden.

Bisher muss ich immer das Kabel abziehen. Es soll aber alles auf ein PCB demnächst und einen Jumper brauche ich nicht unbedingt. Dann verzichte ich lieber auf den Watchdog.

OP #7885470
Lesenswert?

Arduino F. schrieb:

Darf ich dich fragen, was dir an dem eingebauten Wachhund nicht gefällt?

Andersrum. Warum sollte ich einen internen nutzen wenn ich einen externen Watchdog gratis zur Verfügung hab?

Damit gehe ich solchen Problemen und Tests aus dem Weg.

Beitrag "ESP32 Watchdog"

Peter D. schrieb:

Nimm einen passenden Watchdog

Sieht gut aus. Muss aber auch mit Transistor gehen.

Moderator (Firma: Titel) Persönliche Seite #7885497
Lesenswert?

Alexander schrieb:

ESP32 GPIO0: must be LOW to enter flashing mode

Das bedeutet ja nur, dass der GPIO ein Eingang ist, der beim Booten auf low gehalten werden muss, um in den Programmiermodus zu kommen.

Alexander schrieb:

Muss aber auch mit Transistor gehen.

Welchen Pegel gibt der GPIO0 denn beim Flashen aus? Wer sorgt dafür, dass er diesen Pegel ausgibt?

Alexander schrieb:

noch nicht im Schaltplan.

Also gibts ja offenbar schon einen Schaltplan ohne diesen Transistor. Dann kritzle das doch in diesen Schaltplan rein, statt aus 1 einzigen Bauteil eine Label-Hell zu machen.

Moderator (Firma: Titel) Persönliche Seite #7885512
Lesenswert?

Alexander schrieb:

einen Gesamt-Schaltplan im Forum posten, das muss ich mir nicht antun.

Wer spricht denn von einem Gesamtschaltplan? Das möchte ich mir auch nicht antun. Aber wenigstens so viel vom Schaltplan, dass man kapiert, was deine Worte bedeuten.

Arduino F. schrieb:

Ich wünsche dir viel Erfolg

Und Glück. Es ist augenscheinlich nötig.

#7885555
Lesenswert?

Alexander schrieb:

Ah nee, einen Gesamt-Schaltplan im Forum posten, das muss ich mir nicht antun. Solche Anfängerfehler macht man hier nur genau einmal im Forum..

Wer redet von Gesamtschaltplan. Wenn du den relevanten Teil unbedingt für dich behalten willst, tue das. Dein Problem kannst du auch gleich dazu gesellen. Von "Anfänger" zu reden und schon bei der Messung von ein paarhundert Millivolt zu scheitern, passt zusammen.

Alexander schrieb:

ich möchte einen Transistor als Schalter.

Wenn dich aus unerfindlichen Gründen ein bisschen Vce stört, nimm einen MOSFET. Hast du dir deine Schaltungsidee einmal in der Simulation angesehen ( z.B. mit LTSpice) und die Ansteuerung geprüft?

Was soll das Zeugs unterhalb des BJT darstellen?

OP #7885581
Lesenswert?

Rainer W. schrieb:

Von "Anfänger" zu reden und schon bei der Messung von ein paarhundert Millivolt zu scheitern, passt zusammen.

Wie soll ich es denn messen wenn der Reset hart (RC Glied) auf 1 Sekunde getaktet ist? Das Multimeter zeigt es nicht richtig an. Muss ich das Oszilloskop erstmal anschließen.

Rainer W. schrieb:

Wenn dich aus unerfindlichen Gründen ein bisschen Vce stört, nimm einen MOSFET

Bekomme ich damit GND auf GND geschaltet? Das wäre schon die Lösung.

Rainer W. schrieb:

Hast du dir deine Schaltungsidee einmal in der Simulation angesehen

Ich hab sie ja schon aufgebaut, da muss ich nicht mit Modellen rumfummeln .

OP #7885654
Lesenswert?

Es ist doch kein Fehler in meiner Logik? Ohne Transistor funktioniert der Resetgenerator. Zum Flashen muss ich das Dupont Kabel vorher abziehen. Danach wieder dran stecken. Den Vorgang sollte man doch mit einem Transistor automatisieren können. Da es Active Low (also GND) schaltet, war ein NPN logisch.

Die Fragen von Lothar sind natürlich berechtigt, ich weiß nichts über den GPIO0, ob der als Input oder Output konfiguriert ist keine Ahnung. Aber er hat wohl einen internen Pull-up, das ist doch schon mal gut.

Jetzt hab ich in einem alten Thread den MOSFET TN0702 als Vorschlag gefunden. Habe aber Probleme das Datenblatt zu verstehen. Die Beschaffung ist auch mau (ser, Sammelbestellung gerade verpasst) gibt's Alternativen im TO92 Gehäuse?

Rainer W. schrieb:

Was soll das Zeugs unterhalb des BJT darstellen?

Schlampig gezeichnet. Ist genau dasselbe wie im ersten Bild. Ein Basiswiderstand zwischen Transistor und MCU.

Angehängte Dateien:
#7885668
Lesenswert?

Ist es sicher, dass der EN Eingang dieses ESP32 zum Resetten taugt?

Ich frage, weil das beim ESP8266 nämlich nicht der Fall ist. Ich hatte nach Stack Overflows beobachtet, daß der Pin nicht mehr reagierte. Der Reset Eingang hingegen funktionierte wie er soll.

Alexander schrieb:

Es ist doch kein Fehler in meiner Logik?

Ich fürchte doch. Denn der Basis-Strom kommt am Emitter heraus. Dort hast du immer einen High Pegel, sogar wenn der Kollektor unbeschaltet ist. War sicher nicht so gedacht.

OP #7885681
Lesenswert?

Ich habe den Resetgenerator schon auf 3v3 runter skaliert. Der EN Pin ist für den Reset gedacht, mit dem wird der AMS1117 auf dem ESP32 DevBoard abgeschaltet. Ist schon alles richtig so gemäß Datenblatt.

Es funktioniert ja auch. Nur soll es während des Flashvorgangs nicht funktionieren... :)

#7885718
Lesenswert?

Der ESP32-Upload läuft doch inzwischen (zumindest wenn man esptoolpy verwendet) über einen kleinen Loader, der zuerst aufgespielt wird.

(flasher_stub Ordner im esptool)

Saubere Lösung wäre wohl den anzupassen, dass der den externen Watchdog auch zurücksetzt solange noch Daten übertragen werden.

Nur das Hochspielen vom Stub mit ein paar kb müsste der Watchdog überstehen, das läuft noch über den Loader im ROM.

Nachteil: Deine Hardware lässt sich dann nur mit "deinem" Programmiertool beschreiben, andere Upload-Tools werden vom Watchdog abgewürgt.

Moderator (Firma: Titel) Persönliche Seite #7885739
Lesenswert?

Alexander schrieb:

Dann hätte ich aber noch immer Vce > 0V oder nicht?

Du wirst niemals Uce=0V erreichen. Selbst bei heftigster Übersteuerung nicht.

Alexander schrieb:

Ich denke die 0,2V sind das Problem.

Du denkst falsch. 0,2V sind auch für einen 3V3-CMOS-Eingang ein bombensicheres Low. Die tatsächlichen Schaltschwellen lassen sich aber ganz leicht im Datenblatt des µC nachschauen, da muss man gar nichts denken.

OP #7885742
Lesenswert?

Lothar M. schrieb:

Du wirst niemals Uce=0V erreichen. Selbst bei heftigster Übersteuerung nicht.

Gar nicht, also auch nicht mit einem MOSFET? Ich frage weil das von Rainer W. (rawi) als Vorschlag kam.

Lothar M. schrieb:

Du denkst falsch. 0,2V sind auch für einen 3V3-CMOS-Eingang ein bombensicheres Low.

Ich bin mir nicht sicher ob der EN Pin überhaupt ein GPIO ist. Falls ja, dann sind es keine sauberen Flanken oder eine Racecondition. GPIO12 sollte aber HIGH sein.

https://docs.espressif.com/projects/esptool/en/latest/esp32/advanced-topics/boot-mode-selection.html

Peter D. schrieb:

EN (CHIP_PU)

Okay zu CHIP_PU findet man was im Datenblatt. Mal ist von Active High die Rede und mal von Active Low. Da steht min: - typ: - max: 0.6V

#7885783
Lesenswert?

Alexander schrieb:

Ah nee, einen Gesamt-Schaltplan im Forum posten, das muss ich mir nicht antun. Solche Anfängerfehler macht man hier nur genau einmal im Forum..

Da hast du mein vollstes Verständnis. Im idealen Fall bekommst du einen Hinweis, dass dein Schaltplan nicht korrekt gezeichnet ist und den Link in die Forumseigene Wiki, wie man einen Schaltplan zeichnet: Links Eingang, rechts Ausgang, oben Plus, unten Masse. Das ist noch konstruktive Kritik, solange es dabei bleibt. Wenn Fehler im Schalplan sind, dann wirst du auch noch darauf hingewiesen. Wenn du dann fragst, warun das ein Fehler ist, dann bekommst du auch noch Hinweise, wenn nicht die ersten bekannten User aufgewacht sind, welche dir von vorne herein die Kompetenz absprechen, und dir sagen, dass du besser wieder in den Sandkasten spielen gehen sollst. Ein weiterer User gibt dir dann einen Tipp, welcher vielleicht nicht gerade der passende ist, weil es bessere gibt, oder weil der wohlgemeint, aber nicht richtig ist...

Dann beginnt der übliche Krieg zwischen den bekannten Usern, und dein Thema ist aussen vor.

Der wohlgemeinte Tipp wird nicht so beantwortet: "Nicht ganz richtig, sondern falsch ;-)", sondern so: "Du hast keine Ahnung", "lass die Finger weg davon" (wobei das ab und an auch gerechtfertigt ist, um den Darwin-Award demjenigen nicht zu gönnen :-))

Es gibt hier einige Threads, wo mit Engelsgeduld ein Problem erklärt wird, weil der TO wirklich keine Ahnung hat, aber Ahnung bekommen möchte, und dann auch immer wieder nachfragt. Er wird dann zum Troll erklärt.

Müsste ich einen Artikel in der Wikipedia über dieses Forum schreiben, dann würde ich nicht gerade die Umgangsformen reinschreiben, aber, dass das Wort Troll das meist missbrauchte Wort hier ist.

#7885790
Lesenswert?

Alexander schrieb:

kann ich testen, verstehen tue ich ihn nicht.

Es geht um diese Schaltung (nicht die hier angehängte!): Nemopuk schrieb im Beitrag #7885691:

2025-06-02_21-38.png

Q2 invertiert das Reset Signal. Wenn der Eingang vom Watchdog auf LOW gezogen wird, schaltet Q2 ein und zieht den Reset Pin des ESP auf High. Q1 wird durch GPIO0=LOW aktiviert. Er nimmt dem Q2 seinen Basis-Strom weg, um dadurch den Watchdog-Reset zu verhindern.

Ich habe allerdings gerade gesehen, daß der ESP32 im Gegensatz zum ESP8266 keinen dedizierten /Reset Eingang hat. Also passt mein Schaltungsvorschlag nicht zum ESP32. Die Beschriftung des "RST" Tasters hat mich in die Irre geführt. Ich habe einen neuen Entwurf angehängt, der meiner Meinung nach funktionieren sollte. Zur Funktionsweise:

Normalerweise wird GPIO0 (durch einen 12kΩ Pull-up) auf HIGH gezogen. Wenn dann der Watchdog-Ausgang auf LOW geht, schaltet Q1 ein und zieht den EN Eingang des ESP auch auf LOW.

Die Annahme war, das GPIO0 beim Programmieren die ganze Zeit auf LOW liegt (stimmt das überhaupt?). Dann leitet der Transistor nicht, so dass der Watchdog keinen Reset auslösen kann.

Die 5V vom Watchdog kommen beim ESP32 nicht an. Nur der LOW Pegel wird durch gereicht. Der HIGH Pegel kommt vom Pull-up Widerstand auf dem ESP32 Board, und der hängt an 3,3 Volt.

Der Vorwiderstand vor der Basis wurde so hoch gewählt, damit er das GPIO0 Signal (dessen HIGH Pegel von einem 12kΩ Pull-up kommt) nicht zu stark belastet. Es soll im Ruhezustand auf jeden Fall bei einem HIGH bleiben.

An einem Punkt bin ich unsicher: Und zwar könnte es sein, dass der Spannungsabfall an der C-E Strecke zu hoch ist. In diesem Fall würde ich auf einen N-Kanal MOSFET ausweichen und den Widerstand weg lassen. So weit hast du dir das ja auch schon überlegt.

PS: Du hast in deinem Schaltungsentwurf C und E vertauscht.

Angehängte Dateien:
Beitrag #7885791 wurde von einem Moderator gelöscht.
Moderator (Firma: Titel) Persönliche Seite #7885817
Lesenswert?

Alexander schrieb:

Da steht min: - typ: - max: 0.6V

Also ist (unabhägig von high- oder low-active) alles alles unter 0,6V ein Low.

Lothar M. schrieb:

Du wirst niemals Uce=0V erreichen. Selbst bei heftigster Übersteuerung nicht.

Gar nicht, also auch nicht mit einem MOSFET?

Nein, auch mit einem Mosfet wirst du keine 0(,00000)V erreichen. Das ist aber ja auch nicht nötig.

Ich bin mir nicht sicher ob der EN Pin überhaupt ein GPIO ist.

Der dürfte wohl in allen Fällen ein Eingang sein. Aber es geht ja auch nicht grundsätzlich um den EN Pin.

GPIO12 sollte aber HIGH sein.

Entferne das "sollte" aus deinem Satz und stelle sicher, ob/dass der Pin zu dem Zeitpunkt (dauerhaft) den Pegel hat, den du für das gewünschte Verhalten brauchst. Das gilt auch für den zuerst verwendeten GPIO0.

Meine Vorgehensweise wäre hier, erst mal die Pegel in einer Logiktabelle dazustellen, die für das gewünschte Verhalten tatsächlich nötig sind. Und dann mit einem geeigneten Messgerät zu kontrollieren, ob die nötigen Signale auch wirklich (und vor allem definiert und dauerhaft) anliegen.

OP #7885893
Lesenswert?

Es tut mir Leid aber mit meinem begrenzten Equipment lässt sich das nicht herausfinden. GPIO12 ist anscheinend nicht HIGH, und per Software kommt es zu spät.

Die Transistorschaltung von Nemopuk funktioniert jetzt mit 47k. Aber ich konnte es nur mit TX0 testen das scheint der einzige Pin zu sein der wirklich von Anfang an HIGH ist (über USB). DevBoard mit GPIO0 hab ich gar keins mehr da. GPIO2 kann ich noch mal testen.

Angehängte Dateien:
OP #7885949
Lesenswert?

Also das Problem (in meinem Fall Glück) war ich hatte das USB-Kabel dran. Ohne USB-Kabel funktioniert der Resetgenerator augenscheinlich. Das Problem ist, es gibt keinen GPIO der zuverlässig HIGH ist wenn der ESP32 abstürzt. Das USB-Kabel hat den ESP32 zum Absturz gebracht, was den Fehler im Konzept offenbart.

Ich brauche also einen anderen Pin. Kann man das USB-Kabel an einem Pin abgreifen? Ich brauche irgendwas externes, nichts was vom Status des ESP32 abhängt.

(Firma: Gast) #7885961
Lesenswert?

Alexander schrieb:

Kann man das USB-Kabel an einem Pin abgreifen?

Was soll der Pin tun? Die Schaltpläne für dein ESP Board liegen sicherlich öffentlich aus.

Entweder bist du total verwirrt, oder ich doof.

Weiterhin mein Vorschlag:

  1. Vergiss den externen, denn der interne ist genauso kostenlos.
  2. Mache die Updates über OTA, dann bist du auch deine USB Verwirrung los

Natürlich darfst du auch noch ein paar Tage basteln. Das steht allerdings irgendwie im Widerspruch zu:

Alexander schrieb:

Damit gehe ich solchen Problemen und Tests aus dem Weg.

(Firma: Gast) #7885985
Lesenswert?

Alexander schrieb:

Arduino F. schrieb:

Die Schaltpläne für dein ESP Board liegen sicherlich öffentlich aus.

Alexander schrieb:

https://www.remma.net/?p=5139 Fein!

Damit sollte sich doch diese Frage leicht beantworten lassen: Alexander schrieb im Beitrag #7885949:

Ich brauche also einen anderen Pin. Kann man das USB-Kabel an einem Pin abgreifen? Ich brauche irgendwas externes, nichts was vom Status des ESP32 abhängt.

Ob da ein für dich befriedigendes ja oder nein rauskommt, KA.

OP #7886169
Lesenswert?

Verzeih mir aber ich finde den externen Hardware Watchdog besser. Ja, diesen per Software zu umgehen nur zum Flashen war ne blöde Idee. Den komplett durch einen Software Watchdog zu ersetzen ist aber auch nicht zielführend. Ich belasse es bei einem Jumper für den Notfall und versuche es mit OTA.

#7963663
Lesenswert?

Alexander schrieb:

Ist ein Watchdog noch ein Watchdog wenn er über einen Hardware-Timer läuft? Aus der main loop() musste ich den rausnehmen,

Das ist keine gute Idee.

da mbedtls_rsa_gen_key() so CPU intensiv ist dass der Watchdog ausgelöst hat.

Üblicherweise schaut man, welche Funktion am längsten läuft und spendiert dem Watchdog-Timeout noch 20% Reserve.

Ggf. kann man die Funktion auch aufteilen oder man platziert einen Watchdog-Reset an geeigneter Stelle in der problematischen Funktion.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren