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
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.
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
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.
Der vollständigkeit halber hier noch eine Schaltung zur Hardwareentprellung, am Beispiel eines Digitalpotis.
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.
"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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.