Drehgeber-Auswertung in Assembler für 8051

Gast #450144
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
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
Gast #453930
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
Gast #569734
Hallo,

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

Gruss

Robert

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 19 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.