www.mikrocontroller.net

Forum: Projekte & Code Entprellung von Tastern


Autor: Michael (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Das Programm avr_tast.c zeigt, wie einzelne Taster/Schalter entprellt 
und dekodiert werden können. Beispielhaft wird hier ein AT90S8515 
verwendet. Die Taster werden an PortA gegen 0V geschaltet. Zur Kontrolle 
werden LEDs an PortC ein/ausgeschaltet, ebenfalls aktiv-low. Die 
Entprellzeit der Taster sowie wiederholte Dekodierung (repeat-Funktion) 
können weitgehend verändert werden. Viel Spaß !

Michael

Autor: Michael (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Für die Hexen/Hexer, die nicht warten können, die passende Datei.

Autor: Michel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
DANKE!

Autor: Flo333 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry, aber gibts das Programm auch in ASM?

Autor: Michael (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Nun gut, anbei die vom Compiler erzeugte .s90-Quelle. Abweichend zur 
.c-Quelle sind die static-Variablen global deklariert und nicht explizit 
initialisiert; das ist etwas übersichtlicher. Die C-Anweisungen sind als 
Kommentar eingefügt.
Bei timer0_int werden die Register über -Y bzw. Y+ auf einem separaten 
Stack abgewickelt. Hier kann alternativ push/pop verwendet werden.

Autor: Peter Dannegger (peda)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Anbei nun eine ähnliche Lösung für den 8051.

Der Hauptunterschied ist, daß die Tasten parallel und voneinander 
unabhängig ausgewertet werden. Somit ist z.B. die Realisierung einer 
Shift-Taste möglich.
Werden nun 2 Tasten mit Repeat-Funktion gedrückt, dann werden auch beide 
wiederholt.

Ein Unterschied ist noch, daß die Größe nur 13% beträgt (123 statt 914 
Byte).


Es hat mich doch einige Mühe gekostet, durch Dein Programm 
durchzusteigen.
Ich finde es einfacher zu überblicken, wenn Routinen möglichst linear 
sind, d.h. nur einmal am Ende verlassen werden. In Deiner Routine sind 
aber doch etliche "return;" zwischendrin versteckt.


Peter

Autor: Michael (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Für Leute, die noch eine schöne .A51-Routine brauchen, die entsprechende 
Quelle 'taster.a51'.

Per T0-Interrupt wird die Routine GET_TASTER aufgerufen. Hier werden 16 
Taster (beispielhaft an Port1+Port2) mit TAST_IN eingelesen, entprellt 
und ggf. mit Routine DECODE ausgewertet; dies zeigt, daß Entprellung und 
Dekodierung verschiedene Schritte sind. Für Matrixtastaturen muß TAST_IN 
angepaßt werden - für eine andere Dekodierung DECODE.
Die hier verwendete Dekodierung bietet 'n-key rollover', wie man es von 
alphanum. Tastaturen erwartet. Werden statische Taster benötigt, dürfte 
es nicht schwerfallen, diese entsprechend auszumaskieren.

Die vorliegende Routine ist eine abgemagerte Version einer älteren 
Anwendung; ggf. sind Anpassungen/Änderungen erforderlich.

Autor: Marko (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Der vollständigkeit halber hier noch eine Schaltung zur 
Hardwareentprellung, am Beispiel eines Digitalpotis.

Autor: gigaak (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe mir mal vor einiger Zeit Gedanken über entprellen von Tastern
gemacht. Diese Schaltung funktioniert auf jeden Fall, mit jedem
Schalter, auch mit den ganz schlimmen. man müsste gegebenenfalls die
Werte von Widerstand und Kondensator ändern.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
"Diese Schaltung funktioniert auf jeden Fall"

Nein, 10k * 100n sind ja nur 1ms, das kann zu wenig sein.


Aber wie schon gesagt, warum Hardware nehmen, die mich jedesmal was
kostet, anstatt ein paar Codezeilen, die mich nichts kosten.


Peter

Autor: gigaak (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wie gesagt, man müsste die Werte abändern, wenn man schlechte Schalter
hat, aber mit normalen Tastern funktionierts.
1ms reicht übrigens auch für relativ schlechte Schalter, denn 1ms ist
nicht die Zeit vom 1. bis zum letzten Prellimpuls (was durchaus mehrere
hundert sein können). Dann würde es auf keinen Fall funktionieren. Da
ich aber ein Schmitt Trigger genommen habe reicht es, denn man muss
hier nur die Zeit zwischen 2 Impulsen abdecken.

Es gibt auch andere Lösungen mit FlipFlops usw., die Haben dann eine
Zeitkonstante im Bereich von ca. 100ms, doch das war mir zu langsam.
Leute mit ultranervösen Fingern könnten diesen Grenze erreichen, was
nicht so got währe.

Diese Schaltung war übrigens auch nict dafür gedacht mit nem MC
zusammenzuarbeiten, sondern mit PLD's und Logik IC's. Und da wirds
mit dem Softwareseitigen entprellen etwas komplex.

Autor: Christian Buntrock (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank!! Das hat mir sehr weiter geholfen.

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.