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
Schaltplan? Du hast vielleicht mit Deinen 12V die GPIOs gegrillt?
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.
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.
"Interrupt handlers must be placed into IRAM" https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-guides/general-notes.html
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.