Habe hier einen ausgeschlachteten Drehencoder, welchen ich gerade für
Tests am µC nutze. Bin gerade dabei eine Routine für das Teil zu
schreiben. Es handelt sich dabei um einen Alps EC16(B).
Meine Routine funktioniert soweit, leider ist mir aufgefallen, dass der
Drehencoder scheinbar defekt ist.
Linksdrehen ist okay, aber beim rechtsdrehen werden beide Ausgänge
gleichzeitig durchgeschaltet. Muss mir da wohl mal nen neuen besorgen.
generell hätte ich noch gerne eure meinung zum Code. Bin µC-Anfänger
aber das Ganze ist doch sehr interessant :)
1 | .include "m8def.inc"
|
2 |
|
3 | .def temp1 = r16
|
4 | .def temp2 = r17
|
5 | .def status = r18
|
6 |
|
7 |
|
8 | init:
|
9 | clr temp1
|
10 | out DDRD, temp1
|
11 |
|
12 | ser temp1
|
13 | out PORTD, temp1
|
14 | out DDRB, temp1
|
15 | mov status, temp1
|
16 | out portb, status
|
17 |
|
18 | clr temp1
|
19 | mov temp2, temp1
|
20 |
|
21 |
|
22 | warte_auf_null:
|
23 | in temp1, pind
|
24 | com temp1
|
25 | cpi temp1, 0b00000000
|
26 | brne warte_auf_null
|
27 | out portb, status
|
28 |
|
29 | loop:
|
30 | in temp2, pind
|
31 | com temp2
|
32 | cp temp1, temp2
|
33 | breq loop
|
34 | lsl temp1
|
35 | lsl temp1
|
36 | or temp1, temp2
|
37 |
|
38 | start_vergleich:
|
39 | cpi temp1, 0b00000001
|
40 | brne zweig_0
|
41 | inc status
|
42 | rjmp warte_auf_null
|
43 |
|
44 | zweig_0:
|
45 | cpi temp1, 0b00000010
|
46 | brne kein_Treffer
|
47 | dec status
|
48 | rjmp warte_auf_null
|
Zum Verständnis:
Das ganze ist auf einem STK500 aufgebaut, deswegen die ganzen
negierungen der Register.