mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Taster entprellen


Autor: Sascha H. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Anton (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

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

Autor: Peter Dannegger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Sascha H. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Anton,

wie hast du das genau in C realisiert?

Autor: Dirk (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Sascha H. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Sascha H. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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;
    }
  }
}

Autor: Sascha H. (Gast)
Datum:

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

Autor: Sascha H. (Gast)
Datum:

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

Kann mir da jemand weiterhelfen?

Autor: Dirk (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Läubi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 }

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht 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.

...

Autor: Sascha H. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Läubi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Winfried (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Sascha H. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kann mir jemand einen C-Code von diesem Forum empfehlen?

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja...

Siehe Codesammlung (bulletproof)...

...

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.