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.