Forum: Mikrocontroller und Digitale Elektronik [newbie] taster auslesen


von Karl W. (karlweber)


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

von Karl heinz B. (kbucheg)


Lesenswert?


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.