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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Fabi R. (efabi)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht lesenswert
Schaltplan? Du hast vielleicht mit Deinen 12V die GPIOs gegrillt?

von Fabi R. (efabi)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht lesenswert

von Fabi R. (efabi)


Bewertung
0 lesenswert
nicht 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. (stefanus)


Bewertung
0 lesenswert
nicht lesenswert

von Stefan ⛄ F. (stefanus)


Bewertung
1 lesenswert
nicht 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.

: Bearbeitet durch User
von Stefan ⛄ F. (stefanus)


Bewertung
0 lesenswert
nicht 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/

: Bearbeitet durch User

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.