Forum: Mikrocontroller und Digitale Elektronik ESP8266 Interrupt wird nicht mehr ausgeführt


von Peter K. (bitwender)


Angehängte Dateien:

Lesenswert?

Hallo,

ich wende mich an euch, weil ich ein dickes Problem habe.

Ich versuche einen Phasenabschnittsdimmer zu programmieren und verwende 
einen externen Interrupt im Nulldurchgang. So weit funktioniert alles.

Wenn ich allerdings noch eine bestimmte if-Abfrage in meinen Code 
einfüge, scheint der Interrupt nicht mehr bearbeietet zu werden. Ich 
kann ihn durch erneute Parametrierung auch nicht mehr zum Leben erwecken 
und das Problem scheint sogar einen Reset zu überstehen. Ich verstehe 
das nicht... So etwas unerwartetes habe ich noch nie erlebt.
Es ist nicht mein erstes Programm auf einem ESP und auch nicht der erste 
Interrupt, den ich programmiere. Andere Interrupts auf dem ESP 
funktionieren einwandfrei, auch externe.

Wenn ich im anhängenden Code die beiden auskommentierten Zeilen 
aktiviere, "stirbt" der Interrupt dauerhaft, sobald die Zeilen innerhalb 
des if-Zweigs nicht mehr bearbeitet werden. Das Problem ist 
reproduzierbar.

Es hat eine Weile gedauert, bis ich diese Ursache gefunden habe.
Was ich bisher unternommen habe:
- Änderung der if-Abfrage
- erneutes Eintragen des Interrupts per attachInterrupt(), auch mit 
vorangehendem detachInterrupt()
- Kürzung des Codes der Interruptroutinen

Vielleicht hat eine(r) so etwas schon erlebt und kann helfen?

von Alexander (alecxs)


Lesenswert?


: Bearbeitet durch User
von Peter K. (bitwender)


Lesenswert?

Ja, Arduino IDE 2.1.1

Danke für den anderen Beitrag.

Aber an einen Überlauf habe ich auch schon gedacht. sRam.iTckHw ist long 
deklariert und liegt immer um die 50000, für einen 16bit-int also zu 
groß. igTckS (auch long) liegt immer zwischen 0 und iTckHw. Die Werte 
stimmen.
Da igTckS allmählich inkrementiert wird, kann ich zugucken wenn die 
Software aussteigt. NUL_MIN_V hat übrigens den Wert 50.

Ich habe die Compiler-Warnungen eingeschaltet und bekomme nun eine 
Warnung:  'void intNull()' is deprecated: Use IRAM_ATTR in place of 
ICACHE_RAM_ATTR to move functions into IRAM [-Wdeprecated-declarations]
Ist meine Deklaration falsch? Was ist der Unterschied zwischen IRAM_ATTR 
und ICACHE_RAM_ATTR?
Ich hatte das ausprobiert, aber keinen Unterschied festgestellt...

von Alexander (alecxs)


Lesenswert?

Hab nun die ino Datei gesehen... wenn ich es richtig verstehe hat der 
Interrupt nach erreichen der Bedingung keine Funktion mehr, daher würde 
es mich nicht wundern wenn der Compiler hier was wegoptimiert, dass den 
Interrupt killt.

Du könntest ja mal ein else asm volatile(""); oder ein Serial.print 
hinzufügen, dann merkst du ob es einen Unterschied macht oder nicht.

Dass er einen Reset übersteht liegt vermutlich daran dass du ihn 
speicherst. Wo nun der Unterschied ist zwischen RAM und CACHE weiß ich 
auch nicht, aber beide Speicher scheinen wohl nach deiner Beobachtung 
einen Reset zu überleben.

: Bearbeitet durch User
von Peter K. (bitwender)


Lesenswert?

Sorry, ich musste die letzten Tage etwas Anderes machen...

Also:
- Alle warnings (bis auf eine - Variable not used) beseitigt
- else-Zweig verwendet
Aber der Interrupt wird mit Erreichen der Bedingung definitv nicht mehr 
ausgeführt.

Wenn sonst niemand mehr eine Idee hat fürchte ich, dass ich mich mit dem 
Debugger auseinandersetzen muss. Mir fällt sonst nämlich auch nichts 
mehr ein.

Erst Mal danke für die Hilfe

von Peter K. (bitwender)


Lesenswert?

Hallo,
ich habe die Ursache. Die Hardware war's.
Wenn die Lampe voll an ist, wird kein Nulldurchgang mehr erkannt, also 
auch kein Interrupt mehr ausgelöst.

Das ist aber jetzt eine andere Baustelle.

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.