www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Problem mit Drehgeber


Autor: Chris W. (squid1356)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
uint8_t encoder = 0;

//...

while (1){


    cli();
    encoder += enc_delta;
    enc_delta = 0;
    sei();


    uint8_t s[3];
    sprintf (s, "encoder: %3d", encoder);
    vfd_cstring(2,s);

  }

Hi!

Ich benutze auch den Drehgeber-Code von Peter Dannegger ( Code ganz
oben, die zweite!)

wie in dem letzten Beispiel wird auch die enc_delta benutzt um den
zähler [c]uint8_t encoder = 0;[/] hoch bzw. runter zu zählen.

leider springt der wert aber nur zw. 0 und 255 bei linksdrehung und
zwischen 0 und 1 bei rechtsdrehung.

ich habe mir nun schon einige beispiele hier angesehen und beiträge
gelesen, stehe aber leider auf dem schlauch. kann mir jemand helfen bzw.
einen tip geben?? (ps. ich benutze einen drehgeber OHNE rastung)

Danke, Christoph

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Christoph Weidenhaupt wrote:
> leider springt der wert aber nur zw. 0 und 255 bei linksdrehung und
> zwischen 0 und 1 bei rechtsdrehung.

- falsch angeschlossen
- Pullups fehlen
- Drehgeber kaputt (mal beide Inputs auf LEDs ausgeben).


Peter

Autor: Steven () (ovular) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie hast du denn dein Encoder angeschlossen und welchen µC verwendest 
du?
Am besten noch den Link zum Programm.

MfG Steven

Edit: Odda so (Peda).

Autor: Chris W. (squid1356)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
#include <io.h>
#include <interrupt.h>
#include <signal.h>


#define PHASE_A  (PINC & 1<<PINC0)  // PINC.0
#define PHASE_B (PINC & 1<<PINC1)  // PINC.1


volatile char  enc_delta;    // -128 ... 127


int main( void )
{
  TCCR0 = 1<<CS01;      //divide by 8 * 256
  TIMSK = 1<<TOIE0;      //enable timer interrupt

  DDRB = 0xFF;
  sei();
  // hier eben mein code !!! (s.o.)
}


SIGNAL (SIG_OVERFLOW0)
{
  static char enc_last = 0x01;
  char i = 0;

  if( PHASE_A )
    i = 1;

  if( PHASE_B )
    i ^= 3;        // convert gray to binary

  i -= enc_last;      // difference new - last

  if( i & 1 ){        // bit 0 = value (1)
    enc_last += i;      // store new as next last

    enc_delta += (i & 2) - 1;    // bit 1 = direction (+/-)
  }
}



hoffe das reicht...

>Peter:
>... Drehgeber kaputt
Würde sagen das Oszi bild sieht ok aus, leider habe ich nur nen Analog 
oszi ohne speicher, kann das also nicht sooo gut beurteilen...

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Christoph Weidenhaupt (squid1356)

>Dateianhang: dreh.png (1,5 KB, 1 Downloads)

Sieht OK aus, aber

>#define PHASE_A  (PINC & 1<<PINC0)  // PINC.0
>#define PHASE_B (PINC & 1<<PINC1)  // PINC.1

Hier steht PINC, in deinem Schaltplan PINB?!?

>Würde sagen das Oszi bild sieht ok aus, leider habe ich nur nen Analog
>oszi ohne speicher, kann das also nicht sooo gut beurteilen...

Ein Multimeter oder zwei LEDs reichen. Klemm die mit Vorwiderstand 
parallel zu den 10K. UNd dreh mal langsam mit festgehaltenem Drehgeber.

MFG
Falk

Autor: Chris W. (squid1356)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Falk Brunner wrote:
>...
>>#define PHASE_A  (PINC & 1<<PINC0)  // PINC.0
>>#define PHASE_B (PINC & 1<<PINC1)  // PINC.1
> Hier steht PINC, in deinem Schaltplan PINB?!?

ach, verdammt, der schaltplan ist falsch PINC ist natürlich richtig.
wie oben beschrieben: der drehgeber arbeitet auch.
enc_delta
 auf meinem display ausgegeben gibt mir ja ein "+1" bei rechts- und ein 
"-1" bei linksdrehung. das scheint mir doch ok zu sein??

wenn ich da nicht verkehrt liege müßte doch dann mit folgenden Zeilen:
cli();
encoder += enc_delta;
enc_delta = 0;
sei();
...die Variable
encoder
  ihren Wert entsprechend dem Drehgeber ändern ??!

Autor: Chris W. (squid1356)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
....hier jetzt also noch der korrigierte Plan. Hängt übrigens am STK500 
Entwicklerboard.

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.