www.mikrocontroller.net

Forum: Codesammlung Entprellung von Tastern

Autor: Michael (Gast)
Datum: 29.12.2002 16:24
Dateianhang: avr_tast.c (4,8 KB, 876 Downloads) | formatierter Code

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: 29.12.2002 16:25
Dateianhang: avr_tast.hex (2,5 KB, 162 Downloads)

Für die Hexen/Hexer, die nicht warten können, die passende Datei.
Autor: Michel (Gast)
Datum: 05.01.2003 03:12

DANKE!
Autor: Flo333 (Gast)
Datum: 15.01.2003 06:18

Sorry, aber gibts das Programm auch in ASM?
Autor: Michael (Gast)
Datum: 15.01.2003 11:59
Dateianhang: avr_tast.s90 (13 KB, 159 Downloads)

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 (Gast)
Datum: 25.02.2003 13:50
Dateianhang: C_tast.c51 (2,1 KB, 331 Downloads) | formatierter Code

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: 25.02.2003 17:27
Dateianhang: taster.a51 (4,4 KB, 147 Downloads)

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: 06.03.2003 08:12
Dateianhang: debounce.gif (13 KB, 438 Downloads)
preview image for debounce.gif

Der vollständigkeit halber hier noch eine Schaltung zur
Hardwareentprellung, am Beispiel eines Digitalpotis.
Autor: gigaak (Gast)
Datum: 06.03.2004 16:58
Dateianhang: debounce.JPG (9,7 KB, 503 Downloads)
preview image for debounce.JPG

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 (Gast)
Datum: 06.03.2004 17:19

"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: 06.03.2004 21:02

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: 21.07.2005 20:06

Vielen Dank!! Das hat mir sehr weiter geholfen.

Antwort schreiben

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

Wichtige Regeln - erst lesen, dann posten!

  • Suchfunktion und Betreffsuche benutzen - vielleicht gibt es schon einen ähnlichen Beitrag
  • Aussagekräftigen Betreff wählen
  • Im Betreff angeben um welchen Controllertyp es geht (AVR, PIC, ...)
  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang
  • JPEG-Dateien (.jpg) nur für Fotos verwenden, Schaltpläne, Screenshots usw. als PNG oder GIF anhängen

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [pre]vorformatierter Text (z.B. Code in anderen Sprachen)[/pre]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel





Hinweis: der Originalbeitrag ist mehr als 6 Monate alt.

webmaster@mikrocontroller.netImpressumWerbung auf Mikrocontroller.net