Forum: Mikrocontroller und Digitale Elektronik Tasten entprellen : Syncronisierung Systick und Exti GPIO Interupt


von Marc R. (Firma: ich AG) (mrupprath)


Lesenswert?

Hallo;

ich habe ein paar Probleme zu verstehen wie Interupts ineinander 
greifen.

Mit dem Systick interupt habe ich mir eine Delay Routine aufgebaut.
Der Timer triggert jede mssec einen Interupt.
Delay(300) erzeugt also eine 300 ms Verzögerung.



Ich habe ausserdem einen Taster der einen Externen Interupt auf eine 
steigende Flanke erzeugt.


Ich möchte mit dem taster wechselweise eine LED toggeln.
Hierzu muß ich den Taster jedoch entprellen.

Ich dachte:

--> Taster triggert Externen event.
in der Interupt Routine "Taster":

 --> lies Taster zustand, Speicher Zustand A
 --> Time Delay -300ms
 --> Ließ Tastenzustand, Speichere Zustand B

Wenn Zustand A = B = 1 dann Toggle LED


Problem:

Sobald der Tasten Interupt ausgeführt wird, scheint meine Interupt 
Routine des Systick, welche die Delay Routine aufruft nicht mehr zu 
arbeiten.


Frage:

Wei kann ich eine Zeitverzögerung innerhalb der Tasten Interrupt Routine 
ausführen um den Taster zu entprellen ??

Danke.

von Steel (Gast)


Lesenswert?

In Interupt Routinen gehören keine Delays. Und im Hauptprogramm brauchst 
du die auch nicht.

Für die Tasterabfrage brauchst du auch keine extra Interruptroutine. 
Frag den doch einfach in der Systick-Routine ab.

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


Lesenswert?

Marc Rupprath schrieb:
> Wei kann ich eine Zeitverzögerung innerhalb der Tasten Interrupt Routine
> ausführen um den Taster zu entprellen ??
Das ist die falsche Frage.
Deine eigentliche Frage lautet:
>>> Wie kann ich den Taster entprellen ??
Und dann hast du ein ziemlich simples Problem, das viele tausend vor dir 
schon hatten und das bereits gelöst ist. Den Code findest du hier im 
Forum. Such einfach mal nach "Taster entprellen":
https://www.mikrocontroller.net/search?query=taster+entprellen
Und hier einer der neueren Threads:
Beitrag "Tastenentprellung"
Lies den einfach mal durch...

> Delay(300) erzeugt also eine 300 ms Verzögerung.
Sieh der brutalen Wahrheit ins Auge:
delay(300) blockiert dir den uC für 300ms. Das ist einfach nur 
vergeudete Rechenleistung...

BTW: welcher Taster prellt 300ms?

von Steel (Gast)


Lesenswert?

Ach so, die Systick-ROutine wird nicht mehr ausgeführt, weil der 
Interrupt für den Taster vermutlich eine höhere Priorität hat. Solange 
diese Routine abktiv ist sind damit ISRs geringerer Priotität gesperrt.

von Juergen G. (jup)


Lesenswert?

Lothar Miller schrieb:
> BTW: welcher Taster prellt 300ms?

ein fliegender Draht auf dem Steckbrett.

DuckUndWech!

von Marc R. (Firma: ich AG) (mrupprath)


Lesenswert?

> Sieh der brutalen Wahrheit ins Auge:
> delay(300) blockiert dir den uC für 300ms. Das ist einfach nur
> vergeudete Rechenleistung...
>
> BTW: welcher Taster prellt 300ms?

Die brutale Wahrheit ist das die 300 ms nur ein Beispiel sein sollten.

von Karl H. (kbuchegg)


Lesenswert?

Marc Rupprath schrieb
>
> Die brutale Wahrheit ist das die 300 ms nur ein Beispiel sein sollten.

Die brutale Wahrheit ist aber auch, dass ein delay von 300ms Dauer 
selten sinnvoll ist. Eher - überhaupt nie.
Und da spielt es dann auch keine Rolle mehr, ob du diesen delay mit 
Warteschleifen oder mit Timer realisierst.

Kurze Delays können manchmal sinnvoll sein, wenn man kurze Pulse 
erzeugen muss (zb Kommunikation mit einem DS1820), aber abgesehen davon

  delay ist selten die Lösung. delay ist aber oft das Problem

und da geht es nicht darum, wie der delay realisiert wird, sondern um 
den Einsatz eines delay an sich - egal ob mit Timer oder ohne.

von Peter D. (peda)


Lesenswert?

Marc Rupprath schrieb:
> Hierzu muß ich den Taster jedoch entprellen.
>
> Ich dachte:

Jeder kann gerne von neuem losdenken und alle bisherigen Millionen 
Artikel zum Entprellen ignorieren.

Bloß bitte dann nicht erwarten, daß andere sich Fusseln am Mund reden, 
um zum Millionsten mal alles zu erklären.

von Juergen G. (jup)


Lesenswert?

Vielleicht hatte er ja so ein sicheres Haendchen, dass er sich aus den 
Tausenden von Posts gerade den rausgepickt hat der trotz der vielen 
Diskussionen immer noch an delays oder Interrupts als die Superwaffe zum 
Tasten entprellen glaubt.

Da hilft nur alles lesen und nicht nur das rauspicken was einem in den 
Kram passt.

Oder er meint das die Dannegger Entprellung nicht auf einem ARM(geraten) 
laeuft, weil es zu schwer ist

die DDR's und PORT's auf GPIOn->XXX anzupassen.

von Marc Rupprath (Gast)


Lesenswert?

Hallo;
es geht nicht immer darum bekannte Lösungen einfach nachzubauen sondern, 
und wenn auch nur zum Zwecke des Lernens und Vergleichens, andere Wege 
zu beschreiten.

Ob dieser Weg besser oder schlechter ist mag dann jeder selber 
beurteilen dürfen.


Ich erwarte nicht dass jeder seinen Kommentar abgibt.

Was ich jedoch erwarte, das jeder seine Mund hält der zur Konkreten 
Fragestellung keine Konkrete Antwort geben mag.
Auf überflüssiges Selbstdarstellungsgefasel "Duck und wech" , kann ich 
gerne verzichten.

Ich hatte nicht gefragt, "wie entprellt man einen Taster".

Ich hatte konkret gefragt: "Ist es auf die von mir beschriebene Weise 
möglich
und wo steckt in der konkreten Implementierung der handwerkliche Fehler.


Also:

Die Frage lautete:

Wie muß ich den Systick Timer von der Priorität her konkret einstellen 
damit es überhaupt möglich ist innerhalb der Interupt routine des GPIO 
Pins einen, Vom Systick getriggerten DelayCounter aufzurufen."


Es geht also um die Schachtelung von Interupts und dehren Prioritäten 
und wie diese für einen STM32 Microcontroller konfiguriert werden.



Dennoch danke

von Marc Rupprath (Gast)


Lesenswert?

Hallo ;

wenn  Sie von "er" von mir Reden ist es hilfreich wenn Sie auf die 
dritte Person verzichten würden !

Da hier statt konkrete Antworten lieber Wert auf überflüssige 
Belehrungen gelegt wird einmal eine Belehrung von mir:


Lesen Sie sich die einmal selber die Vielzahl der Forenbeiträge durch 
und streichen einmal unsachliche überflüssige Beiträge heraus.


Guten Tag.

PS:

An den Moderator:

Sie haben recht, dieser Thread ist überflüssig und eine 
Zeitverschwendung
Schliessen und löschen, Danke sehr

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


Lesenswert?

Aber holla, gleich ganz hübsch angesäuert...  :-o
> Was ich jedoch erwarte, das jeder seine Mund hält der zur Konkreten
> Fragestellung keine Konkrete Antwort geben mag.
Du solltest an deiner Kritiktoleranz arbeiten.

Marc Rupprath schrieb:
> Die Frage lautete:
> Wie muß ich den Systick Timer von der Priorität her konkret einstellen
> damit es überhaupt möglich ist innerhalb der Interupt routine des GPIO
> Pins einen, Vom Systick getriggerten DelayCounter aufzurufen."
Die Antwort lautet: sie muss höher sein.
Mehr kann man erst sagen, welchen geheimen Controller du verwendest...

> Ich hatte nicht gefragt, "wie entprellt man einen Taster".
Ich meine, da ganz am Anfang so was gelesen zu haben:
>>> Ich möchte mit dem taster wechselweise eine LED toggeln.
>>> Hierzu muß ich den Taster jedoch entprellen.
Und da taucht in keiner brauchbaren Lösung mehr als 1 Interrupt auf.

>>> Frage:
>>> Wei kann ich eine Zeitverzögerung innerhalb der Tasten Interrupt
>>> Routine ausführen um den Taster zu entprellen ??
Antwort: am einfachsten mit einer Zählschleife.
So funktioniert z.B. das allseits bekannte und beliebte  _delay_ms()

> An den Moderator:
Es waren da gleich mehrere Mods beratend beteiligt...

> Sie haben recht, dieser Thread ist überflüssig
Er kann immer noch als schlechtes Beispiel dienen. Denn eines solltest 
du erkennen: du bist hier in einem Forum (= Besprechungszimmer), und 
hast einen Thread eröffnet (= zur Sitzung eingeladen). Jetzt hast du als 
Threaderöffner (= Sitzungsleiter) zuerst die Aufgabe, allen die selbe 
eine Wissensbasis zu schaffen und über das Besprechungsziel zu 
informieren. Und dann hast vorrangig du selber die von dir einberufene 
Sitzung zu moderieren. Einen Moderator zu holen/brauchen, ist dann wie 
den Chef zu rufen...

> Schliessen und löschen, Danke sehr
Das ist wie beleidigt umdrehen und rausgehen. Das wird im echten Leben 
nicht oft gehen...

> Schliessen und löschen
Threads werden hier nur geschlossen, wenn nichts sinnvolles mehr 
nachkommt und nur dann gelöscht, wenn es purer Nonsens oder politsch 
ist, oder in alle Richtungen beleidigt wird. Das ist in diesem Thread 
nicht der Fall.

von Peter D. (peda)


Lesenswert?

Marc Rupprath schrieb:
> für einen STM32 Microcontroller

Ich glaub, das ist ein neuer Rekord, so spät wenigstens den 
MC-Hersteller anzugeben.

Den genauen Typ und Deine Programmierumgebung kennt aber immer noch 
keiner.
Da brauchst Du Dich auch nicht zu wundern.
Auf unkonkrete Fragen kann es nur unkonkrete Antworten geben. Keiner 
kann in Deinen Kopf hineinsehen.

von Juergen G. (jup)


Lesenswert?

Marc Rupprath schrieb:
> STM32 Microcontroller

Da lag ich nicht mal so falsch mit meiner Vermutung.

Bleibt noch zu raten, welcher der Cortex-M Kerne jetzt speziell zum 
Einsatz kommt.

Zwischen den einzelnen Cortex-M gibt es Unterschiede im Interrupt 
Handling
und ist im Datenblatt zum jeweiligen Kern unter

 Interrupt priority registers

beschrieben.

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.