Problem mit Drehgeber

OP #986795
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
OP #986998
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...
Angehängte Dateien:
#987011
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
OP #987299
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 ??!

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