Drehgeber-Auswertung in Assembler für 8051

Gast #450144
Lesenswert?

Hier möchte ich meine Version der Drehgeber-Auswertung vorstellen. 
Kritik ist ausdrücklich erwünscht!

Die Idee:

Der Drehgeber liefert je nach Drehrichtung die bekannte Abfolgen:

A B
---
0 0
0 1
1 1
1 0

oder

A B
---
0 0
1 0
1 1
0 1

Um die Abfolgen zu unterscheiden, kann man jeweils eine "alte" mit einer 
"neuen" Zeile über Kreuz mit EXOR verwerten. Also immer das alte A mit 
dem neuen B und das alte B mit dem neuen A. Im Programm wird dazu der 
alte Zustand zunächst in den Akku geladen und dann wird das Akkubit0 mit 
dem Akkubit1 vertauscht. Dann kann man den byteweisen Hardware-EXOR 
anwenden.
Von diesen EXOR-Ergebnissen ist (bei korrekter Funktion) immer eines 1 
und das andere 0.
Jetzt werden die beiden EXOR-Ergebnisse miteinander verUNDet (EXOR1 UND 
NICHT EXOR2 für die Erkennung der einen Richtung sowie EXOR2 UND NICHT 
EXOR1 für die andere).
Am gesetzten Carry kann man ablesen, ob die jeweils abgefragte Richtung 
vorliegt.

Zwar kann man die EXOR auch bitweise in Software nachbilden, aber die 
byteweise Ausführung in Hardware dürfte doch schneller sein.

Es steht hier nur das Skelett, das je nach erkannter Drehrichtung in 
Unterprogramme verzweigt. Wer zählen will, muss entsprechende 
Zählvariablen einführen und (da die meisten Drehgeber alle 4 Schritte 
einrastem) den Wert auf beliebige Weise durch 4 teilen.
In diesem Beispiel ist der Drehgeber an P1.0 und P1.1 angeschlossen. Die 
Variable "Portspeicher" ist ein Byte im RAM.
1
Drehgeber:
2

3
  mov a, Portspeicher   ;alten Wert vom Ram in den Akku laden
4
  rrc a           ;acc.0 und acc.1 vertauschen fuer kreuzweises EXOR
5
  mov acc.1, c
6
  mov Portspeicher, P1  ;neuen Zustand am P1 in den RAM laden
7
  xrl a, Portspeicher         ;XOR mit dem Akku 
8
  
9
  CW?:      ;Test ob Uhrzeigersinn(CW)
10
  mov c, acc.0
11
  anl c, /acc.1    ;Fuer CW muss das Ergebnis des einen EXORs 1 und das vom anderen 0 sein  
12
  jnc CCW?      
13
  ;Code fuer CW     
14
         
15
sjmp Ret
16
    
17
  CCW?:      ;Test ob Gegenuhrzeigersinn(CCW)
18
  mov c, acc.1
19
  anl c, /acc.0    ;analog zu CW
20
  jnc Ret
21
  ;Code fuer CCW
22
Ret:
23
ret
Gast #450148
Lesenswert?

Die Formatierung ist leider ziemlich durcheinandergeraten, in der 
Vorschau sah es noch gut aus...

1
Drehgeber:
2

3
  mov a, Portspeicher   ;alten Wert vom Ram in den Akku laden
4
  rrc a                 ;acc.0 und acc.1 vertauschen fuer kreuzweises EXOR
5
  mov acc.1, c
6
  mov Portspeicher, P1  ;neuen Zustand am P1 in den RAM laden
7
  xrl a, Portspeicher   ;XOR mit dem Akku 
8
  
9
  CW?:                  ;Test ob Uhrzeigersinn(CW)
10
  mov c, acc.0
11
  anl c, /acc.1         ;Fuer CW muss das Ergebnis des einen EXORs 1 und 
12
                        ;das vom anderen 0 sein  
13
  jnc CCW?      
14
  ;Code fuer CW     
15
         
16
sjmp Ret
17
    
18
  CCW?:                 ;Test ob Gegenuhrzeigersinn(CCW)
19
  mov c, acc.1
20
  anl c, /acc.0         ;analog zu CW
21
  jnc Ret
22
  ;Code fuer CCW
23
Ret:
24
ret

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