Forum: Mikrocontroller und Digitale Elektronik viertel-Auflösung mit Drehgebercode von P. Dannegger


von R. F. (inet_surfer88)


Lesenswert?

Hallo,

ich habe ein Problem mit dem Drehgebercode von Peter Dannegger.
Ich verwende das Programm von dem Artikel "Drehgeber" für wackeligen 
Rastpunkt.

http://www.mikrocontroller.net/articles/Drehgeber

Wenn ich eine Rastung weiter drehe, springt der Wert allerdings um 2 
weiter.
const int8_t table[16] PROGMEM = {0,1,-1,0,-1,0,0,1,1,0,0,-1,0,-1,1,0};
Laut Peter Dannegger für wackelige Rastpunkte und halbe Auflösung

Wenn ich folgendes verwende:
const int8_t table[16] PROGMEM = {0,0,-1,0,0,0,0,1,1,0,0,0,0,-1,0,0};
springt der Wert jeweils um 4 weiter, laut Dannegger volle Auflösung.

Ich benötige also einen Code mit einer Viertelauflösung. Kann Die Zeile 
mit dem PROGMEM für Viertelauflösung umgeschrieben werden. Ich habe das 
System dahinter noch nicht ganz verstanden. Gibt es evtl. schon einen 
Beitrag, wo das erklärt wird. Habe schon danach gesucht aber nichts 
gefunden.

Danke und Gruß

von Peter D. (peda)


Lesenswert?

R. F. schrieb:
> Laut Peter Dannegger für wackelige Rastpunkte und halbe Auflösung

Das "für wackelige Rastpunkte" ist nicht von mir.
Ob es überhaupt funktioniert, weiß ich daher nicht.

von R. F. (inet_surfer88)


Lesenswert?

Peter Dannegger schrieb:
> Das "für wackelige Rastpunkte" ist nicht von mir.
> Ob es überhaupt funktioniert, weiß ich daher nicht.

Sorry, hatte ich so interpretiert.

Ich hatte aber auch schon das andere Programm ausprobiert. Da gibt es ja 
die 3 Unterprogramme, für volle, halbe und viertelauflösung. Wenn ich 
die für Viertelauflösung verwende, funktioniert es meistens, aber bei 
bestimmten Rastpunkten springt der Zähler um 2 weiter. Ich vermute mal, 
der Drehgeber ist nicht gerade der beste. Bei den meisten Rastungen 
springt der Zähler nur um 1. Bei einer Menüeingabe natürlich nicht 
gerade schön. Gibt es hier evtl. eine Lösung?

von Karl H. (kbuchegg)


Lesenswert?

R. F. schrieb:

> springt der Zähler nur um 1. Bei einer Menüeingabe natürlich nicht
> gerade schön. Gibt es hier evtl. eine Lösung?

Wenn die andere für dich funktioniert, kannst du du ja genau dieselbe 
Lösung für dein 4-er Problem benutzen.

Vergleichst du die 3 Abfrage-Funktionen von Peters Lösung, dann siehst 
du, dass sie sich nur dadurch unterscheiden, dass der Returnwert das 
eine mal direkt, das andere mal noch durch 2 dividiert und bei der 3.ten 
Funktion durch 4 dividiert wird (inform eines Bitschiebers). Genau das 
gleiche kannst du ja in der Version mit "wackeligem Rastpunkt" auch 
machen (wenn die Funktionalität grundsätzlich funktioniert).

von R. F. (inet_surfer88)


Lesenswert?

Karl Heinz Buchegger schrieb:

> Genau das
> gleiche kannst du ja in der Version mit "wackeligem Rastpunkt" auch
> machen (wenn die Funktionalität grundsätzlich funktioniert).

Habe ich gerade ausprobiert. Dann zählt der Wert überhaupt nicht mehr 
und bleibt stehen.

return val;  -> Original, zählt bei mir um 2 weiter
return val >> 1; -> sollte um 1 weiter zählen, zählt aber überhaupt 
nicht
return val << 1; -> zählt um 4 weiter, eigentlich so ok und ein Zeichen, 
daß es wohl grundsätzlich funktioniert.

Ich habe momentan keine Idee, warum das weiterzählen um 1 nicht geht.

von Uwe (de0508)


Lesenswert?

R. F.,

wie schnell werden die Ausgänge des Encoders abgetastet ?

1, 2 oder 3 kHz ?

von Karl H. (kbuchegg)


Lesenswert?

R. F. schrieb:
> Karl Heinz Buchegger schrieb:
>
>> Genau das
>> gleiche kannst du ja in der Version mit "wackeligem Rastpunkt" auch
>> machen (wenn die Funktionalität grundsätzlich funktioniert).
>
> Habe ich gerade ausprobiert. Dann zählt der Wert überhaupt nicht mehr
> und bleibt stehen.
>
> return val;  -> Original, zählt bei mir um 2 weiter
> return val >> 1; -> sollte um 1 weiter zählen, zählt aber überhaupt
> nicht

Hä?
Das ergibt keinen Sinn.

WElchen Code verwendest du genau. Bitte komplett, also auch, wie du dann 
den Returnwert weiterverwendest.

von R. F. (inet_surfer88)


Lesenswert?

Uwe S. schrieb:
> R. F.,
>
> wie schnell werden die Ausgänge des Encoders abgetastet ?
>
> 1, 2 oder 3 kHz ?

1kHz

von R. F. (inet_surfer88)


Lesenswert?

Karl Heinz Buchegger schrieb:

> Hä?
> Das ergibt keinen Sinn.
>
> WElchen Code verwendest du genau. Bitte komplett, also auch, wie du dann
> den Returnwert weiterverwendest.


Der Returnwert wird von mir noch weiter verwendet. An dem kann es zwar 
eigentlich nicht liegen, aber ich werde den code dennoch posten. Kann 
ich aber erst morgen machen, da ich mittlerweile vor dem Laptop sitzte 
und nicht mehr vor meinem "Bastelrechner".

Aber mal aus dem Kopf:

differenz = return - return_alt
return_alt = return

An unterschiedlichen Stellen im Programm verändert der Drehgeber 
unterschiedliche Variablen, je nach dem in welchem Untermenü man sich 
gerade befindet. Dies geschiet dann z.B. durch

wert1 = wert1 + differenz

an anderer Stelle dann eben

wert2 = wert2 + differenz.

Und so weiter



return steht für den Returnwert der Drehgeberfunktion, return_alt ist 
eine globale Variable gleichen Datentyps
differenz ist ein char

Aber wie gesagt: morgen poste ich das Original

von Falk B. (falk)


Lesenswert?

@  R. F. (inet_surfer88)

>> gleiche kannst du ja in der Version mit "wackeligem Rastpunkt" auch
>> machen (wenn die Funktionalität grundsätzlich funktioniert).

>Habe ich gerade ausprobiert. Dann zählt der Wert überhaupt nicht mehr
>und bleibt stehen.

Dann hast du einen Fehler gemacht. Poste VOLLSTÄDIGEN COde als Anhang.

>Ich habe momentan keine Idee, warum das weiterzählen um 1 nicht geht.

Siehe oben. Hast du mal die beiden defines der Phasen vertauscht? So wie 
im Artikel erklärt?

"Praktisch heisst das, dass man lediglich die Dekodertabelle für die 
Auswertung ändern muss. Beachtet werden muss jedoch, dass man bei den 
"wackeligen" Drehgebern Spur A und B nicht beliebig vertauschen kann. 
Ist also die Auswertung immer noch wackelig, muss man im Quelltext die 
Defines für PHASE_A und PHASE_B vertauschen. Ein Blick ins Datenblatt 
des Drehgebers sollte auch hier helfen. "

von R. F. (inet_surfer88)


Lesenswert?

Hallo zusammen,

jetzt muss ich mich mal wieder melden.
Das Problem ist sagen wir mal mit 99,9%iger wahrscheinlichkeit gelößt.

Der Reihe nach:

Folgendes konnte ich nicht lösen:
> return val >> 1; -> sollte um 1 weiter zählen, zählt aber überhaupt
Habe ich aber ehrlich gesagt auch nicht weiter verfolgt.

Ich ging davon aus, dass beide Codes im Artikel von Peter Dannegger 
stammen, und der zweite der bessere ist (weil für wackelige Rastpunkte). 
Das dem nicht so ist, hat Peter Dannegger ja weiter oben klargestellt.

Also habe ich mal den oberen Code ausprobiert, mit der Viertelauflösung. 
Dann habe ich +1 bzw. -1 pro Rastung. Allerdings wackelt das Teil am 
Rastpunkt, aber nicht bei jedem.
Also, Phasen tauschen. Wackelt aber immer noch bei einigen Rastpunkten, 
aber deutlich besser. Manchmal springt der Wert auch um 2 weiter bei 
einer Rastung, möchte man den übersprungenen Wert haben, muss man den 
Drehgeber in der Mitte zwischen 2 Rastpunkten festhalten. Für eine 
Menüsteuerung unbrauchbar.

Nach langem Suchen mal den Drehgeber getauscht ---> Alles funktioniert.
Aber nicht lange. Nach kurzer Zeit tauchten die Probleme wieder auf.

Ich vermute nun, dass der Drehgeber im eingebauten Zustand etwas zu viel 
Spannung hat (mechanische, nicht elektrische). Liegt das Teil frei auf 
dem Tisch, funktioniert es ohne Probleme. Ist er eingebaut, wird das 
Problem größer, je fester die Schraube der Platinenbefestigung ist.

Also gibt es beim nächsten mal eine mechanische Verbesserung. Und mit 
halb lockerer Schraube ist das Ergebnis jetzt brauchbar. Springt nur 
noch selten. Ich hoffe, das bleibt so.


Danke an alle für die Beiträge und noch Frohe Ostern!

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.