Taste Entprellen ASM

OP Persönliche Seite #1554717
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
Angehängte Dateien:
OP Persönliche Seite #1660097
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren