www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Problem beim DREHGEBER


Autor: gasst (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Sascha Weber (sascha-w)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: gasst (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
VIELEN DANK

Autor: Flo (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Flo (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Flo (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: hagbard celine (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

...

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht 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, ...).

>
> ...

...

Autor: Flo (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht 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

...

Autor: gasst (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: gasst (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo,
kann mir keiner weiterhelfen wie ich 2 Drehgeber auswerten kann

mfg

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht 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.
drehgeber:          ;UP, liest Drehgeber und Taster entprellend ein
 cbr merker,1<<entprell     ;Jobflag löschen
 push wl                    ;Variablen beschaffen
 push wh
 push r0
 push r1
 push zl
 push zh
 lds wl,evt                 ;Entprell-Vorteiler holen,
 inc wl                     ;erhöhen
 sts evt,wl                 ;und wieder sichern
 andi wl,15                 ;jedes 16. mal Tasten statt Drehgeber abfragen
 brne drehgeber1            ;16. mal? - nein, Drehgeber abfragen...
 rjmp entprellung           ;ja, Tasten entprellen...
drehgeber1:         ;Drehgeber abfragen
 in wl,dgpin                ;Drehgeberport lesen
 andi wl,dgmsk              ;nur Drehgeberpins maskieren
 mov wh,wl                  ;Kopie für zweiten Drehgeber
 lsr wh                     ;um 2 Bits nach rechts
 lsr wh                     ;verschieben (54 -> 32)
 or wl,wh                   ;zusammenfassen
 andi wl,$cc                ;nur Drehgeberbits maskieren (7632)
 lds wh,dgalt               ;Zustand der letzten Abfrage holen
 sts dgalt,wl               ;jetzigen Zuastand für nächstes mal merken
 lsr wh                     ;Referenz um 2 Bits nach rechts
 lsr wh                     ;verschieben (7632 -> 5410)
 or wl,wh                   ;Zustände zusammenfassen (neu 7632, alt 5410)
 mov wh,wl                  ;und kopieren, jedes Nibble ist ein Drehgeber
 swap wh                    ;oberes Nibble der Kopie nach unten
 andi wl,15                 ;Index für linken Drehgeber isolieren
 andi wh,15                 ;Index für rechten Drehgeber isolieren
 lds r1,dgfl                ;Drehgeber-Flags holen
 ldi zl,low(dgtab*2)        ;Pointer auf Tabelle
 ldi zh,high(dgtab*2)       ;mit Drehgeberflag-Bitmustern
 add zl,wl                  ;Index links 
 adc zh,null                ;mit Übertrag addieren
 lpm r0,z                   ;Flags aus Tabelle holen
 or r1,r0                   ;und übernehmen
 ldi zl,low(dgtab*2)        ;Pointer auf Tabelle
 ldi zh,high(dgtab*2)       ;mit Drehgeberflag-Bitmustern
 add zl,wh                  ;Index rechts 
 adc zh,null                ;mit Übertrag addieren
 lpm r0,z                   ;Flags aus Tabelle holen,
 swap r0                    ;ins obere Nibble swappen
 or r1,r0                   ;und übernehmen
 sts dgfl,r1                ;DG-Flags zurückschreiben
drehgeber_e:        ;Ende Drehgeber-Routine
 pop zh                     ;Variablen entsorgen
 pop zl
 pop r1
 pop r0
 pop wh
 pop wl
 ret                        ;fertig, zurück...
 ;in dgfl stehen nun die Drehgeber-Ereignisse, 54=links, 10=rechts

entprellung:        ;Tasten entprellen
 lds r0,pz0         ;Variablen holen
 lds r1,pz1
 lds zl,tfl
 lds wh,tas
debounce8:          ;Entprellen der Tasten
 ;wl enthält neuen Wert, wh enthält entprellten Status
 ;r0 enthält Prellzähler0, r1 enthält Prellzähler1
 ;zl enthält Drückflag
 ;Der Algorithmus ist von Peter Dannegger übernommen 
 in wl,tapin    ;Tasten einlesen
 com wl         ;und invertieren
 eor wl,wh      ;nur Änderungen werden H
 and r0,wl      ;Prellzähler unveränderter Tasten löschen (Bit0)
 and r1,wl      ;Prellzähler unveränderter Tasten löschen (Bit1)
 com r0         ;L-Bit zählen 0,2,->1, 1,3,->0
 eor r1,r0      ;H-Bit zählen 0,2,->tz1 toggeln
 and wl,r0      ;Änderungen nur dann erhalten, wenn im Prellzähler
 and wl,r1      ;beide Bits gesetzt sind (Zählerstand 3)
 eor wh,wl      ;erhaltene Änderungen toggeln alten (gültigen) Tastenstatus
 and wl,wh      ;nur (neu) gedrückte Tastenbits bleiben erhalten
 or zl,wl       ;und zugehörige Bits setzen (gelöscht wird nach Abarbeitung)
 ;die eigentliche Entprellung ist fertig, nun noch Variablen ins RAM schreiben
 sts pz0,r0         ;Prellzähler0,
 sts pz1,r1         ;Prellzähler1
 sts tas,wh         ;und Tastenstatus zurück ins SRAM
 ;Tastenflags brauchen wir noch, jetzt wird erstmal die Modetaste geprüft:
 lds wl,mode        ;Betriebsmodus holen
 sbrc zl,t_mode     ;Modetaste betätigt? - nein...
 inc wl             ;ja, Mode erhöhen
 cbr zl,1<<t_mode   ;Tastenflag Modetaste löschen
 cpi wl,4           ;Mode auf 
 brlo debounce8a    ;0..3 
 clr wl             ;begrenzen
debounce8a:
 sts mode,wl        ;Mode wieder sichern
 sts tfl,zl         ;Tastenflags sichern
 ;in tfl stehen die Flags für neu gedrückte Tasten, in tas der entprellte
 ;Zustand der Tasten, die Modetaste wurde bereits ausgewertet
 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:
#ifdef paul
dgtab:      ;Tabelle mit Drehgeber-Werten (alt-alt-neu-neu als Index)
                    ;aa nn,     aa nn   ;Version für Kameraden mit
.db     0, 1        ;00 00,     00 01   ;dem dicken Kopf
.db     0, 0        ;00 10,     00 11
.db     2, 0        ;01 00,     01 01
.db     0, 0        ;01 10,     01 11
.db     0, 0        ;10 00,     10 01
.db     0, 2        ;10 10,     10 11
.db     0, 0        ;11 00,     11 01
.db     1, 0        ;11 10,     11 11
#else
dgtab:      ;Tabelle mit Drehgeber-Werten (alt-alt-neu-neu als Index)
                    ;aa nn,     aa nn   ;Version für China-Drehgeber von
.db     0, 0        ;00 00,     00 01   ;Sure-Electronic
.db     0, 0        ;00 10,     00 11
.db     0, 0        ;01 00,     01 01
.db     0, 0        ;01 10,     01 11
.db     0, 0        ;10 00,     10 01
.db     0, 2        ;10 10,     10 11
.db     0, 0        ;11 00,     11 01
.db     1, 0        ;11 10,     11 11
#endif

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

...

Autor: gasst (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht 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.

...

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: gasst (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.