Hallo,
Ich nutze die Encoder-Funktion von Peter Dannegger zusammen mit einem
Drehencoder vo Reichelt,Aber leider zählt er nicht richtig,pro Rastung
sind manchmal Sprünge von 100 drin.
Den Encoder-Wert gebe ich erstmal nur zum Terminal aus.
kann mir da einer Weiterhelfen
mfg
Leider kann ich das Datenblatt nicht Anhängen
Falk Brunner schrieb:> Ich glaube da fehtl ein volatile int8_t enc_delta;
steht bei mir im code drin.
aber Trotzdem zählt er in zu grossen schritten und auch nicht in jeder
rastung.
mfg
@ wolfgang (Gast)
>> Ich glaube da fehtl ein volatile int8_t enc_delta;>steht bei mir im code drin.
WAS? Und wieso nicht in dem geposteten Quelltext? Sowas kopiert man
IMMER 1:1 und tippt NICHTS ab! Lies mal was über Netiquette!
MfG
Falk
Na Falk, jetzt nicht mehr Bildformate sondern Netiquette? Ist das
überhaupt ein Wort?
>>Selber schuld, wenn man den Code abtippt, anstatt ihr einfach 1:1 zu>>kopieren.<<
Wer anderen eine Grube gräbt. Mann soll also nett sein und sich auch
noch dumm belehren lassen - was ist hier nur los?
Komm mal langsam wieder runter - das kommt davon wenn man hier zu lange
im Forum ist, das macht krank!
@Wolfgang
Wenn er teilweise springt oder 2 Schritte zählt, liegt das an den
mechanischen Rastungen. Du solltest dann mal den code mit Tabelle
nutzen. Steht auch im tutotrial.
Hast du den code aus dem Tut oder aus dem Thread? Lies mal das tut.
Gruß,
JJ
PS.: wo das springen um 100 her kommt, kann ich nun aus dem stehgreif
auch nicht sagen, bedenke dass der Zähler vorzeichenbehaftet ist!
Guten Morgen,
wenn du den Quelltext richtig kopiert hast und er funktioniert immer
noch nicht wie erwartet guck dir doch mal deinen Hardware Aufbau an.
Bei Längeren Kabeln können Pullup Widerstände helfen.
Gruß Martin
aus dem Artikel:
Im wahren Leben gibt es immer wieder Dinge, welche der Theorie zwar
widersprechen, dennoch weit verbreitet sind. Da machen Drehgeber keine
Ausnahme. Gerade die heute so beliebten Drehgeber für manuelle Bedienung
sind in großer Anzahl von verschiedenen Herstellern verfügbar. Umso
merkwürdiger ist es, dass hier die Rastpunkte oft genau auf dem
Pegelwechsel einer Spur liegen, meist Spur B. So zum Beispiel beim
Drehgeber EC11E15244B2 von Alps, welcher u.a bei Pollin ehältlich ist.
Bei diesem Drehgeber kommt es bei der klassischen, eigentlich soliden
Auswertung zu dem Effekt, dass der Drehgeber in Ruhelage auf einem
Rastpunkt pendeln kann. Damit erhält das Programm sporadisch einen
Schritt vor und zurück. Auch wenn sich die Auswertung daran nicht
verschluckt, so ist dieses Pendeln doch ärgerlich, denn eine
Menusteuerung würde dann komische Sachen machen.
Schau dir mal das zweite Codeposting mit dieser:
int8_t table[16] PROGMEM = {0,0,-1,0,0,0,0,1,1,0,0,0,0,-1,0,0};
Tabelle an.
Springt er um 100 oder vielleicht 127? Wie sieht deine Konvertierung von
int8 auf die serielle ss aus?
JJ
Falk Brunner schrieb:> besser so.>> // Inputs> DDRA &= !((1<<PA1) | (1<<PA3));> PORTA |= (1<<PA1) | (1<<PA3);
Warum sind 4 Bytes mehr Code besser?
Und außerdem ist das falsch.
Der ! Operator liefert nur 0 oder 1.
Peter
wolfgang schrieb:> Aber leider zählt er nicht richtig,pro Rastung> sind manchmal Sprünge von 100 drin.
Das glaube ich Dir nicht. Wo soll die 100 denn herkommen?
Vermutlich ein Ablesefehler, da Du die Ausgaben ohne einen Trenner
aneinander reihst.
Versuch mal:
1
sprintf(encBuffer,"%4d\n",sec);
2
_delay_ms(200);
Rastende Enkoder machen 2 oder 4 Phasenwechsel, nimm also die dazu
passende Auslesefunktion.
Peter
@ Peter Dannegger (peda)
>Warum sind 4 Bytes mehr Code besser?
Lies mal das Original vom OP. Dort wird doppelt gemoppelt Bits
geschoben, nicht wirklich im Sin des Erfinders.
>Und außerdem ist das falsch.>Der ! Operator liefert nur 0 oder 1.
Jaja, Flüchtigkeitsfehler.
Falk Brunner schrieb:> Lies mal das Original vom OP. Dort wird doppelt gemoppelt Bits> geschoben, nicht wirklich im Sin des Erfinders.
Ja, der ist schlichtweg falsch.
Richtig:
1
//Pull-Up einschalten
2
DDRA&=~(1<<PA1);
3
PORTA|=(1<<PA1);
4
DDRA&=~(1<<PA3);
5
PORTA|=(1<<PA3);
Dann sinds 2 CBI und 2 SBI, also 2 Befehle gespart gegenüber IN+ORI+OUT,
IN+ANDI+OUT.
Peter
Guten Morgen
Vielen Dank für eure Hilfe und es lag bei mir doch am Aufbau.
Wenn ich 2Encoder auswerten will muss ich doch für den zweiten Encoder
alle Routienen einen anderen Namen geben auch die im Interrupr, oder bin
ich da jetz falsch.
mfg
@wolfgang (Gast)
>Wenn ich 2Encoder auswerten will muss ich doch für den zweiten Encoder>alle Routienen einen anderen Namen geben auch die im Interrupr,
Ja.
MfG
Falk
>>mit einem Drehencoder<<
so viel zum Thema, die Antworten können nur maximal so präzise sein, wie
die Informationen der Problemstellung...
Na zumindest läufts dann ja jetzt...
JJ