Forum: Mikrocontroller und Digitale Elektronik Taster entprellen und erkennen funktioniert schlecht


von Jan S. (spongebob)


Lesenswert?

Moin!
Ich habe drei Taster, welche ich detektieren will.
Um eine Software-entprellung zu realisieren, setze ich einfach im int0 
interrupt (nur steigende Flake) ein Bit. Wenn dieses Bit gesetzt ist, 
wird eine zeit gewartet. Und nach ablauf dieser Zeit wird abgefragt, 
welcher Pin eine 1 anliegen hat.
Die wartezeit habe ich mit 1ms, 5ms und 20ms getestet.

Das Problem ist nun, das bei kurzem drücken des Tasters immer nicht 
erkannt wird, welcher Taster gedrückt wurde. Wenn ich den Taster aber 
wirklich lange drücke, wird der Taster am richtigen Eingang erkannt. 
Dazu kommt noch, das manchmal bei loslassen des Tasters auch ein 
Tasterdruck detektiert wird. Das kann ich mir aber sogar erklären.

Jetzt zum Aufbau:
Die Taster sind alle über jeweils eine Diode verbunden (Kathode am 
Int0-Eingang).
Von der Anode der einzelnen Taster geh ich auf Eingänge an PORTA, um zu 
erkennen welcher Taster nun gedrückt wurde.

Zum Programm:

Initialisierung der Interrupts:
1
void init_intr(void)
2
{
3
  ///////////////////////////////////////////////////////////////////
4
  // Initialize External Interrupt                                                      
5
  
6
  //Interrupt at rising edge at INT0 Input
7
  MCUCR |= ((1<<ISC00) | (1<<ISC01));
8
  
9
  //Enable Interrupt on INT0
10
  GICR |= (1<<INT0);
11
  
12
  ///////////////////////////////////////////////////////////////////
13
  // Initialize Timer compare Interrupt  
14
  
15
  TIMSK |= (1<<OCIE0);
16
}

ISR von int0:
1
ISR(INT0_vect)  //Taster interrupt 
2
{
3
  t_event = 1;
4
}

ISR vom Timer (compare):
1
ISR(TIMER0_COMP_vect)  //Interrupt every ms 
2
{
3
4
  ///////////////////////////////////////////////////////////////////
5
  // Entprellen durch 5ms warten
6
  if (t_event)
7
  {
8
    t_ms++;
9
    
10
    if (t_ms == 5)  //wait 5 ms
11
    {
12
      t_event = 0;
13
      t_this = (PINA & ( TUP | TMID | TDOW )); 
14
      t_press = 1;
15
    }
16
  }
17
}

und meine while(1):
1
if (t_press)
2
  {
3
    t_press = 0;
4
    uart_puts("\r\n");
5
    uart_putc(t_this);
6
        }

t_this, t_press und t_event is dabei global.

Die Timerzeiten, welche mit der Compare-ISR generiert werden habe ich 
mit nem Oszilloskope überprüft. Da kann also nix falsch sein.

Hoffe mir kann jemand einen Tipp geben.

Grüße Jan

von Pompete (Gast)


Lesenswert?

...da gibt es doch schon soooooo viele threads hier im Forum.....bitte 
sei so nett und lies wenigstens ein paar durch....

von Timmo H. (masterfx)


Lesenswert?


von Peter P. (ichbineinepfanne) Benutzerseite


Lesenswert?

Probiers mal länger
1000ms ... 100ms

Oder richtig per Hardware entprellen.

von Uwe (de0508)


Angehängte Dateien:

Lesenswert?

Hallo Jan,

alle "Reaktionen" zum Thema "Taster entprellen" wurden schon so oft 
gegen.

Als Beispiel lies mal hier:

Beitrag "Entprellen von Schalter mit Interrupt und PinChange"

Als Basisartikel ist dies sehr gut:

http://www.mikrocontroller.net/articles/Entprellung

sonst verwende ich die PeDa Tastenentprellung in C und LunaAVR,
gestern habe ich noch die IIR Filter Methode programmiert mit einer 
Abtastzeit von 1ms - 5ms.

Quelle :
[1] http://www.mikrocontroller.net/articles/Entprellung
"Komfortroutine von Peter_Dannegger"

[2] JULY 7, 2005, EDN
"Contact-debouncing algorithm emulates Schmitt trigger"

[3] Selbstsättigender Filter (nach Jürgen Schuhmacher)

von Fabian O. (xfr)


Lesenswert?

In dem geposteten Code wird t_ms nie zurückgesetzt.

von Peter D. (peda)


Lesenswert?

Jan S. schrieb:
> Die Taster sind alle über jeweils eine Diode verbunden (Kathode am
> Int0-Eingang).

Dann brauchst Du aber noch nen Pulldown, sonst hängt der INT0 in der 
Luft bei gesperrten Dioden.

Wunderst es Dich denn garnicht, warum erfahrene Programmierer ihre 
Tasten ohne solche Trickschaltungen einlesen?

Bei Standardaufgaben kann man ruhig mal schauen, wie andere das lösen. 
Man muß das Fahrrad nicht zum millionsten mal neu erfinden.


Peter

von Davis (Gast)


Lesenswert?

Timmo H. schrieb:

> Nimm einfach die Komfortroutine von Peter Dannegger:

Es sollte schon was professionelles wie hier sein: 
http://www.mikrocontroller.net/attachment/164088/13370-70705di.pdf

von m.n. (Gast)


Lesenswert?

Davis schrieb:
> Es sollte schon was professionelles wie hier sein:

Was ist denn daran professionell?
Interessant in dem .pdf-Anhang finde ich die Kurvendarstellung vom 
Prellen eines Tasters. Das sieht alles aus, wie kräftig aus den Fingern 
gesaugt.
Erst kürzlich hatte ich eigene Messungen dazu gemacht und komme auf 
einen gänzlich anderen (schnelleren) Signalverlauf. 
Beitrag "Re: Entprellen von Schalter mit Interrupt und PinChange"

von Timmo H. (masterfx)


Lesenswert?

Davis schrieb:
> Timmo H. schrieb:
>
>> Nimm einfach die Komfortroutine von Peter Dannegger:
>
> Es sollte schon was professionelles wie hier sein:
> http://www.mikrocontroller.net/attachment/164088/13370-70705di.pdf
Was ist an Peters Lösung denn so "unprofessionell"? Diese Entprellung 
funktioniert bei mir seit Jahren anstandslos mit allen möglichen 
Tastern. Das ist eine absolut solide Lösung. Du kannst dir ja auch 
nochmal den Thread wo das ganze entstanden ist durchlesen: 
Beitrag "Tasten entprellen - Bulletproof"

Aber wenn du so gut zwischen professionell und unprofessionell 
unterscheiden kannst, dann mach dir doch lieber deine professionelle 
Lösung selbst.

von Entpreller (Gast)


Lesenswert?

nur weil bei PeDa das Formelpaket fehlt, ist es eben unprofesionell?

von Paul Baumann (Gast)


Lesenswert?

Die Kritiker könnten eventuell auch erstmal den Quelltext ansehen:
http://www.edn.com/design/analog/4324067/Contact-debouncing-algorithm-emulates-Schmitt-trigger

Im Text ist ein Link auf das Assembler-Listing.

MfG Paul

von Uwe (de0508)


Lesenswert?

Mann o man,

das habe ich doch schon alles verklinkt

Beitrag "Re: Taster entprellen und erkennen funktioniert schlecht"

Der Fragesteller sollte sich doch erst mal zum Thema wider melden, bevor 
wieder alles aus dem Ruder läuft.

Die Hilfen / Quellen sind doch vollständig !

von Paul B. (paul_baumann)


Lesenswert?

Uwe schrob:
>Mann o man,

>das habe ich doch schon alles verklinkt

Ach?!
Hast Du mal auf Deine Verlinkung geklickt?

Ich habe da nur die Meldung: "Laden...." und dann nichts mehr.
Daraufhin habe ich den Link auf der EDN-Seite von Hand gesucht.
Der funktioniert.

MfG Paul

von Uwe (de0508)


Lesenswert?

Hallo Paul,

bei mir geht's, aber danke. Mein Eintrag war auch nicht direkt an Dich 
gerichtet.

cu8

von Timmo H. (masterfx)


Lesenswert?

Entpreller schrieb:
> nur weil bei PeDa das Formelpaket fehlt, ist es eben unprofesionell?
Auch die Theorie dazu hatte Peter im Thread auch verlinkt, nur leider 
geht der Link nicht mehr.
Habs aber noch gefunden, Achtung extremst lahmer Server: 
http://pdf.aminer.org/000/563/974/an_engineering_approach_to_determining_sampling_rates_for_switches_and.pdf

von Peter D. (peda)


Lesenswert?

Paul Baumann schrieb:
> Im Text ist ein Link auf das Assembler-Listing.

Danke für den Link.

Ein universell verwendbares Modul in C ist also unprofessionell.

Ein dahingeschludertes Testprogramm in Assembler, welches nichtmal im 
Interrupt die geänderten Register sichert, ist dagegen "professionell".

Wie sagt man so schön:  YMMD


Peter

P.S.:
Meine 4-fach Abtastung ist übrigens ein Integrator (gleitender 
Mittelwert) mit nachgeschaltetem Schmitt-Trigger mit festen Schwellen.

Sie versagt erst, wenn das Signal dermaßen gestört ist, daß keine 4 
gleichen Samples mehr auftreten. Aber dann hat man ein generelles 
EMV-Problem und der MC wird auch andere Tasks nicht mehr zuverlässig 
ausführen.

von MaWin (Gast)


Lesenswert?

"Um eine Software-entprellung zu realisieren, setze ich einfach im int0
interrupt (nur steigende Flake) ein Bit."

Man sollte sich halt mal klar machen, daß eine Flankentriggerung früher 
oder später immer zu Problemem führt, und daher vermieden werden sollte.

Man fragt in Zeitintervallen ab.

von Jan S. (spongebob)


Lesenswert?

Sorry Leute, das ich mich erst jetzt wieder melde, war krank. Ich wollte 
hier eigentlich nicht den großen Streit entfachen.
Ich habs jetzt übrigens hinbekommen.

Fabian O. schrieb:
> In dem geposteten Code wird t_ms nie zurückgesetzt.

das oben zitierte ist das einzige was ich brauchte. Jetzt läufts ohne 
Probleme.
Trotzdem, vielen Dank für eure Bemühungen. Die Komfortlösung und andere 
genannte Quellen werde ich mir trotzdem mal ansehen. Schaden kanns 
sicher nicht.

Grüße Jan

von Piefke (Gast)


Lesenswert?

Ich nehme immer dieses IC 
http://www.onsemi.com/pub/Collateral/MC14490-D.PDF

da braucht man keine Software. Kann 6 Taster und auch Lauflicht. funkt 
supi!

von Timmo H. (masterfx)


Lesenswert?

Anstatt ~3€ auszugeben und Platz zu verschwenden, schreibe ich lieber 
ein paar Zeilen code mehr :D. Und dann noch 100µA quiescent current ist 
für knopfzellenbetriebene Schaltungen auch nicht so dolle. Hängt 
natürlich vom Anwendungsfall ab.

von Piefke (Gast)


Lesenswert?

Timmo H. schrieb:
> Und dann noch 100µA quiescent current ist
> für knopfzellenbetriebene Schaltungen auch nicht so dolle. Hängt
> natürlich vom Anwendungsfall ab.

Mein Akku hat 12V und viel AHs. Der Strom stört nicht und die Spannung 
passt 1:1 ;-)

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.