www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Drehimpulsgeber mit Raststellung immer 00


Autor: tomgr (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

habe hier nen Drehimpulsgeber (noname), der immer in der Raststellung 00
hat.
Dadurch kann ich mit dem hier vorhandenen Code keine Auswertung machen.
(Beitrag "Drehgeber auslesen")

Das Ding zählt halt nur in eine Richtung.

Also, R ist die Raststellung :
links  (R)00 - 01 - 11 - 01 - (R)00
rechts (R)00 - 10 - 11 - 10 - (R)00

Ich bitte mal um ne kleine Hilfe für atmega2561 winavr

gruss tomgr

Autor: Erik D. (dareal)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da gabs hier doch mal ne Tabelle z.B., welche die vier Werte abzählt, 
und dann jeweils zur raststellung auswertet.

Ich glaube ALPS-Drehgeber sind im allgemeinen so ... habe welche von 
Grayhill, die entsprechen genau deinem Schema.

Ich hatte mir slebst eine einfache routine geschrieben, welche von der 
00-Raststellung ausgeht und den ersten Schritt auswertet ... daraufhin 
halt incr. oder decr., und dann wieder warten auf 00-Stellung (was 
jedoch Probleme zwecks Prellen geben kann).

Autor: Michael H* (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
tomgr wrote:
> Dadurch kann ich mit dem hier vorhandenen Code keine Auswertung machen.
doch natürlich. es wird halt nur doppelt oder vier mal so viel gezählt.

Autor: tomgr (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Erik,

kannst du die Routine mal posten ?

gruss tomgr

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
tomgr wrote:
> habe hier nen Drehimpulsgeber (noname), der immer in der Raststellung 00
> hat.

Das ist der Routine doch völlig egal.
Die Routine ist aber für nichtrastende Geber und zählt daher jede 
Flanke.
Wenn er erst nach 4 Flanken rastet, muß man die Auswertung so machen:
  signed char tmp;

  cli();
  tmp = enc_delta;
  enc_delta = tmp & 3;  // bit 1,0 needed for debounce !
  sei();
  value += tmp>>2;


> Dadurch kann ich mit dem hier vorhandenen Code keine Auswertung machen.
> (Beitrag "Drehgeber auslesen")
>
> Das Ding zählt halt nur in eine Richtung.

Dann ist er zu 99,9% falsch angeschlossen.
Es gibt Drehgeber, da ist GND nicht der Mittelpin!


Peter

Autor: tomgr (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Michael,

ja,
wird doppelt gezählt, aber ich bekomme die Richtungsänderung nicht hin.
code :
ISR(INT4_vect)
{
  int8_t nState;
  int8_t nA;
  int8_t nB;
  static uint8_t last_state = 0,last_cnt = 0;
  uint8_t new_state;

  if (nInterrupt4 == FALSE)
  {
    nInterrupt4 = TRUE;

    _delay_us (1500);

     new_state=PINE & (_BV(PINE4) | _BV(PINE3));
  if ((new_state^last_cnt)==(_BV(PINE4) | _BV(PINE3)) )
  {
    if ((new_state ^ last_state)==_BV(PINE4))
      {enc_delta+=1;
    Geber = RECHTS;
    }
    else
      {enc_delta-=1;
    Geber = LINKS;
    }
    last_cnt=new_state;
  }
  last_state=new_state;
    nInterrupt4 = FALSE;
  }

}

gruss tomgr

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
tomgr wrote:
> wird doppelt gezählt, aber ich bekomme die Richtungsänderung nicht hin.
> code :
>
> ISR(INT4_vect)
> ...
>     _delay_us (1500);
> 

Ich bin einfach nur sprachlos!


Wenn Du Dich auf nen Code beziehst, dann nimm ihn auch gefälligst.
Ich hab nämlich keine Lust, in den Wind zu reden.


Peter

Autor: Michael H* (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@tomgr,
peter hat verständlicher weise etwas gegen ewige wartezeiten in 
interrupt-routinen und muss das ein paar mal pro woche bemängeln. es ist 
einfach ein no-go.
nimms ihm nicht übel, er hat nämlich recht damit ^^

was soll das delay denn hier bewirken? nimms am besten mal raus.

warum nimmst du nicht einfach genau diesen code hier? er ist praktisch 
bullet-proof:
Beitrag "Re: Drehgeber auslesen"

Autor: tomgr (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Peter,

ist eine vorhanden Platine mit dem Geber.
Masse ist auf Mittelpin, A und B sind aussen.


gruss tomgr

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ tomgr (Gast)

ISR(INT4_vect)
{

    _delay_us (1500);


Literturtip des Tages: Interrupt.

@ Peter Dannegger (peda)

>Ich bin einfach nur sprachlos!

 . . . the answer my friend, is blown' in the wind . . . ;-)

MFG
Falk

Autor: tomgr (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute,
mal immer druff auf nen Anfänger.

Ich versuche nur einen vorhanden Code an meinen "komischen" 
Drehimpulsgeber anzupassen, und habe höflich um Hilfe gebeten, mehr 
nicht.

gruss tomgr

Autor: Michael H* (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
nana, war doch wirklich nicht ruppig hier. und dein encoder ist auch 
nicht "komisch".
füg den code aus Beitrag "Re: Drehgeber auslesen" 1:1 ein 
und pass nur deine pins und den timer an. irgendwo ne ausgabe für den 
aktuellen stand und mehr nicht.
dann wirst du pro raster eine änderung um 4 feststellen.

ansonsten zu empfehlen ist Drehgeber

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
tomgr wrote:
> mal immer druff auf nen Anfänger.

Auch ein Anfänger muß wissen, daß wenn er explizit einen Link auf einen 
Code referenziert, sich dann auch die Antworten auf diesen beziehen.


> Ich versuche nur einen vorhanden Code an meinen "komischen"
> Drehimpulsgeber anzupassen, und habe höflich um Hilfe gebeten, mehr
> nicht.

Du hast dann später irgend ein völlig anderes von weiß woher Blech 
gepostet, daß sich die Balken biegen.
Besser kann man demjenigen, der sich Mühe gibt Dir zu helfen, wirklich 
nicht in den Arsch treten.


Der richtige Code ist ja schon etwas älter, aber SIGNAL durch ISR 
ersetzt, sollte er immer noch funzen.
Und dann eben, wie oben angegeben, die Entprellbits maskieren, /4 
teilen, fertig ist die Laube.


Peter

Autor: tomgr (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute,

wie gesagt, bin Anfänger !

Im Beitrag von Peter war ein Link auf drehgeber 00 - 11 .
Auch wollte ich hier keinen in den "Arsch treten" !
OK, habe den Fehler begangen, den Code nicht gleich mit zu posten.

gruss tomgr

Autor: tomgr (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

habe es hinbekommen, aber durch die "Brust ins Auge" !
Bin halt Anfänger !
ISR(INT4_vect)
{
  static uint8_t last_state = 0,last_cnt = 0;
  uint8_t new_state;

  if (nInterrupt4 == FALSE)
  {
    nInterrupt4 = TRUE;

     new_state=PINE & (_BV(PINE4) | _BV(PINE3));
  if ((new_state^last_cnt)==(_BV(PINE4) | _BV(PINE3)) )
  {
    if ((new_state ^ last_state)==_BV(PINE4))
      {enc_delta+=1;
    Geber = RECHTS;
    last_cnt=last_state;
    }
    else
      {enc_delta-=1;
    Geber = LINKS;
    last_cnt=new_state;
      }
  }
 last_cnt=new_state;
  if (last_cnt == 16)
  last_cnt=24;

  if (last_cnt == 0)
  last_cnt=8;
    nInterrupt4 = FALSE;
  }
}

und bitte nicht mehr "hauen".

danke trotzdem für Eure Hilfe,
und ich weiss, der Code ist sch..., aber es geht in der Anwendung.

gruss tomgr

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.