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.
Beim ESP8266 müssen Interruptroutinen im RAM liegen. https://arduino-esp8266.readthedocs.io/en/3.0.2/reference.html#interrupts
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.
Hier hab ich jetzt gerade mal etwas geschrieben nur weiß ich nicht ob es etwas bringen würde das Programm (UpdateTaster) per Interrupt aufzurufen?
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.
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.
Dann schau mal ins Datenblatt des Sensors, kann gut sein dass er nicht prellt.
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)?
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.
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 ;-)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.