mikrocontroller.net

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


Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.
Drehgeber:

  mov a, Portspeicher   ;alten Wert vom Ram in den Akku laden
  rrc a           ;acc.0 und acc.1 vertauschen fuer kreuzweises EXOR
  mov acc.1, c
  mov Portspeicher, P1  ;neuen Zustand am P1 in den RAM laden
  xrl a, Portspeicher         ;XOR mit dem Akku 
  
  CW?:      ;Test ob Uhrzeigersinn(CW)
  mov c, acc.0
  anl c, /acc.1    ;Fuer CW muss das Ergebnis des einen EXORs 1 und das vom anderen 0 sein  
  jnc CCW?      
  ;Code fuer CW     
         
sjmp Ret
    
  CCW?:      ;Test ob Gegenuhrzeigersinn(CCW)
  mov c, acc.1
  anl c, /acc.0    ;analog zu CW
  jnc Ret
  ;Code fuer CCW
Ret:
ret

Autor: Thomas (Gast)
Datum:

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

Drehgeber:

  mov a, Portspeicher   ;alten Wert vom Ram in den Akku laden
  rrc a                 ;acc.0 und acc.1 vertauschen fuer kreuzweises EXOR
  mov acc.1, c
  mov Portspeicher, P1  ;neuen Zustand am P1 in den RAM laden
  xrl a, Portspeicher   ;XOR mit dem Akku 
  
  CW?:                  ;Test ob Uhrzeigersinn(CW)
  mov c, acc.0
  anl c, /acc.1         ;Fuer CW muss das Ergebnis des einen EXORs 1 und 
                        ;das vom anderen 0 sein  
  jnc CCW?      
  ;Code fuer CW     
         
sjmp Ret
    
  CCW?:                 ;Test ob Gegenuhrzeigersinn(CCW)
  mov c, acc.1
  anl c, /acc.0         ;analog zu CW
  jnc Ret
  ;Code fuer CCW
Ret:
ret

Autor: Heimo (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: rfr (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

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.