Forum: Mikrocontroller und Digitale Elektronik STM32F4 - µC Taster Entprellen bei der ISR


von (unknown) (Gast)


Lesenswert?

Hallo Leute,

Ich hab als Aufgabe in der FH 4 7-Segmentbausteine zu Multiplexen und 
via Interrupts die anzuzeigende Zahl hochzuzählen.

Die Ext Int 1-4 werden über 4 nicht entprellte Taster getriggert.

Das Programm selbst funktioniert, allerdings ist mir aufgefallen dass 
manchmal pro Tastendruck mehrmals hochgezählt wird weil durch das 
Entprellen die ISR mehrmals aufgerufen wurde.

Einen Taster normal zu entprellen wäre eigentlich kein Problem aber in 
der ISR bin ich mir nicht sicher wie ich das anstellen soll.

Meine Idee wäre es gewesen ein Funktion zu schreiben die aufgerufen 
wird, den Interrupt deaktiviert, einen Timer startet der 5ms zählt, 
dieser Aktiviert nach Ablauf der Zeit den Interrupt wieder.

Könnte das so funktionieren, oder gibt es dafür eine bessere 
Möglichkeit?

mit freundlichen Grüßen,
Alex

von Carl D. (jcw2)


Lesenswert?

Es gibt hier im Forum einen Artikel, bei den besonders folgendes 
lesenswert ist:
https://www.mikrocontroller.net/articles/Entprellung#Timer-Verfahren_.28nach_Peter_Dannegger.29

von TU Student 1. (student0)


Lesenswert?

Mach es lieber durch Vergleich der Zustände, denn dann hast du 
schnellere Reaktionszeiten.

Ein Vorschlag wäre das hier:
http://ww1.microchip.com/downloads/en/AppNotes/5_001.pdf

Das ist zwar für den PIC, aber die Theorie ist anhand der Tabelle klar.

D.h. du speicherst jeweils den Zustand der zu entprellenden Bits, 
tastest es in gewissen Zeitabständen ab und ignorierst Änderungen 
(letzter Zustand == derzeitiger Zustand).   Du könntest aber auch 
schneller abtasten, die letzten N Zustände speichern und ab einer 
Schwelle entscheiden (wenn ein Bit mehr als M Mal in N Samples 
hintereinander gleich ist, gilt es)

Im Prinzip ist das eine Art digitales abgetastetes Tiefpassfilter.

von Carl D. (jcw2)


Lesenswert?

Das ist nichts anderes als PeDa's Verfahren, nur daß es einen 1-Bit 
statt einem 2-Bit Zähler verwendet.

von Stefan F. (Gast)


Lesenswert?

Ein einfacher dirty Hack wäre, in die ISR einen delay für 10ms 
einzubauen.
Die Prio der Matrix-Anzeige ISR müsste dann allerdings höher (kleinere 
Zahl) sein, damit die Anzeige nicht ins stocken gerät.

Trotzdem solltest du Dir die obigen sauberen Vorschläge wenigstens 
einmal anschauen.

von Stefan F. (Gast)


Lesenswert?

Nochwas: Um Zeiten zu messen nutzt man normalerweise den systick Timer, 
der ständig läuft und nie zurückgesetzt wird.

start=systicks;
...
ende=systicks;
elapsedTimeMs=ende-start;

Die Berechnung mit minus funktioniert auch, wenn der Timer zwischendurch 
übergelaufen ist.

von Patrick J. (ho-bit-hun-ter)


Lesenswert?

Hi

Das würde ich etwas anders lösen - setze doch einfach einen Counter 
(eine Art als Flag), daß der Taster erkannt wurde, Welchen Du die 
Entprellzeit lang herunter zählst.
Wenn Dein Timer-Interrupt während der genannten 5ms 100x zuschlägt, 
sollte der Counter bei jedem Erkennen auf 100 gesetzt werden.
Counter runterzählen, wenn der Zählerwert >0 ist
Taste als erkannt werten, wenn Counterwert==1 ist

MfG

von m.n. (Gast)


Lesenswert?

TU S. schrieb:
> Mach es lieber durch Vergleich der Zustände, denn dann hast du
> schnellere Reaktionszeiten.

Im Gegenteil, die Reaktionszeit wird durch wiederholten 
Zustandsvergleich langsamer. Ein Interrupt bietet immer die schnellste 
Reaktion, nur muß man sich bei der Entprellung ein wenig geschickter 
anstellen.
Schnelle Reaktion ist hier allerdings garnicht gefragt und notwendig, es 
sei denn, die Schaltimpulse würden von Relaiskontakten (Reedrealis + 
Magnet) kommen.

von TU Student 1. (student0)


Lesenswert?

m.n. schrieb:
> TU S. schrieb:
>> Mach es lieber durch Vergleich der Zustände, denn dann hast du
>> schnellere Reaktionszeiten.
>
> Im Gegenteil, die Reaktionszeit wird durch wiederholten
> Zustandsvergleich langsamer. Ein Interrupt bietet immer die schnellste
> Reaktion, nur muß man sich bei der Entprellung ein wenig geschickter
> anstellen.
> Schnelle Reaktion ist hier allerdings garnicht gefragt und notwendig, es
> sei denn, die Schaltimpulse würden von Relaiskontakten (Reedrealis +
> Magnet) kommen.

OK, mein Fehler, Interrupt und Zustandsvergleich wäre es.   Die 
Reaktionszeit bezog  sich auf das meist zu großzügige fixe Delay, 
welches man zum einfachen Entprellen nimmt.

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.