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.
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
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 :), wie kann ich den Zählumfang begrenzen, kann ich das auch im Interrupt machen. mfg
>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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.