Newbee bittet um Hilfe bei "attachInterrupt"

Hallo liebes Forum,

bin hier frisch eingestiegen in die Arduino Welt und versuche Impulse
eines Reedkontaktes mit dem
NodeMCU V3.3 ESP8266 ESP-12E
oder dem
ESP8266 ESP-12 ESP12 WeMos D1 Mini
zu zählen. Soweit bin ich aber nicht gekommen.

Die ersten Fingerübungen waren erfolgreich, wenn ich aber
zB den Code von
https://www.arduino.cc/reference/en/language/functions/external-interrupts/attachinterrupt/
oder

compiliere und hochlade, bricht der Sketch mit dem
“attachInterrupt”
ins Essen und startet neu (og Code angepasst mit debug code).
Anderen lustigen Code aus den Beispielen im IDE macht er ohne Mucken.
Die Serielle Konsole sieht so aus:

ets Jan 8 2013,rst cause:2, boot mode:(3,6)
load 0x4010f000, len 3584, room 16
tail 0
chksum 0xb0
csum 0xb0
v2843a5ac
~ld
—20:23:14.183 → --------------- CUT HERE FOR EXCEPTION DECODER ---------------
20:23:14.183 →
20:23:14.183 → Abort called
20:23:14.183 →
20:23:14.183 → >>>stack>>>
20:23:14.183 →
20:23:14.183 → ctx: cont
20:23:14.183 → sp: 3ffffee0 end: 3fffffc0 offset: 0000
20:23:14.183 → 3ffffee0: 6d28e000 fe5fbc22 3ffee610 40216218
20:23:14.183 → 3ffffef0: 000000fe 00000000 00000000 00000000
20:23:14.183 → 3fffff00: 00000000 00000000 00000000 00ff0000
20:23:14.183 → 3fffff10: 5ffffe00 5ffffe00 0a0d0304 00000000
20:23:14.183 → 3fffff20: 00000002 00000002 3ffee66c 40203fb2
20:23:14.216 → 3fffff30: 40100462 b7541b25 50696100 40203fc4
20:23:14.216 → 3fffff40: 00000005 3ffefd94 3ffee66c 402044d1
20:23:14.216 → 3fffff50: 00000000 3ffefd94 3ffee610 40202bf7
20:23:14.216 → 3fffff60: 3ffee634 00000003 3ffee66c 3ffee6e4
20:23:14.216 → 3fffff70: 3ffee634 00000003 3ffee66c 40204580
20:23:14.216 → 3fffff80: 3ffee634 00000003 3ffee66c 40201137
20:23:14.216 → 3fffff90: 40205cb0 2346220a feefeffe feefeffe
20:23:14.249 → 3fffffa0: 3fffdad0 00000000 3ffee6a4 40203bb0
20:23:14.249 → 3fffffb0: feefeffe feefeffe 3ffe84ec 40100d61
20:23:14.249 → <<<stack<<<
20:23:14.249 →
20:23:14.249 → --------------- CUT HERE FOR EXCEPTION DECODER ---------------

Verschiedene Boards habe ich auch ausprobiert. ESp8266
Arduino IDE 1.8.13 nochmal frisch installiert, Pakete aktualisiert.
Wo bin ich falsch abgebogen?

Danke und beste Grüße
Maniac

Hallo maniac,

als Anfänger kannst du es nicht wissen. Aber der Beispielcode auf Electronic Wings ist ein sauschlechtes Beispiel.

In einer Interrupt-Service-Routine kurz ISR sollte man niemals Ausgaben auf die serielle Schnittstelle machen.
In dem Beispiel ist das der Programmteil

void IntCallback(){
 Serial.print("Stamp(ms): ");
 Serial.println(millis());
}

Programme nennen sich ja auch Quellcode. Für so einen Programm habe ich den Namen “Quälkot” ;-)))

Ich habe jetzt längere Zeit gesucht bin aber noch nicht fündig geworden.
Es scheint eine Menge “Tutorials” zu geben die serielle Ausgaben in der ISR machen.
Das ist ganz schlechte Programmierpraxis.

Darüber hinaus benötigt man auf dem ESP8266 / ESP32 das IRAM_ATTR sonst gibt es solche crashs
viele Grüße Stefan

1 Like

Ein ESP Tipp:

Das kannst du dir übersetzen.

Dann auf die Idee kommen, dass es einen EXCEPTION DECODER geben muss.
Diesen könntest du in die Arduino IDE integrieren.
Dieser macht die Meldung dann lesbar(er)

Hallo Stefan,

vielen Dank für Deine schnelle Antwort. Leider komme ich mit dem Code aus
https://www.arduino.cc/reference/en/language/functions/external-interrupts/attachinterrupt/
auch nicht weiter:

void blink() {
  state = !state;
}

Selbst wenn die Interrupt Routinen nur ein “i++” machen, bleibt die Situation die gleiche. Wenn das wirklich ein Problem bei der Ausführung des Code wäre, sollte es ja laufen, bis der Interrupt ausgeführt wird. Es bricht aber vorher ab.

Beste Grüße
Maniac

Überlesen?

Und den Exception Decoder verwenden.
Der sagt dir das gleiche.

Hier ist ein Tutorial das zeigt wie man ESP826 / NodeMCU interrupts professionell benutzt.

Wenn du nur wenig englisch kannst dann mach ein Copy & paste der englischen Seite

Internetseiten von google translate übersetzen lassen

using interrupts on ESP32

hier steht es in den docs
ESP8266 Arduino-core interrupts

viele Grüße Stefan

Hallo Comie,

danke für Deine Antwort.
Wenn die im Arduino Tutorial genannten Codeschnipsel nicht
funktionieren, gehe ich davon aus, das Problem liegt nicht am Code.
Stimmst Du dem zu?

Muss ich ggf noch andere Pakete zusätzlich installieren?
Gerne baue ich das ELF nochmal und post hier die Ausgabe des Decoders.

Beste Grüße
Maniac

Der ESP ist kein Arduino!
Es ist unsinnig die Arduino Doku auf ESP anzuwenden.

Gerät und Handbuch müssen zusammen passen.
Ist das logisch?

Der ESP hat eine eigene Doku.

Du sollst das tun, was der Decoder sagt.
Klar, kannst du das auch gerne posten.
Aber wichtiger ist, dass du selber richtig handelst.

Ganz ehrlich - Interrupts werden von Einsteigern oftmals falsch und vor allem unnötig eingesetzt. Bevor man mit Interrupts arbeitet, sollte man sich erstmal tief mit der Materie befasst haben. In den meisten Fällen wo hier danach gefragt wird, braucht man sie gar nicht. Auch für das Abfragen eines Reed-kontaktes dürften sie in >99% der Fälle überflüssig sein.
Interrupts sind nicht einfach nur ‘Funktionen’ wie alle anderen auch. Da steckt wesentlich mehr dahinter, und wenn man das nicht versteht, machen sie nur Ärger.

Also erstmal versuchen ohne Interrupts auszukommen. Das geht fast immer :wink: .
Für einen Einsteiger wäre es erstmal viel wichtiger das blockadefrei Programmieren zu lernen. Dann werden die Fälle wo Interrupts interessant werden schonmal vieeeel weniger.

1 Like

Danke StefanL38,

hat das Problem gelöst. Antwort ist so trivial, man konnte (ich hab) sie fast überlesen.
Der Beispielcode passt nicht, hat er ja auch geschrieben, es braucht offensichtlich ein

 void IRAM_ATTR IntCallback(){

Vielen Dank an Stefan für die konstruktive Hilfe auf eine sehr konkrete Frage hier.

Danke und Gruß
maniac