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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von (unknown) (Gast)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
-1 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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. (stefanus)


Bewertung
0 lesenswert
nicht 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. (stefanus)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.