www.mikrocontroller.net

Forum: Projekte & Code Taste Entprellen ASM


Autor: Jürgen W. (juergen_w) Benutzerseite
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Paul Baumann (paul_baumann)
Datum:

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

MfG Paul

Autor: Jürgen W. (juergen_w) Benutzerseite
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Jürgen W. (juergen_w) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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:
;------------------------------------------------------------------------------------------------------------
;2 Taster (Plus und Minus, PinA 0..1) entprellen
;Alle 2 mS wird (in diesem Fall) der entspr. Taster  in das Register <taste> geschoben.
;Ist <taste> = 0, war der Taster die letzten 8 Interrupts gedrückt(im Main einfach tst taste).
;Ist das Carry zusätzlich gesetzt, wird in einem Flagregister das entspr. Flankenbit gesetzt, das
;im Hauptprogramm nach Verarbeitung des Tastendruck wieder gelöscht wird.
;So ist sichergestellt, das jeder Tastendruck nur einmal verarbeitet wird
;------------------------------------------------------------------------------------------------------------
  in    temp,pina    ;Tasten nach Temp holen
  lsr    temp      ;PinA0 (Minus-Taste) ins Carry
  rol    taste      ;und in Taste (R2) schieben
  brcc  ex1        ;Es muss eine 1 (nicht gedrückt) und danach
  brne  ex1        ;8 mal eine 0 (gedrückt) folgen, erst dann ist der Tastendruck gültig.          
  sbr    flags,1<<0    ;Flag (Taste gedrückt, Negative Flanke, Carry+Taste = 100000000) in Bit0 setzen..
              ;.. wird in der Main, nach Auswertung wieder gelöscht.
ex1:lsr    temp      ;PinA1 (Plus-Taste) ins Carry .....
  rol    taste2      ;wie oben
  brcc  ex2  
  brne  ex2    
  sbr    flags,1<<7    ;Bit7 setzen

;------------------------------------------------------------------------------------------------------------
;ISR Ende

ex2:dec    cnt        ;Zähler für wait        
  pop    temp
  out    sreg,S      ;Statusbits zurücklesen
  reti          ;in der Main weitermachen


Antwort schreiben

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

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.