Taster entprellen und erkennen funktioniert schlecht

OP #2970603
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
#2970687
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)
Angehängte Dateien:
#2970871
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
Gast #2970900
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"
#2970919
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.
#2972342
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.
Gast #2972355
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.
OP #2973016
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren