Forum: Mikrocontroller und Digitale Elektronik Drehencoder Auswerten


von Achim (Gast)


Angehängte Dateien:

Lesenswert?

ich versuche einen Drehencoder STEC12E08 von Reichelt auszulesen nur 
leider zählt der encoder vielzu schnell.
Als Mc verwende ich ein ATmega128 mit 16MHz Takt
Pullups für PortA sind auch aktiv

 ldi r23,255
 out porta,r23               ;PullUp für Drehgeber ein

;Timer eistellung
 ldi r23,1<<cs00
 out tccr0,r23      ;starten
 ldi r231<<toie0    ;Int ein:
 out timsk,r23      ;für Timer0 freigeben


Tim0_OVF:                   ;ISR Timer0-Überlauf
in sregtemp, sreg          ;Sreg sichern

;Encoder auslesen, ist verbunden mit PA0 und PA1
in  temp,pina
ror temp  ;pina0 ins Carry...
rol r24  ;.. und in bit0
ror temp  ;pina1 ins Carry
rol r24  ;und nochmal schieben
andi r24,$0f ;das Bitmuster der letzten ISR steht nun in bit2 und 3

cpi  r24,0b1011
breq links
cpi  r24,0b1101
breq links
cpi  r24,0b0100
breq links
cpi  r24,0b0010
breq links
cpi  r24,0b0001
breq rechts
cpi  r24,0b0111
breq rechts
cpi  r24,0b1110
breq rechts
cpi  r24,0b1000
breq rechts

rjmp  ende
                .
rechts:
inc drgn1
rjmp ende

links:
dec drgn1
ende:

sts enc1 ,drgn1            ;Encoder-Wert in enc1 speichern

out sreg, sregtemp         ;Sreg wiederherstellen
reti                       ;ISR fertig...

viellecht hat von euch noch einer eine idee
mfg

von Kilpikonna (Gast)


Lesenswert?

Wie schnell dreht der Encoder denn?
Ich würde erst mal die Signalfrequenz bestimmen.
Dazu musst du die maximale Drehzahl nehmen und mit der Anzahl der 
Flanken (4) und der Auflösung des Encodes multiplizieren.
Wenn du das hast, einfach mal in AVRStudio simulieren und gucken 
wieviele Takte dein Programm braucht.
Ich habe das auch mal gemacht, der AVR hats nur ganz knapp geschafft, 
aber weitere Berechnungen waren da nicht mehr möglich. Deshalb habe ich 
ein CPLD eingesetzt, es gibt aber auch fertige Decoder.

von Jürgen W. (juergen_w) Benutzerseite


Lesenswert?

Nicht alle Flankenwechsel auswerten.
Kommentiere doch einfach ein paar Vergleiche aus.

z.B.
1
cpi  r24,0b1011
2
breq links
3
;cpi  r24,0b1101
4
;breq links
5
;cpi  r24,0b0100
6
;breq links
7
cpi  r24,0b0010
8
breq links
9
cpi  r24,0b0001
10
breq rechts
11
;cpi  r24,0b0111
12
;breq rechts
13
;cpi  r24,0b1110
14
;breq rechts
15
cpi  r24,0b1000
16
breq rechts

Das würde die Geschwindigkeit halbieren

von spess53 (Gast)


Lesenswert?

Hi

Wo ist die Stelle, an der du feststellst, ob sich an den Pins überhaupt 
etwas geändert hat?

Und noch etwas: Entscheide dich, ob du die Registerbezeichnungen oder 
das .def-Gedödel benutzt. Dein Durcheinander bringt dich früher oder 
später, eher früher, in Schwierigkeiten.

MfG Spess

von Achim (Gast)


Lesenswert?

spess53 schrieb:
> Hi
>
> Wo ist die Stelle, an der du feststellst, ob sich an den Pins überhaupt
> etwas geändert hat?

Ich zähle ja die Variable etweder Hoch oder Runter jenachdem ob Links 
oder Rechts gedreht wurde.
 inc drgn1
 dec drgn1
aber leider wird nicht kontinuierlich gezählt,da sind machmal sprünge 
von 10 bis 100 drin ganz egal ob ich nun Rechts oder Links drehe

von citb (Gast)


Lesenswert?

Achim schrieb:
> aber leider wird nicht kontinuierlich gezählt,da sind machmal sprünge
> von 10 bis 100 drin ganz egal ob ich nun Rechts oder Links drehe

Wo ist die Entprellung?

citb

von Falk B. (falk)


Lesenswert?

Siehe Drehgeber.

von MaWin (Gast)


Lesenswert?

Sieht ok aus, du bist sicher daß r24 nicht zerstört wird, und der 
Interrupt schnell genug kommt ?

Dann löte extern mal niederohmigere pull ups dran.

> Wo ist die Entprellung?

Coder nicht verstanden ?

von Achim (Gast)


Lesenswert?

SO JETZ GEHTS :),
wie kann ich den Zählumfang begrenzen, kann ich das auch im Interrupt 
machen.
mfg

von Jens G. (jensig)


Lesenswert?

>SO JETZ GEHTS :),

Und - was war die Lösung? Andere wollen vielleicht auch mal davon 
profitieren.
>wie kann ich den Zählumfang begrenzen, kann ich das auch im Interrupt
>machen.
Indem man die Countervariable vor jedem inc und dec checkt, und wenn die 
Grenzwerte erreicht wurden, eben kein inc oder dec macht. Wo ist da das 
Problem?

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.