Forum: Projekte & Code Taste Entprellen ASM


von Jürgen W. (juergen_w) Benutzerseite


Angehängte Dateien:

Lesenswert?

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

von Paul B. (paul_baumann)


Lesenswert?

Da haben wir die gleiche Idee gehabt. Ich habe das mal in Bascom 
gemacht,
da ging es auch prima.

MfG Paul

von Jürgen W. (juergen_w) Benutzerseite


Angehängte Dateien:

Lesenswert?

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

von Jürgen W. (juergen_w) Benutzerseite


Lesenswert?

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
Noch kein Account? Hier anmelden.