Forum: Mikrocontroller und Digitale Elektronik Fehlersuche Code Arduino IDE ESP32 - Timer Interrupt - NTP-Client


von Fabi R. (efabi)


Angehängte Dateien:

Lesenswert?

N'Abend!

Ich komm mit der Fehlersuche in meinem Code nicht weiter, sitz an dem 
Bug jetzt schon über einen Tag. Ich weiß, dass das nicht so optimal ist 
sich in fremden Code einzulesen, allerdings wachsen mir langsam graue 
Haare.

Zur Hardware: Ich benutz einen ESP32 (NodeMCU 32S), den ich auf ein 
bestelltes PCB gelötet hab, um damit FETs anzusteuern und eine 
Wifi/Bluetooth-Kommunikation aufzubauen.
Die FETs werden Benutzt, um elektromagnetische Sieben-Segment Anzeigen 
(SSA) anzusteuern. Jede SSA besitzt an der High-Side einen FET um 
Segmente zu setzen und einen FET um Segmente zu löschen. An der Low-Side 
ist für jedes Segment (A-F) ein FET. Und das ist eigentlich schon alles.



Zur Software: Der generelle Ablauf ist wie folgt:
Setup und Initialisierungen: Wifi verbinden -> Zeit holen und Displays 
einstellen -> und in den Loop gehen.

Im Loop wird auf eine Bluetooth-Kommunikation gewartet, die ich über 
eine selbstprogrammierte App übers Handy aufbau. Das Funktioniert auch 
alles soweit.
Der Spaß geht los wenn der Timer-Interrupt aufgerufen wird: Nachdem ein 
paar Abfragen gemacht wurden wird die Funktion "UpdateClock" aufgerufen. 
Dort wiederrum wird die aktuelle Zeit geholt und die Funktion "SetSeg" 
aufgerufen, um die neue Zeit an der jeweiligen Anzeige einzustellen. Um 
nur die nötigsten Segmente abzuändern rechne ich mir binär die 
Änderungen zum Sieben-Segment-Code zusammen.
Beim ersten mal (in der Initalisierung/Setup) wird das auch alles 
ordnungsgemäß ausgeführt und die Uhr zeigt die richtige Zeit an. 
Berechnungen etc stimmen auch alles.

Mein Problem tritt hier auf (über Konsolen-Ausgabe überprüft): Wenn ein 
Interrupt aufgerufen wird, dann wird die Funktion "UpdateClock" 
aufgerufen und die richtige Zeit geholt, dann werden die Funktion 
"SetSeg" aufgerufen, dort kommen die richtigen Werte für (Mask/States) 
an und laufen auch so durch die For-Schleife geschleift. Es scheint 
alsob die GPIOs einfach reagieren.
Ich habs auch schon probiert, die GPIOs unmittelbar vor Aufruf neu zu 
initialiseren und zurückzusetzen, hilft alles nichts.

Ich hoff, dass sich jemand hier den erbarmt den Code anzuschauen, und 
eventuell den Fehler findet. Oder den ein oder anderen Tipp für mich 
hat.
Danke im Vorraus.

EDIT: Schaltpläne angehängt.

: Bearbeitet durch User
von Pete K. (pete77)


Lesenswert?

Schaltplan? Du hast vielleicht mit Deinen 12V die GPIOs gegrillt?

von Fabi R. (efabi)


Lesenswert?

Pete K. schrieb:
> Schaltplan? Du hast vielleicht mit Deinen 12V die GPIOs gegrillt?

Hab die Schaltpläne angehängt.
Nein, GPIOs sind in Ordnung, das war auch mein erster Gedanke. Wenn ich 
den Reset-Knopf auf dem ESP-Modul drück, dann holt er sich erneut die 
Zeit und die richtige Uhrzeit wird wieder angezeigt.

von Joachim B. (jar)


Lesenswert?


von Fabi R. (efabi)


Lesenswert?

UPDATE: Nach ner Mütze Schlaf ist mir jetzt ein (ziemlich trivialer) 
Work-Around eingefallen: Polling im Loop ob ein Timer-Interrupt 
geschehen ist. Dort ruf ich dann die Funktion InterruptRoutine auf.

Warum ich diese Funktion nicht direkt im Rumpf der ISR aufrufen kann, 
ist mir immer noch rätselhaft.

von Stefan F. (Gast)


Lesenswert?


von Stefan F. (Gast)


Lesenswert?

Ich möchte auch nochmal Joachims Hinweis wiederholen, dass du den 
kleinen Spannungsregler auf dem Board mit 12V total überforderst. Der 
ist für 5V ausgelegt.

von Stefan F. (Gast)


Lesenswert?

Stefan ⛄ F. schrieb:
> "Interrupt handlers must be placed into IRAM"

Noch was, übersieht man leicht:

"all constant data used by the ISR and functions called from ISR 
(including, but not limited to, const char arrays), must be placed into 
DRAM using"

Siehe auch: 
https://lastminuteengineers.com/handling-esp32-gpio-interrupts-tutorial/

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.