Forum: Mikrocontroller und Digitale Elektronik Taster entprellen


von Sascha H. (Gast)


Lesenswert?

Ich habe an einem MEGA8535 einen Taster angeschlossen.
WIe kann ich den Taser durch eine Software entprellen?
In diesem Forum habe ich schon mal ein Beispiel von P. Dannegger
gesehen. Ich verstehe da nicht so viel was er da genau gemacht hat.
Kann man die Entprellung auch ohne Interrupt bewältigen?

von Anton (Gast)


Lesenswert?

Hallo!

Die einfachste Methode: nach der ersten Erkennung eines Tastendrucks
eine Pause von 100 ms (oder mehr) einfügen.

von Peter Dannegger (Gast)


Lesenswert?

"Kann man die Entprellung auch ohne Interrupt bewältigen?"


Im Prinzip ja, ist aber lange nicht so eine schön kleine, schnelle,
zuverlässige und universelle Lösung.

In der Regel machen diese auch nur eine Taste, d.h. für 8 Tasten
braucht man den 8-fachen Code und SRAM-Bedarf.


Es gibt da folgende Ansätze:

- die natürliche Laufzeit der Mainloop nutzen -> sehr unzuverlässig, da
total Programmabhängig

- eine Delayloop -> pure Rechenzeitvernichtung

- externer Flankeninterrupt -> sehr störempfindlich (ESD)


Peter

von Sascha H. (Gast)


Lesenswert?

Hallo Anton,

wie hast du das genau in C realisiert?

von Dirk (Gast)


Lesenswert?

Prinzip:
Wenn erkannt wurde, dass Taste gedrückt, dann einfach Pause von ca.
20ms. Anschließend noch einmal überprüfen ob Taste immer noch gedrückt
ist. Das Ganze am besten zwei- oder dreimal wiederholen. Anschließend
kannst du sicher sein, dass die Taste nicht mehr prellt.

Unter C würde ich das Timing mit Interrupt lösen (bleibt Zeit um noch
etwas Sinnvolles zu tun). Ansonsten einfach verschachtelte
Zählschleifen, bis die Zeit abgelaufen ist. Taste einlesen und eine
weiteren Zähler inkrementieren, bis 3 oder 4. Danach erst das
Tasten-Erreignis auslösen.

von Sascha H. (Gast)


Lesenswert?

Sowiet verstehe ich das jetzt.
Nur wie ich die Interrupt Routine mit Taster programmieren soll, das
weiss ich allerdings nicht. Ich tue mir da halt noch schwer!

von Sascha H. (Gast)


Lesenswert?

Ich habe mal mir dazu was überlegt wie es eventuell gehen könnte:

int start=0,x=0;

void taster1 (void);
{
 start = 1;
}

void interrupt overflow
{
 if (start == 1)
  {
   for(int i=0; i<10; i++)  // insgesamt 100ms
    {
    }
  }
}

main(void)
{

 while(1)
  {
   if (taster1() == 1)
    {
     PORTB = 0x55;
    }
  }
}

von Sascha H. (Gast)


Lesenswert?

Leider kann ich dies nicht testen, da ich zur Zeit nicht Zuhause bin.
Würde der Code so funktionieren?

von Sascha H. (Gast)


Lesenswert?

Ich habe meinen Code mal genauer angeschaut.
Ich denke so wird es nicht funktionieren!

Kann mir da jemand weiterhelfen?

von Dirk (Gast)


Lesenswert?

Das wird sicher nicht funktionieren.
Problem liegt schon mal in der main-Funktion
" .
  .
  .
  if (taster1() == 1)
    {
     PORTB = 0x55;
    }
  .
  .
  .
"
"void taster1 (void);"

Also, die Funktion "taster1" hat keinen Rückgabewert (void). Bei der
If-Abfrage "if (taster1() == 1)" wird die If-Bedingung nie wahr
werden. Denn die Funktion "taster1" gibt keine "1" zurück -
Rückgabewert ist void!

Für den Interrupt würde ich einen Timer benutzen und damit die
erforderliche Zeit erzeugen.

von Läubi (Gast)


Lesenswert?

Ich hab das so geregelt, da ich sowieso einen Timer am laufen habe (1ms)
sezt dieer timer einfach eine Varibale auf 1, das kann ich dan abfragen
[pseudocode!!]

loop:
if (timerisr == 1) then {
    if (PIN == 1) {
        taster = taster+1
    }
    if (taster < 100) { jmp loop }
    else {
        taster = 0
        call tastergedrücktroutine
    }
    irgenwasandereswasasonstnochgemachtwerdensoll
}
else { jmp loop }

von Hannes L. (hannes)


Lesenswert?

Jag doch mal Peter Danneggers Entprellroutine (Codesammlung) durch den
Simulator und versuche sie zu verstehen.

Einfacher geht es nicht. Es gibt keinerlei Warterei, dem Hauptprogramm
steht pro Taster ein Bit zur Verfügung, das anzeigt, ob der Taster
(entprellt!) betätigt ist oder nicht.

Und zusätzlich gibt ein weiteres Bit pro Taster, welches aussagt, dass
auf einen Tastendruck noch nicht reagiert wurde (Impulsfalle).

Bequemer geht es einfach nicht.
Ich nutze zwar die ASM-Version, aber die C-Version dürfte ebenso
effizient sein.

...

von Sascha H. (Gast)


Lesenswert?

Hi Läubi,

den Code verstehe ich nicht ganz:
Kannst du mir eventuell mal deinen kompletten C- Code geben?
Vielleicht verstehe ich es dann. Wenn ich mal den kompletten Code sehe,
dann verstehe ich auch die Zusammenhänge.

von Klaus (Gast)


Lesenswert?

Hallo Läubi!

Erklär mir doch bitte mal die folgeneden zwei Zeilen vorallem das mit
{ jmp loop }!

Sowas habe ich in C noch nie gesehen!


if (taster < 100) { jmp loop }
else { jmp loop }


Gruß Klaus

von Läubi (Gast)


Lesenswert?

ich wieß nicht ob C jumps unterstüzt, ich selber Programieren nur in
Assembler, wewirken tu diese beiden zeilen, das wenn > 100x
hintereinander ein Tastendruck registireiert wurde eine unteroutine
aufgerufen wird.
das lezte jmp loop ist einfach nur ne endlosschleife.

von Winfried (Gast)


Lesenswert?

Gibt es echt noch keinen Artikel irgendwo im Netz, der dieses
Standardproblem, was alle paar Tage hier diskutiert wird, mal
erschöpfend erklärt?

Diesen kennst du schon?

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

Wer noch was weiß, kann diesen ja vervollständigen. Ich glaube, es
scheitert immer daran, dass die, die es dann wissen, zu faul sind, es
für die Nachwelt zu konservieren.

von Sascha H. (Gast)


Lesenswert?

Kann mir jemand einen C-Code von diesem Forum empfehlen?

von Hannes L. (hannes)


Lesenswert?

Ja...

Siehe Codesammlung (bulletproof)...

...

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.