Fehlersuche Code Arduino IDE ESP32 - Timer Interrupt - NTP-Client

OP #6286074
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.
Angehängte Dateien:
OP #6286401
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.

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