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
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
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.
Das ist nichts anderes als PeDa's Verfahren, nur daß es einen 1-Bit statt einem 2-Bit Zähler verwendet.
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.
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.
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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.