Forum: Mikrocontroller und Digitale Elektronik ESP8266 Interrupt


von Marcel (Gast)


Angehängte Dateien:

Lesenswert?

Moin!

Ich habe ein Problem und zwar möchte ich einen Code schreiben der per 
Interrupt aufgerufen wird sobald ein Pin (welcher ist egal) auf high 
(3,3V) geht so das dadurch eine Variable um 1 erhöht wird aber wirklich 
nur um 1 auch wenn der Pin längere Zeit auf HIGH bleibt.

Daher habe ich wie man es unter angehängten Dateien sehen kann probiert 
aber es kommt irgendwie immer das selbe Ergebnis was ich mache und zwar 
das Bild welches Ihr am Bild "SerialMonitor" sehen könnt.

Ich hoffe Ihr könnt mir bei dem Problem helfen denn ich weiß nicht mehr 
weiter was da Falsch ist. Das einzige was ich mir gedacht habe ist das 
das Problem mit der Übergabe der Variable i zu tun hat aber ich weiß es 
leider nicht.

von Stefan F. (Gast)


Lesenswert?

Beim ESP8266 müssen Interruptroutinen im RAM liegen.

https://arduino-esp8266.readthedocs.io/en/3.0.2/reference.html#interrupts

von Marcel (Gast)


Angehängte Dateien:

Lesenswert?

Hab es gerade herausgefunden und es funktioniert auch nun so weit doch 
ich bin mir gerade nicht sicher ob es an dem Schalterprellen liegt oder 
an etwas anderem und zwar zählt er nicht nur immer um 1 höher sondern 
immer gleich um3 oder 4.

von Stefan F. (Gast)


Lesenswert?

Natürlich, Schalter prellen. Das ist ganz normal.

von Marcel (Gast)


Angehängte Dateien:

Lesenswert?

Hier hab ich jetzt gerade mal etwas geschrieben nur weiß ich nicht ob es 
etwas bringen würde das Programm (UpdateTaster) per Interrupt 
aufzurufen?

von Stefan F. (Gast)


Lesenswert?

Marcel W. schrieb:
> Hier hab ich jetzt gerade mal etwas geschrieben nur weiß ich nicht
> ob es
> etwas bringen würde das Programm (UpdateTaster) per Interrupt
> aufzurufen?

Warteschleifen in ISR sind böse. Wenn zu lang, macht der Watchdog sogar 
einen Reset.

Dein versucht, Tastendrücke per ISR zu erfassen, ist schon 
problematisch. Das geht viel einfacher in einem Timer-Interrupt, und 
dort dann auch ohne Warteschleifen.

Du kannst zum Beispiel einen Timer auf 10ms Intervall einrichten und 
darin alle Eingänge abfragen. Zum Entprellen verlangst du einfach 
zweimal hintereinander den selben Status (HIGH oder LWO), das sollte bei 
den meisten Tastern schon genügen.

von Marcel (Gast)


Lesenswert?

Naja es geht ja nihct um einen Taster der war nur Testweise verbaut. 
Eigentlich soll ein Halleffektsensor der über einen Operationsverstärker 
als Vergleicher verbunden ist an den ESP angeschlossen werden und immer 
wenn eine volle Umdrehung fertig ist soll die Variable um i erhöht 
werden. Später soll das ganze per MQTT abgefragt werden so das ich per 
MQTT die Variable i als Antwort bekomme.

von Stefan F. (Gast)


Lesenswert?

Dann schau mal ins Datenblatt des Sensors, kann gut sein dass er nicht 
prellt.

von Patrick L. (Firma: S-C-I DATA GbR) (pali64)


Lesenswert?

Sorry für den etwas OT.

Stefan ⛄ F. schrieb:
> Beim ESP8266 müssen Interruptroutinen im RAM liegen.

Jetzt mal ganz dumm gefragt.

Ist das so? das heißt es muss zuerst eine Software ins RAM kopiert 
werden bevor ein Interrupt verwendet werden kann?

Ich kenne mich mit dem ESP8266 grad gar nicht aus, da ich ihn bis dato 
nicht verwendet hatte, oder Geräte in welchen so einer drin ist, nur zur 
Hardware Rep kahmen.

Aber das finde ich ja unsinnig, dass die Interrupts im RAM liegen 
müssen, oder habe ich da was falsch Verstanden(gelesen)?

von Stefan F. (Gast)


Lesenswert?

Patrick L. schrieb:
> Ist das so? das heißt es muss zuerst eine Software ins RAM kopiert
> werden bevor ein Interrupt verwendet werden kann?

Ja logisch. Das ganze Programm muss vor dem Ausführen ins RAM kopiert 
werden, weil der Flash Speicher viel langsamer angebunden ist, als die 
CPU taktet.

Beim Hauptprogramm finden diese Kopiervorgänge Blockweise und 
automatisch statt, aber eben nicht bei den ISR.

Außerdem ist der Flash typischerweise 1 bis 4 Megabytes Groß (wovon 
maximal 1 Megabyte Programm-Code sein dürfen), der zugehörige 
Programmspeicher im RAM aber nur einige zig Kilobytes. Da wird also 
ständig umkopiert.

von Patrick L. (Firma: S-C-I DATA GbR) (pali64)


Lesenswert?

Stefan ⛄ F. schrieb:
> Da wird also
> ständig umkopiert.

Danke für die Info.
Ja natürlich das habe ich schon Verstanden dass der Flash zu lahm ist 
und der RAM quasi als "Cache-Speicher" fungiert. Nur habe ich das echt 
nicht Kapiert wieso das nicht Automatisch geht.

Aber nochmals Danke Stefan ⛄ F. für die Info, war interessant, den ich 
kenne dass ja noch von div. "Steinzeit" CPU's wo die Interrupts sogar 
nur in der ersten RAM-Page liegen durften, da sie nur mit der 
Kurzform-Adressierung angesprochen werden konnten ;-)

von Marcel (Gast)


Lesenswert?

Hab es mit den Sensor schon ausprobiert funktioniert nicht aber mit dem 
Programm von mir schon nur ist die Frage wie ich das Programm so 
umschreiben kann das es als Interrupt funktioniert denn das MQTT 
Programm soll dann einfach im Loop laufen und unterbrochen werden wenn 
der Interrupt triggert.

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.