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ß
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.
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?
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).
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.
R. F., wie schnell werden die Ausgänge des Encoders abgetastet ? 1, 2 oder 3 kHz ?
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.
Uwe S. schrieb: > R. F., > > wie schnell werden die Ausgänge des Encoders abgetastet ? > > 1, 2 oder 3 kHz ? 1kHz
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
@ 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. "
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.