mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Drehencoder defekt?


Autor: Erik D. (dareal)
Datum:

Bewertung
0 lesenswert
nicht 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 :)
.include "m8def.inc"

.def temp1 = r16
.def temp2 = r17
.def status = r18


init:
  clr temp1
  out DDRD, temp1

  ser temp1
  out PORTD, temp1
  out DDRB, temp1
  mov status, temp1
  out portb, status

  clr temp1
  mov temp2, temp1


warte_auf_null:
  in temp1, pind
  com temp1
  cpi temp1, 0b00000000
  brne warte_auf_null
  out portb, status

loop:
  in temp2, pind
  com temp2
  cp temp1, temp2
  breq loop
  lsl temp1
  lsl temp1
  or  temp1, temp2

start_vergleich:
    cpi     temp1, 0b00000001
    brne    zweig_0
    inc    status
    rjmp    warte_auf_null

zweig_0:
    cpi     temp1, 0b00000010
    brne    kein_Treffer
    dec    status
    rjmp    warte_auf_null


Zum Verständnis:
Das ganze ist auf einem STK500 aufgebaut, deswegen die ganzen 
negierungen der Register.

Autor: Erik D. (dareal)
Datum:

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

Autor: Erik D. (dareal)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hier nochmal der komplette funktionieren Source mit kleiner 
Warteschleife ...
.include "m8def.inc"

.def temp1 = r16
.def temp2 = r17
.def temp3 = r18
.def status = r19


init:
  clr temp1
  out DDRD, temp1

  ser temp1
  out PORTD, temp1
  out DDRB, temp1
  mov status, temp1
  out portb, status

  clr temp1
  mov temp2, temp1


warte_auf_null:

  in temp1, pind
  com temp1
  cpi temp1, 0b00000000
  brne warte_auf_null
  out portb, status

loop:
  clr temp3
warten:
  inc temp3
  cpi temp3, 0xff
  brne warten  
  in temp2, pind
  com temp2
  cp temp1, temp2
  breq loop
  lsl temp1
  lsl temp1
  or  temp1, temp2

start_vergleich:
    cpi     temp1, 0b00000001
    brne    zweig_0
    inc    status
    rjmp    warte_auf_null

zweig_0:
    cpi     temp1, 0b00000010
    brne    warte_auf_null
    dec    status
    rjmp    warte_auf_null

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

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.