Forum: Projekte & Code Drehgeber-Auswertung in Assembler für 8051


von Thomas (Gast)


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

von Thomas (Gast)


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

von Heimo (Gast)


Lesenswert?

Die Idee es so zu machen ist nicht schlecht !


Die Auswertung könnte auch so aussehen

XOR MACRO A,B
Mov   C,A
Anl   C,/B
Mov   F0,C        ;F0 = freies Bit in PSW
Mov   C,B
Anl   C,/A
Orl   C,F0        ;Ergebnis in C
ENDM


XOR   A1,B2
Mov   F1,C        ;F1 freies Bit in PSW
XOR   B1,A2
Cpl   C
Anl   C,F0        ;Drehrichtung in C

Heimo

von rfr (Gast)


Lesenswert?

Hallo,

ich wüsste gerne, ob man dieses Programm auch verwenden kann, um eine 
Schrittmotor auszulesen, wenn dieser als Drehgeber verwendet wird.

Gruss

Robert

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.