www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Drehgeber auslesen


Autor: Boris Hightech (Firma: omfbv) (hightech75)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo mitteinander,
ich habe hier einen EC11B Drehgeber an einem ATMEGA8

PB1=A
PB0=B
werden gegen Masse gezogen

if  ((PINB&(1<<PB1))==0) //Wenn A auf 0 geht (R oder L drehen)
   {
   if ((PINB&(1<<PB0))==1) ++out; //Wenn A=0 und B=1 erhöhe out
   if ((PINB&(1<<PB0))==0) --out; //Wenn A=0 und B=0 erniedrige out

  while ((PINB&(1<<PB1))==0)lcd_send(out);//Warte so lange bis A wieder 
1 ist
   }
Scheint mir eine gute Lösung zu sein, funktioniert bei mir gut und 
schnell.
Die anderen Lösungen scheinen sehr umständlich zu sein. Die Int braucht 
man auch meistens für was anderes.
Hab ich da was übersehen ??

Gruß
Boris
(Anfänger, geringe C Kenntnisse)

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Hab ich da was übersehen ??

Evtl. das Tutorial http://www.mikrocontroller.net/articles/Drehgeber

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Boris Hightech schrieb:

> Hab ich da was übersehen ??

Das die Kontakte im Drehgeber irgenwann anfangen werden zu prellen.

Autor: Boris Hightech (Firma: omfbv) (hightech75)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Prellen spielt ja hier keine große Rolle da ja hier auf die Flanken 
geschaut wird. D.h. Wenn A auf 0 geht tut sich was, und dann tut sich 
erst wieder was nachdem A auf 1 war.
Im schlimmsten Fall zählt er mal 2 statt 1 und das ist bei einem Hand 
bedienten Drehgeber ja nicht so schlimm.

Autor: Boris Hightech (Firma: omfbv) (hightech75)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nochmal ganz in kurz:
#define A ((PINB&(1<<PB1))==0)
#define B ((PINB&(1<<PB0))==0)

if  A
    {
    if B ++out;
  else --out;
    lcd_send(out);
  while A;
    }
kürzer gehts nimmer

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>...while A;
>    }
>kürzer gehts nimmer

Länger aber auch nicht.

MfG Spess

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Boris Hightech schrieb:
> Prellen spielt ja hier keine große Rolle da ja hier auf die Flanken
> geschaut wird. D.h. Wenn A auf 0 geht tut sich was, und dann tut sich
> erst wieder was nachdem A auf 1 war.

Du möchtest dich eventuell mal darüber informieren, wie sich Prellen an 
den überwachten Portpins auswirkt. Du drehst um 1 Rastung weiter, dein 
Programm sieht aber mehrere 0-1-0-1-0-1 Übergänge, bis sich der Wert 
dann endlich auf 1 stabilisiert hat. Sprich: Deine 'while(A);' Schleife 
ist nutzlos gegenüber Prellen.

> Im schlimmsten Fall zählt er mal 2 statt 1 und das ist bei einem Hand
> bedienten Drehgeber ja nicht so schlimm.

Wenn ich so ein Teil vor mir habe und ich drehe um 1 Rastung und der 
Wert verändert sich einmal um 1, dann um 5, dann um 3 und zu guter letzt 
bei der nächsten Rastung um 4; weißt du was ich dann mit dem Teil mache?

Autor: Vlad Tepesch (vlad_tepesch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
beschreibs mal ausführlich ;-P

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vlad Tepesch schrieb:
> beschreibs mal ausführlich ;-P

...
dann geh ich in mein Werkzeugkammerl und hole den grossen 
Vorschlaghammer. Meine Freundin hat dann ob meiner Schimpftiraden auf 
den Programmierer wieder eine Menge zu lachen  ...

:-)

Autor: Boris Hightech (Firma: omfbv) (hightech75)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jaaaa....
aber....
wenn der Eingang etwas sieht, dann folgt ja auch erstmal eine Aktion, 
wie z.B. Ausgabe des Wertes auf das Display lcd_send(out), des dauert ja 
auch mal nen paar ms, dann ist das Prelle ja eh vorbei.
Und während dessen tut er ja auch nix vom Port einlesen. Erst wenn die 
Aktion beendet ist, gehts ja weiter mit while A

Autor: Hannes Lux (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> aber....
> wenn der Eingang etwas sieht, dann folgt ja auch erstmal eine Aktion,
> wie z.B. Ausgabe des Wertes auf das Display lcd_send(out), des dauert ja
> auch mal nen paar ms, dann ist das Prelle ja eh vorbei.

Nööö...

Wenn Du so programmierst, dass die Ausgabe sofort (ohne Veratbeitung) 
der Eingabe folgt, dann machst Du was verkehrt.

Eingaben wie Taster und Drehgeber fragt man zyklisch (durch Timer-Int 
synchronisiert) ab und sichert deren Werte global. Die Mainloop (oder 
eines ihrer Module) prüft dann (bei passender Gelegenheit) diese Werte, 
reagiert darauf und entwertet (löscht) sie.

...

Autor: Boris Hightech (Firma: omfbv) (hightech75)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du meinst ich soll in den Timer int schreiben: gucke mal alle Ports nach 
wo Taster / Drehgeber dran hängen ?
Z.b. so alle 1ms 1 mal gucken ?

Autor: Hannes Lux (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Du meinst ich soll in den Timer int schreiben: gucke mal alle Ports nach
> wo Taster / Drehgeber dran hängen ?
> Z.b. so alle 1ms 1 mal gucken ?

Im Prinzip ja, nur nicht so primitiv, wie Du es darstellst. Schau doch 
einfach mal ins Tutorial, da gibt es recht effiziente Algorithmen für. 
Da ich kein C kann (ich werkele in ASM), kann ich Dir keine konkreten 
C-Tips geben. Aber das Abfragen von manuell betätigten Drehgebern und 
Entprellen von Tastern benötigt bei halbwegs effizientem Code nicht viel 
mehr als 1% der AVR-Rechenleistung.

...

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Boris Hightech schrieb:

> wenn der Eingang etwas sieht, dann folgt ja auch erstmal eine Aktion,
> wie z.B. Ausgabe des Wertes auf das Display lcd_send(out), des dauert ja
> auch mal nen paar ms, dann ist das Prelle ja eh vorbei.

Genau das ist es, was deinen Code momentan rettet.
Nur was, wenn ich eben nicht auf ein LCD ausgebe, sondern zb den counter 
einfach nur auf einen Port rausgebe (weil dort zb ein paar LED sitzen)?

Es ist unklug, eine Routine als das beste seit geschinttenem Brot 
anzupreisen, die nur dann funktioniert, wenn man mitten drinn eine 
Zahl-ASCII Umwandlung samt LCD-Ausgabe machen muss, damit sie 
funktioniert :-)

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Boris Hightech schrieb:
> wenn der Eingang etwas sieht, dann folgt ja auch erstmal eine Aktion,
> wie z.B. Ausgabe des Wertes auf das Display lcd_send(out), des dauert ja
> auch mal nen paar ms, dann ist das Prelle ja eh vorbei.

Mit dieser Einstellung wirst Du schnell Schiffbruch erleiden.

Man kann nicht vernünftig programmieren, wenn die Mainloop nur eine ganz 
bestimmte Durchlaufzeit haben darf (zu kurz -> Preller, zu lang -> 
Impulsverlust).

Wenn die Programme auch nur etwas größer werden sollen und wenn man 
nicht bei jedem Projekt total von Null anfangen will, muß man so 
programmieren, daß die einzelnen Tasks sich nicht gegenseitig stören.

Man programmiert eine Task und dann vergißt man sie. D.h. nachdem sie 
funktioniert, verwendet man sie nur noch.


Peter

Autor: Christian H. (netzwanze) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Noch was:
Was passiert in Deinem Programm, wenn A zwar auf 0, nicht jedoch wieder 
auf 1 springt?

Um das Programm weiter laufen zu lassen, ist dann erstmal ein kleiner 
Schups am Drehgeber notwendig (so wie man auf ein Barometer klopft).

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.