Taster entprellen

Gast #231815
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?
Gast #231817
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
Gast #231819
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.
Gast #231821
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;
    }
  }
}
Gast #231824
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.
Gast #231825
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 }
#231826
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.

...
Gast #231827
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.
Gast #231828
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
Gast #231829
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.
Gast #231830
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.

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