Forum: Mikrocontroller und Digitale Elektronik Drehencoder defekt?


von Erik D. (dareal)


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.

von Erik D. (dareal)


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

von Erik D. (dareal)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.