mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik [newbie] taster auslesen


Autor: Karl We (karlweber)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe mir mal folgende Funktion überlegt, um festzustellen, ob ein
Taster gedrückt wurde. Wie immer freue ich mich über Kommentare,
Änderungsvorschläge und eure Meinungen. Gibt es Möglichkeiten, das ganze
kompakter zu gestalten?

Ach ja, ich stellte fest, dass die Methode bei einfachem Berühren von
einem Masse-Draht und pin1.0 öfters hinundher ruckelte das Problem war
aber nicht mehr so groß, nachdem ich einen guten Taster ( 6 Euro beim
Elektronikladen) verwendete, der wohl das Prellen mit einem
Kondensator(?) abfängt...
Ausserdem wird es besser, wenn man in der Hauptschleife noch andere
Tätigkeiten vollbringt, so kann sich der Pegel am Eingabepin
"beruhigen".

Insgesamt geht es mit dem folgenden Code mit 8 Tastern an p1.0 --- p1.7
Es gibt interne Pull-ups, an port1, so genügt es, wenn man bei Druck den
Taster gegen Masse schließen lässt.

Ich benutze die logische inhibition ( !x and y)

Hier mal die Wertetabelle:
xy|!x|!x and y
--|--|-----------
00| 1| 0
01| 1| 1   <- Flanke von nicht gedrückt auf gedrückt
10| 0| 0
11| 0| 0
--|--|------------

Hier der Code für 8051 kompatible µC:
*********************************************************************
*********************************************************************

;Variablen im bitadressierbaren Speicherbereich:
p1old  DATA  020h ; alte Belegung des Eingangs p1
edg1n  DATA  021h ; sind Flanken vorhanden?

...
org 00h
       jmp start

;--------funktion readport------------------------------------------
;entdeckt Flanken an Port 1
;ich verwende die logische Inhibition (!(input_new) and input_old) um
;Flanken zu detektieren
;parameter p1old: input an port1 nach dem letzten Aufruf dieser Funktion
;Rückgabe edg1n: bit i markiert eine Flanke an Pin p1.i

readport:
  mov   B, p1      ; input von port1 (temporär nach B)
  mov   A, B      ;
  CPL  A    ; invertiere input
  mov  edg1n,  p1old  ;
  ANL  edg1n,  A  ; inhibition fertig -
                                        ;speichere Flanke in edg1n
  mov  p1old, B    ; speichere input als p1old
  ret
...
;----------------------------------------------------------------------
start:
        mov   SP,    #30h    ;Stackpointer nach hinten versetzen
  mov  p1,     #0FFh   ;bereite Port eins für Input vor
  mov  p1old,  #0FFh   ;initialisiere die Merkfunktion für den Port1
  mov  edg1n,   #000h   ; keine negative Flanke liegt an

loop:

        acall readport         ; lese Port1 aus
pin0:  jb   edg1n.0,pin0ex  ; jump if bit set (-> springe bei Flanke)
  ajmp  pin1            ; bei keiner Flanke gehe zu pin1
pin0ex: acall   <funktion bei Taster 0>

pin1:   jb  edg1n.1, pin1ex
  ajmp  pin2
pin1ex: acall <funktion bei Taster 1>

pin2:   jb  edg1n.2, pin1ex
  ajmp  pin3
pin2ex: acall <funktion bei Taster 1>

pin3:  nop     ;weitere buttons analog

  ajmp   loop

Gruß und danke Karl

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

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.