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
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.
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
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
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
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 ?
>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?