Forum: Mikrocontroller und Digitale Elektronik Problem beim DREHGEBER


von gasst (Gast)


Angehängte Dateien:

Lesenswert?

hallo,
ich versuche meinen drehgeber auszulesen,
habe hier im Forum eine Routine von Hannes gefunden,die auch 
funktioniert da ist der drehgeber aber an PortB b2,b3 angeschlossen,ich 
habe bei mir nur noch den PortB b3,b4 und wollte ich den drehgeber 
anschliessen.
aber es funktioniert nicht,ist ja auch klar durch das schiften.
vielleicht kann mir jemand helfen

mfg
danke

von Sascha W. (sascha-w)


Lesenswert?

Hallo,

da nur an einer Stelle das IO-Port gelesen wird füge nach
>in wl,dgp                  ;Drehgeber einlesen
ein
>lsr wl
ein und damit wandern die Bits von 3,4 wieder nach 2,3 .
Alles andere lässt du im Originalzustand - also auch dgmsk (0b00001100)

Sascha

von gasst (Gast)


Lesenswert?

VIELEN DANK

von Flo (Gast)


Lesenswert?

Hallo liebe community,

ich möchte mithilfe eines Inkremental Drehgebers die 
Verfahrgeschwindigkeit einer Maschine messen, dabei kommt es jedoch 
aufgrund von vibrationen der Maschine zu den im Artikel "Drehgeber" 
angesprochenen Pendeln, ist es nun auch hardwaretechnisch möglich diese 
Nadelimpulse mithilfe eines Kondensators zu unterdrücken? Denn eine 
Positions oder Richtungsbestimmung wird nicht benötigt... ggf. kann ja 
der zeitliche versatz durch den Kondensator in software korigiert 
werden.

Lg Flo

von Falk B. (falk)


Lesenswert?

@  Flo (Gast)

>angesprochenen Pendeln, ist es nun auch hardwaretechnisch möglich diese
>Nadelimpulse mithilfe eines Kondensators zu unterdrücken?

Man könnte eine Entprellung mit RC-tiefpass machen, allerdings geht 
das nur bis zu einem bestimmten Punkt. Denn wenn der Tiefpass so langsam 
wird, dass er die normalen Signale zu sehr beeinflußt, ist Feierabend.

> Denn eine
>Positions oder Richtungsbestimmung wird nicht benötigt...

Naja, aber der Witz am Drehgeber ist ja, dass er TROTZ 
Prellens/Pendelns mit der richtigen Auswertung fehlerfrei ausgewertet 
werden kann. Das solltest du tun, dann passt das.

MFG
Falk

von Flo (Gast)


Lesenswert?

Das Problem ist das ich keinen eingang mehr frei habe, würde es auch ein 
zwischengeschalteter quadratur clock converter tun (ls7082)?
Kann ich davon ausgehen das dieser mir die taktlänge entsprechend der 
weglänge liefert oder gibt es da abweichungen?

von Falk B. (falk)


Lesenswert?

@  Flo (Gast)

>Das Problem ist das ich keinen eingang mehr frei habe,

Dann must du irgendwie ein Pin einsparen.

>würde es auch ein
>zwischengeschalteter quadratur clock converter tun (ls7082)?

Nö, der braucht ja noch mehr Pins zur Steuerung.

>Kann ich davon ausgehen das dieser mir die taktlänge entsprechend der
>weglänge liefert oder gibt es da abweichungen?

???
Das Ding arbeitet schon sauber.

Mfg
Falk

von Flo (Gast)


Lesenswert?

Hätt ich eigentlich schon eher drauf kommen können, ich schalte einfach 
nen tiny dazwischen der mir die kanäle überwacht und einen impuls pro 
weg gibt.

Dazu könnte ich doch die pin changeinterrupts benutzen??
Das einzige was ich noch nicht so wirklich verstanden hab is die art der 
signalabfrage beider spuren, die bit-folge is klar nur muss ich doch 
immer 2 aufeinanderfolgenede interrupts anhand der pin zustände 
vergleichen, hab ich da nicht einen zeitverlust???

Wär nett wenn jemand mir das nochma erklären könnte.

von Falk B. (falk)


Lesenswert?

@  Flo (Gast)

>Dazu könnte ich doch die pin changeinterrupts benutzen??

NEIN!

>Wär nett wenn jemand mir das nochma erklären könnte.

Lies den Artikel Drehgeber in Ruhe und denk drüber nach, dann weißt 
du warum das ein schlechte Idee ist.

MFG
Falk

von hagbard celine (Gast)


Lesenswert?

Mich dünkt es, dass Falk Brunner der einzige ist, der für den Artikel 
Drehgeber propagiert. Komisch nur, dass nie von jemand anderem der 
Verweis auf den Artikel kommt.

...

von Hannes L. (hannes)


Lesenswert?

hagbard celine schrieb:
> Mich dünkt es, dass Falk Brunner der einzige ist, der für den Artikel
> Drehgeber propagiert. Komisch nur, dass nie von jemand anderem der
> Verweis auf den Artikel kommt.

Nunja, der Artikel ist ja gut und schön, deckt aber nicht alle 
Einsatzfälle ab und ist vom Anfänger nicht allzuleicht zu verstehen.


Die hier im Eröffnungsbeitrag zitierte Routine von mir ist schon sehr 
alt. Ich selbst nutze sie schon lange nicht mehr, obwohl sie recht 
zuverlässig ihren Dienst tat. Meine neue Routine (LUT mit Index aus 
altem und neuem DG-Zustand) ist da bedeutend flexibler einzusetzen.

Eines haben sie aber gemeinsam: Sie sind für langsames Betätigen 
rastender Drehgeber durch manuelle Eingaben konzipiert.

Sie sind nicht für Lage- und Drehzahlbestimmung von Maschinenantrieben 
geeignet, denn das ist eine gaaaanz andere Liga und erfordert auch 
andere Technologien (höhere Geschwindigkeit, Schutz gegen 
Schrittverlust, ...).

>
> ...

...

von Flo (Gast)


Lesenswert?

Ich hab im Controller intern schon einen Timerinterrupt der jede µs 
ausgeführt wird, hab zudem nun die 2. spur an den controller gehängt, 
alle beide an interrupt pins.
ich messe im prinzip über die zeitbasis des timers die zeit bis ein 2. 
impuls auf der a-spur kommt. ist es nun möglich das pendeln über eine 
zeitgleiche abfrage der spur-zustände jede µs und einem späteren 
vergleich dieser nach eintreffen des "stops" zu kompensieren, bzw. zu 
ermitteln ob es ein pendel-impuls war oder wirklich der weg verfahren 
wurde?

Lg Flo

von Hannes L. (hannes)


Lesenswert?

Flo schrieb:
> Ich hab im Controller intern schon einen Timerinterrupt der jede µs
> ausgeführt wird,

Also ein Timer-Interrupt je µs (Mikrosekunde)...

Ich denke, jetzt wird es mal langsam Zeit für Fakten.

- Welchen Controller benutzt Du?
- Wie schnell wird er getaktet?
- Was willst Du überhaupt messen? (Position und Richtung des Verfahrens,
  also das, wozu man einen Drehgeber benutzt, wohl nicht)
- Wozu brauchst Du einen Timer-Interrupt mit einem Intervall von 1µs?

> hab zudem nun die 2. spur an den controller gehängt,
> alle beide an interrupt pins.
> ich messe im prinzip über die zeitbasis des timers die zeit bis ein 2.
> impuls auf der a-spur kommt. ist es nun möglich das pendeln über eine
> zeitgleiche abfrage der spur-zustände jede µs und einem späteren
> vergleich dieser nach eintreffen des "stops" zu kompensieren, bzw. zu
> ermitteln ob es ein pendel-impuls war oder wirklich der weg verfahren
> wurde?

Deine Aussagen sind mir aufgrund fehlender Fakten relativ 
unverständlich.

Ich spekuliere mal:

Du willst mit einem Controllerpin eine Drehzahl (Frequenz) ermitteln und 
nutzt als Geber einen Drehgeber, weil es mechanisch so schön passt. Die 
Impulse kommen so schnell, dass eine normale Auswertung beider Spuren im 
Millisekundenraster nicht möglich ist. Da Du nur eine Spur ausliest, 
kommt es aufgrund von Vibrationen bei stehender Welle zu Fehlimpulsen.

Wenn das soweit zutrifft, dann stellt sich die Frage, wie schnell 
(ehrliche) Impulse kommen können. Denn erst mit dieser Info kann man 
Deine Frage beantworten, ob man die Drehgeberimpulse mit einem Tiny 
(z.B. Tiny13) so aufarbeiten kann, dass Dein Controller auf nur einer 
Leitung saubere Impulse zu sehen bekommt.

Denn wenn es nicht zu schnell wird (µs-Bereich), dann sehe ich eine 
Möglichkeit der Signalaufbereitung mit Tiny13, und zwar eine Art 
Flipflop. Dabei wird der Zustand beider Spuren in einer Schleife 
gescannt, bei 01 der Ausgangspin gesetzt und bei 10 der Ausgangspin 
wieder gelöscht. Das Klappern einer Spur wäre damit eliminiert, es wird 
erst reagiert, wenn beide Spuren klappern.

Ist das Tempo für einen Tiny13 zu schnell, dann muss eben Logik in 
Hardware her, entweder ein Gattergrab oder ein programmierbarer 
Logikbaustein.

Habe ich Dich falsch verstanden und Du willst wirklich eine komplette 
Auswertung von Position, Richtung und Verfahrweg machen, dann vergiss 
was ich geschrieben habe.

>
> Lg Flo

...

von gasst (Gast)


Lesenswert?

HALLO;
um nochmal zum anfangspost zu kommen,
ich habe Hannes seine Routine benutzt,die funktioniert auch so nun 
wollte ich einen 2 Drehgeber an einen anderen Port 
anschliessen(1.Drehgeber PortB 3,4;;2.Drehgeber an PortA 3,4) ich rufe 
die Routine dann ein zweites mal auf mit geänderten Port aber es rühert 
sich beim 2.drehgeber überhaubt nichts,
kann mir jemand weiterhelfen

mfg

von gasst (Gast)


Lesenswert?

hallo,
kann mir keiner weiterhelfen wie ich 2 Drehgeber auswerten kann

mfg

von Hannes L. (hannes)


Lesenswert?

gasst schrieb:
> hallo,
> kann mir keiner weiterhelfen wie ich 2 Drehgeber auswerten kann
>
> mfg

Wie ich Dir bereits oben
Beitrag "Re: Problem beim DREHGEBER"
schrieb, ist meine von Dir verwendete Routine bereits recht alt und 
nicht übermäßig elegant. Es lohnt sich nicht, weiter darüber 
nachzudenken.

In einem anderen Projekt hatte ich mal zwei Drehgeber verwendet, deren 
Ergebnisse ich aber als Up/Down-Tasten brauchte. Daher enthält die LUT 
keine Increment-Konstanten, sondern Bitwerte für die Tastenflags.

Trotzdem kann man gut erkennen, wie beide Drehgeber quasi gleichzeitig 
ausgewertet werden.

Der Aufruf der Routine erfolgt im Zeitraster von etwa 1 ms.
1
drehgeber:          ;UP, liest Drehgeber und Taster entprellend ein
2
 cbr merker,1<<entprell     ;Jobflag löschen
3
 push wl                    ;Variablen beschaffen
4
 push wh
5
 push r0
6
 push r1
7
 push zl
8
 push zh
9
 lds wl,evt                 ;Entprell-Vorteiler holen,
10
 inc wl                     ;erhöhen
11
 sts evt,wl                 ;und wieder sichern
12
 andi wl,15                 ;jedes 16. mal Tasten statt Drehgeber abfragen
13
 brne drehgeber1            ;16. mal? - nein, Drehgeber abfragen...
14
 rjmp entprellung           ;ja, Tasten entprellen...
15
drehgeber1:         ;Drehgeber abfragen
16
 in wl,dgpin                ;Drehgeberport lesen
17
 andi wl,dgmsk              ;nur Drehgeberpins maskieren
18
 mov wh,wl                  ;Kopie für zweiten Drehgeber
19
 lsr wh                     ;um 2 Bits nach rechts
20
 lsr wh                     ;verschieben (54 -> 32)
21
 or wl,wh                   ;zusammenfassen
22
 andi wl,$cc                ;nur Drehgeberbits maskieren (7632)
23
 lds wh,dgalt               ;Zustand der letzten Abfrage holen
24
 sts dgalt,wl               ;jetzigen Zuastand für nächstes mal merken
25
 lsr wh                     ;Referenz um 2 Bits nach rechts
26
 lsr wh                     ;verschieben (7632 -> 5410)
27
 or wl,wh                   ;Zustände zusammenfassen (neu 7632, alt 5410)
28
 mov wh,wl                  ;und kopieren, jedes Nibble ist ein Drehgeber
29
 swap wh                    ;oberes Nibble der Kopie nach unten
30
 andi wl,15                 ;Index für linken Drehgeber isolieren
31
 andi wh,15                 ;Index für rechten Drehgeber isolieren
32
 lds r1,dgfl                ;Drehgeber-Flags holen
33
 ldi zl,low(dgtab*2)        ;Pointer auf Tabelle
34
 ldi zh,high(dgtab*2)       ;mit Drehgeberflag-Bitmustern
35
 add zl,wl                  ;Index links 
36
 adc zh,null                ;mit Übertrag addieren
37
 lpm r0,z                   ;Flags aus Tabelle holen
38
 or r1,r0                   ;und übernehmen
39
 ldi zl,low(dgtab*2)        ;Pointer auf Tabelle
40
 ldi zh,high(dgtab*2)       ;mit Drehgeberflag-Bitmustern
41
 add zl,wh                  ;Index rechts 
42
 adc zh,null                ;mit Übertrag addieren
43
 lpm r0,z                   ;Flags aus Tabelle holen,
44
 swap r0                    ;ins obere Nibble swappen
45
 or r1,r0                   ;und übernehmen
46
 sts dgfl,r1                ;DG-Flags zurückschreiben
47
drehgeber_e:        ;Ende Drehgeber-Routine
48
 pop zh                     ;Variablen entsorgen
49
 pop zl
50
 pop r1
51
 pop r0
52
 pop wh
53
 pop wl
54
 ret                        ;fertig, zurück...
55
 ;in dgfl stehen nun die Drehgeber-Ereignisse, 54=links, 10=rechts
56
57
entprellung:        ;Tasten entprellen
58
 lds r0,pz0         ;Variablen holen
59
 lds r1,pz1
60
 lds zl,tfl
61
 lds wh,tas
62
debounce8:          ;Entprellen der Tasten
63
 ;wl enthält neuen Wert, wh enthält entprellten Status
64
 ;r0 enthält Prellzähler0, r1 enthält Prellzähler1
65
 ;zl enthält Drückflag
66
 ;Der Algorithmus ist von Peter Dannegger übernommen 
67
 in wl,tapin    ;Tasten einlesen
68
 com wl         ;und invertieren
69
 eor wl,wh      ;nur Änderungen werden H
70
 and r0,wl      ;Prellzähler unveränderter Tasten löschen (Bit0)
71
 and r1,wl      ;Prellzähler unveränderter Tasten löschen (Bit1)
72
 com r0         ;L-Bit zählen 0,2,->1, 1,3,->0
73
 eor r1,r0      ;H-Bit zählen 0,2,->tz1 toggeln
74
 and wl,r0      ;Änderungen nur dann erhalten, wenn im Prellzähler
75
 and wl,r1      ;beide Bits gesetzt sind (Zählerstand 3)
76
 eor wh,wl      ;erhaltene Änderungen toggeln alten (gültigen) Tastenstatus
77
 and wl,wh      ;nur (neu) gedrückte Tastenbits bleiben erhalten
78
 or zl,wl       ;und zugehörige Bits setzen (gelöscht wird nach Abarbeitung)
79
 ;die eigentliche Entprellung ist fertig, nun noch Variablen ins RAM schreiben
80
 sts pz0,r0         ;Prellzähler0,
81
 sts pz1,r1         ;Prellzähler1
82
 sts tas,wh         ;und Tastenstatus zurück ins SRAM
83
 ;Tastenflags brauchen wir noch, jetzt wird erstmal die Modetaste geprüft:
84
 lds wl,mode        ;Betriebsmodus holen
85
 sbrc zl,t_mode     ;Modetaste betätigt? - nein...
86
 inc wl             ;ja, Mode erhöhen
87
 cbr zl,1<<t_mode   ;Tastenflag Modetaste löschen
88
 cpi wl,4           ;Mode auf 
89
 brlo debounce8a    ;0..3 
90
 clr wl             ;begrenzen
91
debounce8a:
92
 sts mode,wl        ;Mode wieder sichern
93
 sts tfl,zl         ;Tastenflags sichern
94
 ;in tfl stehen die Flags für neu gedrückte Tasten, in tas der entprellte
95
 ;Zustand der Tasten, die Modetaste wurde bereits ausgewertet
96
 rjmp drehgeber_e           ;fertig, lokale Variablen entsorgen und zurück...

Da Du die Drehgeber an verschiedene Ports angeschlossen hast, musst Du 
das Zusammenführen der Bits in ein gemeinsames Register verändern. Eine 
Möglichkeit dazu wäre, die Bits des einen Drehgebers um 2 Bits nach 
rechts zu schieben (auf Bit 1 und 0) und die Bits des anderen Drehgebers 
um 2 Bit nach links (Bit 5 und 4). Dann können sie zusammengefasst, 
maskiert und weiterbehandelt werden.

Wenn Du keine UP/Down-Tastenbits zur Rückgabe brauchst, sondern 
Ringzähler, so musst Du zwei Zählregister einsetzen und die LUT anpassen 
(statt der Bitmuster Zählschrittweiten eintragen, also '-1' statt '2').

Und hier ist die zugehörige LUT:
1
#ifdef paul
2
dgtab:      ;Tabelle mit Drehgeber-Werten (alt-alt-neu-neu als Index)
3
                    ;aa nn,     aa nn   ;Version für Kameraden mit
4
.db     0, 1        ;00 00,     00 01   ;dem dicken Kopf
5
.db     0, 0        ;00 10,     00 11
6
.db     2, 0        ;01 00,     01 01
7
.db     0, 0        ;01 10,     01 11
8
.db     0, 0        ;10 00,     10 01
9
.db     0, 2        ;10 10,     10 11
10
.db     0, 0        ;11 00,     11 01
11
.db     1, 0        ;11 10,     11 11
12
#else
13
dgtab:      ;Tabelle mit Drehgeber-Werten (alt-alt-neu-neu als Index)
14
                    ;aa nn,     aa nn   ;Version für China-Drehgeber von
15
.db     0, 0        ;00 00,     00 01   ;Sure-Electronic
16
.db     0, 0        ;00 10,     00 11
17
.db     0, 0        ;01 00,     01 01
18
.db     0, 0        ;01 10,     01 11
19
.db     0, 0        ;10 00,     10 01
20
.db     0, 2        ;10 10,     10 11
21
.db     0, 0        ;11 00,     11 01
22
.db     1, 0        ;11 10,     11 11
23
#endif

Die LUT ist für zwei verschiedene Drehgeber-Typen ausgelegt, durch 
bedingte Assemblierung wird natürlich immer nur eine der beiden Tabellen 
benutzt.

...

von gasst (Gast)


Lesenswert?

hallo,
ich habs mal getestet aber irgendwie spingen die werte immer hin und 
her,
habe erstmal die einfache version mit einem drehgeber 
getestet,allerdings habe ich die drehgeber von Reichelt STEC12E08 werde 
mir nochmal den von pollin bestellen und dann gucken obs denn geht

vielen dank nochmal

mfg

von Hannes L. (hannes)


Lesenswert?

gasst schrieb:
> hallo,
> ich habs mal getestet aber irgendwie spingen die werte immer hin und
> her,

Dann solltest Du die Tabelle an die Eigenheiten Deiner Drehgeber 
anpassen.

> habe erstmal die einfache version mit einem drehgeber
> getestet,allerdings habe ich die drehgeber von Reichelt STEC12E08

Dann ermittle (durch Messen) doch erstmal, wie Dein Drehgeber überhaupt 
reagiert.
- Wieviele Zustände hat er pro Rastung?
  Das bestimmt die Anzahl der Einträge in der Tabelle.
- Welche Zustände sind im eingerasteten Zustand stabil?
  Das bestimmt die Position der Einträge in der Tabelle
- Welche Flanken (Zustandswechsel) treten im eingerasteten Zustand
  (bei leichter Bewegung im Rastpunkt) auf?
  Das bestimmt, welche Positionen in der Tabelle gemieden werden müssen.

Die einfachste Methode zum Ermitteln dieser Daten ist das Anschließen 
von LEDs (incl. Widerständen) an die Drehgeber und das Beobachten dieser 
bei ganz langsamer manueller Betätigung. Damit kann man eindeutig 
erkennen, welche Flanke von Rastung zu Rastung nur einmal auftritt, und 
zwar soweit zwischen den Rastpunkten, dass sie im halbeingerasteten 
Zustand garantiert nicht auftreten kann. Und dann sind die 
entsprechenden Einträge (1 für vorwärts und -1 für rückwärts) an die den 
Flanken entsprechenden Positionen in die Tabelle einzutragen, der Rest 
der Tabelle wird dann mit 0 aufgefüllt. Somit findet ein Zählvorgang nur 
dann statt, wenn die zuverlässige Flanke zwischen den Rastpunkten 
aufgetreten ist.

Dazu noch ein Hinweis: Die Tabelle enthält 16 Werte (4 Bit). Der Index 
(also die Nummer des Wertes in der Tabelle) wird ermittelt aus dem 
Pinzustand des Drehgebers der vorhergehenden Abtastung (2 Bit) und dem 
Pinzustand des Drehgebers der aktuellen Abtastung (weitere 2 Bit). Eine 
Flanke ist dort, wo alter (von der vorherigen Abtastung gemerkter) und 
neuer (aktuell eingelesener) Pinzustand unterschiedlich ist. Eine 
gültige Flanke ist dort, wo nur ein Pin unterschiedlich ist, der andere 
aber unverändert.

> werde
> mir nochmal den von pollin bestellen und dann gucken obs denn geht

Der Drehgeber von Pollin funktioniert mit dieser Tabelle auch nur in 
einer Polarität. Vertauscht Du die Spuren, musst Du die Tabelle 
anpassen.

>
> vielen dank nochmal

Noch ein gut gemeinter Rat: Bitte verwende keinen unverstandenen fremden 
Code. Du wirst damit nicht froh werden. Wenn Du fremden Code verwendest, 
dann nimm Dir die Zeit und mach' Dir die Arbeit und analysiere diesen 
Code, damit Du verstehst, was da passiert. Nur so kannst Du ihn bei 
Bedarf an Deine persönlichen Ansprüche und Gegebenheiten anpassen.

>
> mfg

Noch'n Tip: Lies bitte mal die "Wichtigen Regeln" im Kopf des 
Antwortformulars (Groß- und Kleinschreibung verwenden) und richte Dich 
bitte auch danach.

...

von Peter D. (peda)


Lesenswert?

Flo schrieb:
> ich möchte mithilfe eines Inkremental Drehgebers die
> Verfahrgeschwindigkeit einer Maschine messen

Und warum hijackst Du dann ein völlig anderes Thema?

Dem OP geht es um einen manuellen Drehgeber STEC12E08.
Er wird sich jetzt schön bei Dir bedanken, weil Du seinen Thread zur Sau 
gemacht hast.


Peter

von Peter D. (peda)


Lesenswert?

hagbard celine schrieb:
> Mich dünkt es, dass Falk Brunner der einzige ist, der für den Artikel
> Drehgeber propagiert.

Und mich dünkt (nein, ich bin mir sogar sicher), daß Du ihn noch nie 
ausprobiert hast.
Zuverlässiger gehts einfach nicht.
Und obendrein noch universell für alle 3 Encoder-Rasttypen.


Peter

von gasst (Gast)


Lesenswert?

Hallo Hannes,
ich habe es mit den Leds getestet.

>- Wieviele Zustände hat er pro Rastung?
>  Das bestimmt die Anzahl der Einträge in der Tabelle.
>- Welche Zustände sind im eingerasteten Zustand stabil?
>  Das bestimmt die Position der Einträge in der Tabelle
>- Welche Flanken (Zustandswechsel) treten im eingerasteten Zustand
>  (bei leichter Bewegung im Rastpunkt) auf?
>  Das bestimmt, welche Positionen in der Tabelle gemieden werden müssen.

  Pro Rastung hat er 2 Zustände,
  Rechts Drehen von Rastung zu Rastung (Das Anschneiden der
  Rastung) erst leuchtet PhaseA kurz
  darauf PhaseB,und beim Links Drehen genau umgekehrt,
  das wähern dann ja 16 Einträge in der Tabelle wenn ich mich nicht irre

  Es leuchtet keine Led wenn er in  einer Rastung drin steht
  Wenn ich zB. ganz Langsam nach Rechts (Drehe) und die Rastung
  Anschneide dann leuchtet nur PhaseA


Hier ist erstmal die Tabelle,ich habs Versucht so umzusetzen wie Du es
vorgeschlagen hast

;       PHASE
;       A  B
.db     0, 0
.db     1, 0   ;Rechts Drehen
.db     0, 1
.db     0, 0
.db    -1, 0   ;Links Drehen
.db     0,-1
.db     0, 0
.db     0, 0


 in wl, dgp2   ;PORTB B2,B3 ;Drehgeber-Port einlesen
 andi wl,dgmsk1             ;nur die benutzten 2 Bits werten
 lsl drgn2                  ;altes Drehgeber-Bitmuster
 lsl drgn2                  ;nach oben schieben
 or drgn2,wl                ;neue Drehgeberbits einblenden
 andi drgn2,dgaltmsk        ;Index auf 4 Bit begrenzen (uralt löschen)
 ldi zl,low(dgtab*2)        ;Tabelle mit
 ldi zh,high(dgtab*2)       ;Dregheber-Increment-Werten
 add zl,drgn2               ;Index aufaddieren
 adc zh,null                ;Übertrag auch
 lpm wl,z                   ;Inkrement-Wert holen (0, +1 oder -1)
 add drg2,wl                ;Drehgeber-Increment aufaddieren

Aber Funktionieren tuts immer noch nicht

mfg

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.