Hallo zusammen, ich habe ein Problem bei der Anwendung des bewährten Codes aus dem bewährten Codes von P. Dannegger: Solide Lösung: Beispielcode in C https://www.mikrocontroller.net/articles/Drehgeber. Ich musste den Code etwas umschreiben, da ich als Compiler Codevision benutze und einen Atmega328 anstatt des Atmega8 und bin mir nicht sicher, ob ich es richtig angepasst habe. Wahrscheinlich nicht, weil ich das Problem habe, dass der Zähler meistens gleich 2 oder 4 Werte hoch und runterzählt, selten eben nur einen Wert, wie es sein sollte. Der Drehgeber ist der Klassiker von ALPs (Stec11B09). Ich benutze den internen 8Mhz Takt des µC. Ich habe im Layout leider die externen Pullups vergessen, aber laut anderer Erfahrungsberichten benötigt man diese ja auch nicht unbedingt. Hatte hier jmd. schon mal ein ähnliches Problem und kann mir eine Tipp geben, das Problem zu lösen? Vielen Dank schon mal, Michael
Michael F. schrieb: > Ich musste den Code etwas umschreiben, da ich als Compiler Codevision > benutze Ja und? das ist normales C, da muss man nix ändern, bestenfalls die cli() und sei() Funktionen. >und einen Atmega328 anstatt des Atmega8 und bin mir nicht > sicher, ob ich es richtig angepasst habe. Wahrscheinlich nicht, weil ich > das Problem habe, dass der Zähler meistens gleich 2 oder 4 Werte hoch > und runterzählt, selten eben nur einen Wert, wie es sein sollte. Möglicherweise ist dein Drehgeber falsch angeschlossen. Wenn man einen der Kanäle mit GND vertauscht, ergibt das diesen Effekt. > Der Drehgeber ist der Klassiker von ALPs (Stec11B09). Ich benutze den > internen 8Mhz Takt des µC. Ich habe im Layout leider die externen > Pullups vergessen, aber laut anderer Erfahrungsberichten benötigt man > diese ja auch nicht unbedingt. Man muss dann aber die internen einschalten. Außerdem kann man auch externe nachrüsten, auch wenn die im Layout fehlen!
Falk B. schrieb: > Möglicherweise ist dein Drehgeber falsch angeschlossen. Wenn man einen > der Kanäle mit GND vertauscht, ergibt das diesen Effekt. Die Anschlüsse habe ich eben überprüft. Müsste schon so passen. Ich habe den mittleren Pin mit GND verbunden und die beider anderen sind am Port PD2 und PD3. Falk B. schrieb: > Man muss dann aber die internen einschalten. Außerdem kann man auch > externe nachrüsten, auch wenn die im Layout fehlen! Habe ich das nicht hiermir gemacht? DDRD.3=1; PORTD.3=1; DDRD.2=1; PORTD.2=1;
Michael F. schrieb: > Habe ich das nicht hiermir gemacht? > > DDRD.3=1; > PORTD.3=1; > DDRD.2=1; > PORTD.2=1; Nö. Du hast die Pins D2 und D3 als Ausgänge definiert und auf High gesetzt. Dein Drehgeber schliesst jetzt die Ausgänge gegen Masse kurz.
Beitrag #5668021 wurde von einem Moderator gelöscht.
Michael F. schrieb: > Falk B. schrieb: >> Möglicherweise ist dein Drehgeber falsch angeschlossen. Wenn man einen >> der Kanäle mit GND vertauscht, ergibt das diesen Effekt. > > Die Anschlüsse habe ich eben überprüft. Müsste schon so passen. Wirklich? Wie sieht dein Datenblatt aus? https://www.alps.com/prod/info/E/HTML/Encoder/Incremental/EC11/EC11B15202AN.html > den mittleren Pin mit GND verbunden und die beider anderen sind am Port > PD2 und PD3. > > Falk B. schrieb: >> Man muss dann aber die internen einschalten. Außerdem kann man auch >> externe nachrüsten, auch wenn die im Layout fehlen! > > Habe ich das nicht hiermir gemacht? > > DDRD.3=1; > PORTD.3=1; > DDRD.2=1; > PORTD.2=1; Man muss die Bits im DDR-Register aus 0 setzen, damit der IO-Pin zum Eingang wird! Den Pull-Up schaltet man dann mit dem Port-Bit = 1 ein, das ist OK. Also eher so. DDRD.3=0; PORTD.3=1; DDRD.2=0; PORTD.2=1;
Was mir bei den Code auch nicht klar ist, welchen Art des Encoders ich eigentlich nun verwende. Es gibt ja anscheinend single/two...step-encoders. Was ist denn damit gemeint?
Michael F. schrieb: > Was mir bei den Code auch nicht klar ist, welchen Art des Encoders ich > eigentlich nun verwende. Es gibt ja anscheinend > single/two...step-encoders. > Was ist denn damit gemeint? Damit ist gemeint, wieviele elektrische Schritte der Encoder pro mechanischem Schritt (Rastung) macht.
Falk B. schrieb: > Damit ist gemeint, wieviele elektrische Schritte der Encoder pro > mechanischem Schritt (Rastung) macht. OK, dann habe ich einen "single step"-encoder, da er so beschrieben ist: 20 Impulse / 20 Rastungen Falk B. schrieb: > Man muss die Bits im DDR-Register aus 0 setzen, damit der IO-Pin zum > Eingang wird! Den Pull-Up schaltet man dann mit dem Port-Bit = 1 ein, > das ist OK. Also eher so. > > DDRD.3=0; > PORTD.3=1; > DDRD.2=0; > PORTD.2=1; OK, das habe ich umgesetzt, leider bleibt das Verhalten identisch. Falk B. schrieb: > Wirklich? Wie sieht dein Datenblatt aus? Ich denke schon, anbei habe ich den Schaltplanteil angefügt.
Dann passt da entweder was mit den Interrupts und der Ausführungszeit nicht oder die Decoderausgänge werden durch eine Dämpfung zu stark gefiltert, um alle Flanken mitzubekommen.
M. W. schrieb: > Dann passt da entweder was mit den Interrupts und der Ausführungszeit > nicht oder die Decoderausgänge werden durch eine Dämpfung zu stark > gefiltert, um alle Flanken mitzubekommen. Du meinst hier bei der hier bei der Initialisierung des Timers? Wegen der Taktfrequenz bin ich mir nicht sicher, ob der Timer hier von 8Mhz ausgeht. //********************************************************************* // Timer/Counter 0 initialization BY THE WIZARD // Clock source: System Clock // Clock value: 250.000 kHz // Mode: CTC top=OCR0A // OC0A output: Disconnected // OC0B output: Disconnected // Timer Period: 1 ms @ 8MHz? TCCR0A=(0<<COM0A1) | (0<<COM0A0) | (0<<COM0B1) | (0<<COM0B0) | (1<<WGM01) | (0<<WGM00); //TCCR0A=(0<<COM0A1) | (0<<COM0A0) | (0<<COM0B1) | (0<<COM0B0) | (1<<WGM01) | (0<<WGM00); TCCR0B=(0<<WGM02) | (0<<CS02) | (1<<CS01) | (1<<CS00); TCNT0=0x00; OCR0A=0xF9; OCR0B=0x00; // Timer/Counter 0 Interrupt(s) initialization TIMSK0=(0<<OCIE0B) | (1<<OCIE0A) | (0<<TOIE0);
Michael F. schrieb: > kann mir eine Tipp geben, das Problem zu lösen? Hast du mal mit einem 2-Kanal Oszi die Pegel und die zeitlichen Spannungsverläufe an den beiden Pins angesehen? Oder mangels Oszilloskop mal wenigstens die Pegel mit dem Multimeter nachgemessen?
Lothar M. schrieb: > Oder mangels Oszilloskop mal wenigstens die Pegel mit dem Multimeter > nachgemessen? Die Pegel passen, habs mit dem Mulitmeter nachgemessen.
Michael F. schrieb: > Die Pegel passen Dann ist noch der zeitliche Ablauf interessant. Denn nur, wenn du weißt, was du auswerten willst, kannst du dir Gedanken machen, wie du das auswerten kannst. Aber da wäre ein Oszi tatsächlich hilfreich. Bald ist Weihnachten... ?
Lothar M. schrieb: > Dann ist noch der zeitliche Ablauf interessant. Denn nur, wenn du weißt, > was du auswerten willst, kannst du dir Gedanken machen, wie du das > auswerten kannst. Aber da wäre ein Oszi tatsächlich hilfreich. Bald ist > Weihnachten... ? Ich kann leider morgen erst an mein Oszi, bin nur leider akutell räumlich getrennt zur Zeit.
Lothar schulmeisterte: > Denn nur, wenn du weißt, > was du auswerten willst, kannst du dir Gedanken machen, wie du das > auswerten kannst. https://www.youtube.com/watch?v=DetDKNSyQTI
Probiers doch erstmal mit dem nOOb-Algorithmus nach dem Schema "wenn A steigt und B high, dann hochzählen, sonst runter blabla.." Manche kennen ja nix anderes. ;-)
samstag schrieb: > Probiers doch erstmal mit dem nOOb-Algorithmus nach dem Schema > "wenn A steigt und B high, dann hochzählen, sonst runter blabla.." Warum sollte er vorsätzlich fehlerträchtig auswerten, nur damit er sich über hin- und herspringende Werte nicht wundert ?
Na um seine Konfiguration zu testen. An Pedas Algorithmus liegts jedenfalls nicht, das kann ich schonmal verraten.
Ich denke es ist ein "Four Step Encoder"! Zwei Flanken bei PIN A und zwei bei Pin B zwischen den gestrichelten Linien, den Rastpunkten. Gerhard
Gerhard schrieb: > Ich denke es ist ein "Four Step Encoder"! Zwei Flanken bei PIN A und > zwei bei Pin B zwischen den gestrichelten Linien, den Rastpunkten. Es funktioniert! Ist ja fast wie vorgezogene Weihnachten! Ich dachte das wäre ein single-step endocer, weil in der Beschreibung das hier steht: 20 Impulse / 20 Rastungen
Michael F. schrieb: > Ich dachte das wäre ein single-step endocer, weil in der Beschreibung > das hier steht: 20 Impulse / 20 Rastungen Wobei es ja wirklich keinen Aufwand bedeuten würde einmal alle Möglichkeiten durchzuprobieren. So viele sind es ja dann doch nicht. Wäre jedenfalls schneller als hier im Forum zu fragen und stunden-/tagelang auf eine Lösung zu warten.
Sorry, war meine Schuld. Aber meistens liegen solche Problemen nun mal im Trivialen. Ich habe nur die one und two step Variante ausprobiert.
Michael F. schrieb: > Sorry, war meine Schuld. Aber meistens liegen solche Problemen nun mal > im Trivialen. Ich habe nur die one und two step Variante ausprobiert. so gings mir zu Anfang auch, aber ich probierte alle Versionen bis es beim Gerhard schrieb: > "Four Step Encoder" funktionierte :) Dumpf Backe schrieb: > Wobei es ja wirklich keinen Aufwand bedeuten würde einmal > alle Möglichkeiten durchzuprobieren. So viele sind es ja > dann doch nicht. hihi, stimmt, ich probierte auch lieber als auf Antwort zu warten.
Michael F. schrieb: > Gerhard schrieb: >> Ich denke es ist ein "Four Step Encoder"! Zwei Flanken bei PIN A und >> zwei bei Pin B zwischen den gestrichelten Linien, den Rastpunkten. > > Es funktioniert! Ist ja fast wie vorgezogene Weihnachten! > > Ich dachte das wäre ein single-step endocer, weil in der Beschreibung > das hier steht: 20 Impulse / 20 Rastungen Auch bei richtigen Drehgebern wird die Auflösung immer für Single Abtastung angegeben. Bei Quad Abtastung, also jede Zustandsänderung zählen ist dann immer das 4 fache.
Christian R. schrieb: > Auch bei richtigen Drehgebern wird die Auflösung immer für Single > Abtastung angegeben. Bei Quad Abtastung, also jede Zustandsänderung > zählen ist dann immer das 4 fache. Äh wie Quad-Abtastung, das hab ich jetzt nicht verstanden. Kannst du das bitte mal erklären?
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.