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?
:
Bearbeitet durch User
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...
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.