Forum: Mikrocontroller und Digitale Elektronik Problem mit Drehgeber


von Chris W. (squid1356)


Lesenswert?

1
uint8_t encoder = 0;
2
3
//...
4
5
while (1){
6
7
8
    cli();
9
    encoder += enc_delta;
10
    enc_delta = 0;
11
    sei();
12
13
14
    uint8_t s[3];
15
    sprintf (s, "encoder: %3d", encoder);
16
    vfd_cstring(2,s);
17
18
  }

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

von Peter D. (peda)


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

von Steven (. (ovular) Benutzerseite


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).

von Chris W. (squid1356)


Angehängte Dateien:

Lesenswert?

1
#include <io.h>
2
#include <interrupt.h>
3
#include <signal.h>
4
5
6
#define PHASE_A  (PINC & 1<<PINC0)  // PINC.0
7
#define PHASE_B (PINC & 1<<PINC1)  // PINC.1
8
9
10
volatile char  enc_delta;    // -128 ... 127
11
12
13
int main( void )
14
{
15
  TCCR0 = 1<<CS01;      //divide by 8 * 256
16
  TIMSK = 1<<TOIE0;      //enable timer interrupt
17
18
  DDRB = 0xFF;
19
  sei();
20
  // hier eben mein code !!! (s.o.)
21
}
22
23
24
SIGNAL (SIG_OVERFLOW0)
25
{
26
  static char enc_last = 0x01;
27
  char i = 0;
28
29
  if( PHASE_A )
30
    i = 1;
31
32
  if( PHASE_B )
33
    i ^= 3;        // convert gray to binary
34
35
  i -= enc_last;      // difference new - last
36
37
  if( i & 1 ){        // bit 0 = value (1)
38
    enc_last += i;      // store new as next last
39
40
    enc_delta += (i & 2) - 1;    // bit 1 = direction (+/-)
41
  }
42
}



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...

von Falk B. (falk)


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

von Chris W. (squid1356)


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.
1
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:
1
cli();
2
encoder += enc_delta;
3
enc_delta = 0;
4
sei();
...die Variable
1
encoder
  ihren Wert entsprechend dem Drehgeber ändern ??!

von Chris W. (squid1356)


Angehängte Dateien:

Lesenswert?

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

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
Noch kein Account? Hier anmelden.