Forum: Mikrocontroller und Digitale Elektronik Allgemeine Frage EXTI IRQ -> LED ändert sich willkürlich


von Flo (Gast)


Lesenswert?

Hallo zusammen,

ich bastel hier mit meinem STM32 Board,
und habe als Pheripherie eine Platine geätzt,
mit 4 Tastern und 4 LEDs.

Ich kann alles ansteuern, wunderbar...

Nur mir ist etwas aufgefallen...

Ein Taster ist als EXTI IRQ eingestellt,
und macht auch seine Arbeit...
Da ich mit dem DebugModus nicht klar komme,
nutze ich immer eine LED als optische Kontrolle...

Nun blinken meine LEDs schön vor sich hin,
und der EXTI Interrupt setzt ein...
Der Interrupt hat programmiertechnisch keinen Einfluss
auf die LEDs, und dennoch kommt es vor, dass eine plötzlich aus ist,
oder aufeinmal permanent an ist (vorher PWM artig geleuchtet),
der gedimmt.

Habt Ihr eine Idee welche Ursachen das haben kann?



Mir ist das schon beim sporadischen Testen,
am Anfang meines Projektes aufgefallen.
Alle 4 Taster als EXTI, mit einfachen LED an aus Funktionen,
und dennoch wirds nicht so sauber gemacht wie gewollt,
irgendwie alles willkürlich.


Nun ja, als Laie wäre ich wirklich glücklich solche Phenomäne
aus dem Weg gehen zu können.

von oldmax (Gast)


Lesenswert?

Hi
Taster und Interrupt.... dieses Thema ist so alt wie Methusalem. Aber 
gut, hier mein Tip: Lies die Eingänge von Kontaktbehafteten 
Schaltgliedern in einer eigenen Routine ein, die du am Anfang deine 
Programmschleife aufrufst. Sowas nennt sich pollen. Da die Kontakte in 
der Regel nach GND schalten, ist es besser, man Invertieret die 
Eingangsbits. Das erleichtert es dem Proggrammierer, denn irgendwie ist 
es in unseren Köpfen verankert: Taster gedrückt = "1"-Signal.
Kommen wir zu einem weiteren Problem, dem Prellen von Kontakten. Ein 
Kontakt schließt oder öffnet nicht einfach, sondern das Signal beginnt 
zu flackern, bevor es eine stabile Lage hat. Dies bedeutet, rufst du 
eine Interruptroutine beim Schalten auf, so wird diese mehrfach 
aufgerufen. Um dieses "Prellen" der Kontakte abzufangen gibt es aber 
genug andere Beiträge. Auch in den Tutorials ist dies ein Thema.
Kommen wir nun zu weiteren Problemen. Da sind bspw. die 
Pull-Up-Widerstände. Sind diese eingeschaltet ? Ist der Stack 
initialisiert ? In Abhängigkeit der Programmiersprache gibt es 
unterschiedliche Voraussetzungen. Während Hochsprachen bei einem 
Interrupt  Registerinhalte von Hause aus sichern ist dies bei Assembler 
z.B. vom Programmierer vorzunehmen. Da du dich dazu ncht äußerst, kann 
ich nur daraf hinweisen
Gruß oldmax

von Flo (Gast)


Lesenswert?

Moin Oldmax,

um Deine Uhrzeit bin ich noch nicht
so spontan zum schnellen Antworten ;)

Also den Schalter nutze ich zur Simulation,
da später ein Eingangssignal (Lichtschranke),
diesen Interrupt auslösen soll.


Vom Prellen hab ich schonmal gehört,
nur folgendes, wie gesagt haben die Interruptroutine
und die zu leuchtende LED, direkt nichts am Hut
(also auch kein Programmeinfluss auf eine Routine
wo die LED drin hängt)

So müsste man meinen das,
sollte der Schalter aufgehört haben zu schwingen,
der Interrupt letztmalig einmal durchläuft,
und das Hauptprogramm dannach normal durchläuft,
somit leuchtet die LED wie sie soll.

In der Zeit wo der Schalter getätig wird
(Tastendruck kleiner 1sek)
kann ich eine Störung durch das mehrmalige unterbrechen
durch die Routine verstehen.

Dannach sollte es doch wieder nromal laufen???

- Pull-Up/Down Widerstände sind aktiviert.

Stack initialisieren?
Davon hör ich das erste mal...
aber ich nutze C, davon ausgehend wirds eh wahrscheinlich automatisch 
gemacht, oder?

Danke erstmal für die Antwort

von Dietrich L. (dietrichl)


Lesenswert?

Ist der Interrupt flankengesteuert oder statisch? Im 2. Fall würde der 
Interrupt solange andauern/wiederholt werden, wie die Taste gedrückt 
ist.

Gruß Dietrich

von Flo (Gast)


Lesenswert?

EXTI_Trigger_Rising

also flankengesteuert...
aber ändern tut es das Problem wohl nicht, oder?

von oldmax (Gast)


Lesenswert?

Hi
Ich bin zwar bei C raus, dennoch wird dein Problem wohl ohne ein wenig 
Code kaum lösbar sein. Gut, Stack ist bei C initialisiert und ich nehme 
auch an, das verwendete Register esichert sind. Evtl. ist die ISR 
nichtprogrammiert und bei einem Auftreten eines Interrupts läufst du 
praktisch in den Programmanfang, also in die Initialisierung. Die IVT 
liegt ja adressenmäßig im unteren Bereich. Aber wie gesagt, ich kenn 
mich mit C nicht aus.
PS: was für eine frühe Morgenstunde ...? Da habe ich schon den halben 
Tag hinter mir gehabt...
Gruß oldmax

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Flo schrieb:
> Alle 4 Taster als EXTI, mit einfachen LED an aus Funktionen,
> und dennoch wirds nicht so sauber gemacht wie gewollt,
> irgendwie alles willkürlich.
Schon mal was von Tasterprellen/Schalterprellen gehört?
Such einfach mal nach Interrupt Taster und Prellt hier im Forum:
http://www.mikrocontroller.net/search?query=interrupt+taster+prellt

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.