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
|