Forum: Mikrocontroller und Digitale Elektronik Probleme beim Entprellen.


von Marcel S. (marcel_s)


Lesenswert?

Hallo,

ich hab eine Hardware-Entprellung mir RC-Glied aufgebaut.
Siehe: 
http://blog.cc-robotics.de/wp-content/uploads/2007/03/entprell.png, die 
linke Version habe ich. Ich frage den PIN 2 per Interrupt ab und zähle 
einen Zähler hoch. Leider funktioniert die Entprellung nicht immer 
richtig. So dass sich der Zähler verzählt
Ich habe den 100nF Kondensator schon durch Kondensatoren von 68nF bis 
über 300nF verändert. Es ist aber keine spührbare Besserung eingetreden 
(bei zirka 5% bis 10% der Betätigungen wird Zähler um mehr als 1 
erhöht). Ich verwende diesen Taster, Link: 
http://www.reichelt.de/Kurzhubtaster/TASTER-9302/3/index.html?;ACTION=3;LA=2;ARTICLE=44579;GROUPID=3278;artnr=TASTER+9302

Was kann ich an meiner Schaltung verändern, so dass die Schaltung nicht 
mehr prellt? Laut Datenblatt beträgt die Prellzeit des Tasters max 10ms.

Vielen Dank für eure Hilfe

Marcel

von Michael D. (etzen_michi)


Lesenswert?

10ms @ 1MHZ = biszu 10 Impulse

1. Sollte man nicht mit dem Taster einen Kondensator (auch einen kleinen 
nicht) kurzschließen oder anklemmen, sonst fängt er mit der Zeit an zu 
prellen, weil die Kontakte hinüber sind.


Versuche mal das hier:

                VCC
                 |
                [R]
                 |
µC-----+--[R]----+
       |         |
      ---        \ <- Taster
      ---        |
       |         |
      GND       GND


Am besten ist es einen Taster per Polling ab zu fragen, bzw. wenn es per 
Interrupt sein muss diesen nach einem Input eine bestimmte Zeit z.B. 
15ms lang zu sperren.

von Teo D. (teoderix)


Lesenswert?

Sperr doch einfach den Interrupt für >10ms (Achtung Flag!)

von Peter D. (peda)


Lesenswert?

Marcel S. schrieb:
> ich hab eine Hardware-Entprellung mir RC-Glied aufgebaut.

Der Taster schließt den geladenen Kondensator kurz, d.h. es fließen etwa 
10000A!
Je nach Leiterzugführung können diese 10000A allen möglichen Unsinn mit 
der CPU veranstalten.

Nimm daher besser SW-Entprellung, die funktionert zuverlässig.

von Marcel S. (marcel_s)


Lesenswert?

Peter Dannegger schrieb:
> Nimm daher besser SW-Entprellung, die funktionert zuverlässig.

Anfangs habe ich SW-Entprellung verwendet, die Funktion die ich mir dazu 
ausgedacht, habe hat super Funktioniert. Aber leider hab ich es nicht 
geschaft das ganze mit einem Interrupt am PIN 2 zu kombinieren. Deshalb 
hab ich es jetzt mit HW-Entprellung versucht.

Hat jemand Tipps wie ich SW-Entprellung mit Interrupts kombinieren kann.

Vielen Dank für die Unterstützung

Marcel

von Thomas E. (thomase)


Lesenswert?

Marcel S. schrieb:
> Hat jemand Tipps wie ich SW-Entprellung mit Interrupts kombinieren kann.
Gar nicht. Taster pollt man mit einem Timer.

mfg.

von spontan (Gast)


Lesenswert?

Interrupts machen Sinn, wenn ein externes Ereignis (z.B. eine Schaltung 
wie ein Blitzdetektor, Nulldurchgangsdetektor)eine Aktion auslösen soll.

Wenn ein Mensch eine Taste drückt, da spielt in der Regel eine 
Verzögerung von ein paar Millisekunden keine Rolle.

Pollen und gut.

von Michael D. (etzen_michi)


Lesenswert?

Ich habe dir sowohl eine Info gegeben zu:

HW Entprellung
Entprellung mit Interrupt
Entprellung mit Polling


Wenn du nicht lesen willst selber schuld.

von Karl H. (kbuchegg)


Lesenswert?

Marcel S. schrieb:

> Hat jemand Tipps wie ich SW-Entprellung mit Interrupts kombinieren kann.

Hmm.
Ich bin versucht zu sagen, dass da wieder mal _delay_ms und 
Warteschleifen in unbekannter aber viel zu langer Zeitdauer dahinter 
stecken, warum du unbedingt meinst, für die Tasten einen Interrupt zu 
benötigen.
Wenn dem so ist, dann sitzt das Problem tiefer, weil der ganze 
Programmaufbau dann nicht vernünftig ist.

von Pirmus (Gast)


Lesenswert?

Versuche noch die Hardware-Entprellung mit Schmidt-Trigger

von Pirmus (Gast)


Lesenswert?

Peter Dannegger schrieb:
> Marcel S. schrieb:
>> ich hab eine Hardware-Entprellung mir RC-Glied aufgebaut.
>
> Der Taster schließt den geladenen Kondensator kurz, d.h. es fließen etwa
> 10000A!
> Je nach Leiterzugführung können diese 10000A allen möglichen Unsinn mit
> der CPU veranstalten.
>
> Nimm daher besser SW-Entprellung, die funktionert zuverlässig.


Also wenn da wirklich 10'000 Ampere fliessen würden könnte er sein uC 
Board jetzt Löffeln.. oder mit nem Strohhalm aufsaugen

Meinst du das ernst?

von Peter D. (peda)


Lesenswert?

Pirmus schrieb:
> Also wenn da wirklich 10'000 Ampere fliessen würden könnte er sein uC
> Board jetzt Löffeln.. oder mit nem Strohhalm aufsaugen

Der fließt ja nur sehr kurz (wenige ns), hat also wenig Energie.

Die 10000A sind vielleicht etwas hoch gegriffen, die Leiterzüge bilden 
ja Spulen, die den Stromfluß verzögern. Aber 100A sind durchaus zu 
erreichen (wenige ns lang).

Auch bilden die Leiterzüge mit dem Kondensator einen Schwingkreis und 
mit +5V angeregt, schwingt der bis -5V durch, d.h. der Eingangspin sieht 
kurz mal -5V, was dem MC auch nicht gefallen wird.

von Peter D. (peda)


Lesenswert?

Marcel S. schrieb:
> Hat jemand Tipps wie ich SW-Entprellung mit Interrupts kombinieren kann.

SW-Entprellung benutzt in der Regel einen Timerinterrupt. Wenn man also 
will, kann man das Ereignis in diesem Interrupt auch schon auswerten 
(z.B. Not-Taster).

Klarer und deutlich einfacher wird der Programmfluß allerdings, wenn der 
Timerinterrupt das Ereignis nur erkennt (ein Flag setzt) und es erst die 
Mainloop auswertet. Daher sieht man in der Praxis fast immer nur diesen 
Weg.

von Marcel S. (marcel_s)


Lesenswert?

Hallo,

als erstes möchte ich mich für die vielen Tipps bedanken.
Ich bin gerade dabei die Tastenabfrage per Timer-Interrupt zu 
programmieren. In der Schule arbeiten wir mit dem 68HC11 im Vergleich 
dazu ist das Datenblatt vom ATmega 2560 sehr komplex. Wobei mir dort 
auch keine Interrupts und dergleichen verwenden.

// Timer1 konfigurieren

TCCR1A = 0x00;
TCCR1B = 0x01;

// Interrupt Initialisieren
TIMSK1 = 0x01;

Hier im Forum hab ich aber noch eine andere Möglichkeit gefunden die 
Timer zu konfigurieren. Ich habe sie auf meinen Fall abgeändert:

TCCR1A = (0 << CM1A1) | (0 << CM1A0) | (0 << COM1B1) | (0 << COM1B0)|
         (0 << COM1C1) | (0 << COM1C0) | (0 << WGM11) | (0 << WGM10);

TCCR1B = (0 << ICNC1) | (0 << ICES1) | (0 << WGM13) | (0 << WGM12)|
         (0 << CS12) | (0 << CS11) | (1 << CS10);

Ich hab noch nicht so genau verstanden was das für ein Konstrukt ist: 
TCCR1A ist meiner Meinung nach ein 8 Bit Register das für die 
Verschiedenwertigen Bits Namen wie z.B.  CM1A1 hat, den Namen kann man 
dann den Wert 1 oder 0 zuweisen.

Aber für was steht das oder ( | ) und warum wird ein „<<“ verwendet? das 
bedeutet doch Links-Shift.
Ich hab unter 
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Anforderungen_an_Interrupt-Routinen
ein schönes Tutorial gefunden.
Aber ich darf Atmel Studio nicht verwenden, da unser Lehrer für das 
Projekt nur die Verwendung der Arduino Umgebung  oder des 68HC11 
erlaubt.

Die Befehle sei() und cli() sind denke ich über die Bibliothek avr/io.h 
oder avr/interrupt.h   eingebunden. Gibt es irgendeine Anleitung oder 
Tutorial in dem gezeigt wird, wie ich ohne diese Bibliotheken auskomme?

Vielen Dank

Marcel

von Joe (Gast)


Lesenswert?

Da gehört noch ein Widerstand, ungefähr R/10, zwischen Taster und 
Kondensator.

Joe

von Anja (Gast)


Lesenswert?

Marcel S. schrieb:
> Was kann ich an meiner Schaltung verändern, so dass die Schaltung nicht
> mehr prellt?

Verwende einen Taster mit Umschaltkontakt und nimm ein RS-Flip-Flop (2 
NAND-Gatter) je Taster.

http://www.reichelt.de/Eingabetaster-Digitast-/DIT-1-RT/3//index.html?ACTION=3&GROUPID=3280&ARTICLE=7141&SHOW=1&START=0&OFFSET=500&;

Gruß Anja

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.