Drehencoder defekt?

#811906
Lesenswert?

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.
#811913
Lesenswert?

Wollte gerade von meiner ELV-Platine (digitales Potentiometer) den 
Encoder auslöten, als mir auffiel, dass der Common-Anschluss, der ja aus 
Masse liegt dort an PIN3 war. Ein im Internet gefundenes Dokument 
bestätigt meine Vermutung ...

Der Alps EC16 hat nicht A-C-B sonder A-B-C. Nun geht meine Schaltung 
grins
#811944
Lesenswert?

Hier nochmal der komplette funktionieren Source mit kleiner 
Warteschleife ...
1
.include "m8def.inc"
2

3
.def temp1 = r16
4
.def temp2 = r17
5
.def temp3 = r18
6
.def status = r19
7

8

9
init:
10
  clr temp1
11
  out DDRD, temp1
12

13
  ser temp1
14
  out PORTD, temp1
15
  out DDRB, temp1
16
  mov status, temp1
17
  out portb, status
18

19
  clr temp1
20
  mov temp2, temp1
21

22

23
warte_auf_null:
24

25
  in temp1, pind
26
  com temp1
27
  cpi temp1, 0b00000000
28
  brne warte_auf_null
29
  out portb, status
30

31
loop:
32
  clr temp3
33
warten:
34
  inc temp3
35
  cpi temp3, 0xff
36
  brne warten  
37
  in temp2, pind
38
  com temp2
39
  cp temp1, temp2
40
  breq loop
41
  lsl temp1
42
  lsl temp1
43
  or  temp1, temp2
44

45
start_vergleich:
46
    cpi     temp1, 0b00000001
47
    brne    zweig_0
48
    inc    status
49
    rjmp    warte_auf_null
50

51
zweig_0:
52
    cpi     temp1, 0b00000010
53
    brne    warte_auf_null
54
    dec    status
55
    rjmp    warte_auf_null

Für Verbesserungsvorschläge wäre ich sehr dankbar.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren