Drehgeber überspringt mehrere Werte

#5667892
Lesenswert?

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
Angehängte Dateien:
#5667997
Lesenswert?

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!
#5668011
Lesenswert?

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;
Beitrag #5668021 wurde von einem Moderator gelöscht.
#5668022
Lesenswert?

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;
#5668150
Lesenswert?

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.
Angehängte Dateien:
#5668195
Lesenswert?

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);
Gast #5668964
Lesenswert?

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.
#5669322
Lesenswert?

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.
#5669476
Lesenswert?

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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren