Hallo, auf die Gefahr hin, das ich jetzt hier in der Luft zerrissen werde (*Spass) will ich trotzdem meine kleine Entprellroutine posten. Die Routine ist nur für einen Taster sinnvoll da dann nur ein Register benötigt wird und 1 Bit in einem Flagregister. Wenn eh ein Timerinterrupt läuft werden in der ISR nur 7 Befehle benötigt. Ab 2 Tasten lohnt also schon die Routine von Peter Dannecker. Jedoch glaube ich das meine Routine leichter zu nachzuvollziehen, ist obwohl sie ähnlich funktioniert wie die Bulletproof. Grüsse Jürgen
Da haben wir die gleiche Idee gehabt. Ich habe das mal in Bascom gemacht, da ging es auch prima. MfG Paul
Hallo, ich habe noch ein bisschen optimiert. Ohne den Vergleichsbefehl "cpi taste,0b10000000" reicht nun auch ein unteres (r0..r15) Register für <taste>. Grüsse Jürgen
Ich habe meine kleine Entprellroutine noch etwas optimiert und für 2 Tasten erweitert. Da jede weitere Taste auch ein weiteres (unteres) Register + 5 ASM-Befehle benötigt, würde ich spätestens ab der 3-4. Taste überlegen ob ich die von Peter Danneger benutzen würde. Hier nur der relevante Teil in der ISR:
1 | ;------------------------------------------------------------------------------------------------------------ |
2 | ;2 Taster (Plus und Minus, PinA 0..1) entprellen |
3 | ;Alle 2 mS wird (in diesem Fall) der entspr. Taster in das Register <taste> geschoben. |
4 | ;Ist <taste> = 0, war der Taster die letzten 8 Interrupts gedrückt(im Main einfach tst taste). |
5 | ;Ist das Carry zusätzlich gesetzt, wird in einem Flagregister das entspr. Flankenbit gesetzt, das |
6 | ;im Hauptprogramm nach Verarbeitung des Tastendruck wieder gelöscht wird. |
7 | ;So ist sichergestellt, das jeder Tastendruck nur einmal verarbeitet wird |
8 | ;------------------------------------------------------------------------------------------------------------ |
9 | in temp,pina ;Tasten nach Temp holen |
10 | lsr temp ;PinA0 (Minus-Taste) ins Carry |
11 | rol taste ;und in Taste (R2) schieben |
12 | brcc ex1 ;Es muss eine 1 (nicht gedrückt) und danach |
13 | brne ex1 ;8 mal eine 0 (gedrückt) folgen, erst dann ist der Tastendruck gültig. |
14 | sbr flags,1<<0 ;Flag (Taste gedrückt, Negative Flanke, Carry+Taste = 100000000) in Bit0 setzen.. |
15 | ;.. wird in der Main, nach Auswertung wieder gelöscht. |
16 | ex1:lsr temp ;PinA1 (Plus-Taste) ins Carry ..... |
17 | rol taste2 ;wie oben |
18 | brcc ex2 |
19 | brne ex2 |
20 | sbr flags,1<<7 ;Bit7 setzen |
21 | |
22 | ;------------------------------------------------------------------------------------------------------------ |
23 | ;ISR Ende |
24 | |
25 | ex2:dec cnt ;Zähler für wait |
26 | pop temp |
27 | out sreg,S ;Statusbits zurücklesen |
28 | reti ;in der Main weitermachen |
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.