Forum: Compiler & IDEs Drehimpulsgeber einlesen / auswerten


von Florian K. (flo7)


Lesenswert?

Hallo!
Ich weiß, dass es einige Beiträge zur Auswertung von Drehimpulsgebern 
hier gibt, die bei mir allerdings nicht funktionieren. Der Fehler liegt 
wahrscheinlich ca. 30cm vor dem Bildschirm, wie ihr euch sicherlich 
vorstellen könnt.

Ich kenn mich leider nicht allzu gut damit aus, und hoffe nun auf eure 
Hilfe.

Ich verwende den Drehimpulsgeber: ALPS STEC12E von Reichelt und einen 
ATmega8.

Ich habe bereits herausgefunden, dass der Drehgeber 2 Signale ausgibt, 
besser 2 Flanken ausgibt (A und B). Wenn man nun dreht, und die die 
Flanke A vor der Flanke B kommt, ist es eine linksdrehung, umgekehrt 
eine rechtsdrehung.

Nun will ich durch eine rechtsdrehung einen bestimmten Wert erhöhen, und 
durch eine Linksdrehung den Wert natürlich wieder erniedrigen.

A hängt am PORTB4 und B hängt am PORTB4 vom ATmega8.

Gesamtziel wäre es dann, den Phasenwinkel eines PWM-Signals mittels 
diesem Drehimpulsgeber zu variieren.

Nun such ich einen Ansatz, wie ich diesen Drehimpulsgeber mit 24 
Impulsen einlesen bzw. auswerten kann.

Danke im Voraus

gruß, Flo

von Falk B. (falk)


Lesenswert?

Siehe Artikel Drehgeber. War jetzt wirklich schwer zu finden . . .

von Florian K. (flo7)


Lesenswert?

Da war ich schon ;)

Nur mein Timer0 lässt sich nicht initialisieren...

von Michael H. (michael_h45)


Lesenswert?

> Nur mein Timer0 lässt sich nicht initialisieren...
1. dann sag das doch gleich und mach einen beitrag mit entsprechendem 
betreff auf...
2. ich glaube eher, dass er sich sehr wohl initialisieren lässt und 
vielmehr du etwas falsch machst.

von Florian K. (flo7)


Lesenswert?

Vielleicht gibts ja noch einen anderen Ansatz, deshalb mein neuer 
Beitrag mit den ganzen Infos.

Michael H. schrieb:
> 2. ich glaube eher, dass er sich sehr wohl initialisieren lässt und
> vielmehr du etwas falsch machst.

Das ist mir auch klar, nur will ich rausfinden was es ist.
Das ich offensichtlich irgendwas falsch mache weiß ich ja.

von Matthias L. (mcl024)


Lesenswert?

Poste doch mal deinen Code

von Guru (Gast)


Lesenswert?

Es ist ja lobenswert das Du den Fehler im Programm erstmal bei Dir 
suchst und Du bist wahrscheinlich sehr genervt und gestresst und hast 
deswegen nicht gemerkt, dass Du Dir selbst widersprichst:

Entweder Du:
1. Suchst das Problem bei der Timerinitialisierung
oder
2. Du suchst einen ganz anderen Ansatz ohne Timer, den Du ja nicht zum 
laufen kriegst.

Aber gleichzeitig:
>Vielleicht gibts ja noch einen anderen Ansatz
UND
>nur will ich rausfinden was es ist.
geht nicht und dann hätte die Information gefehlt, das kein Timer 
verwendet werden darf.

Ich würde Dir vorschlagen, mal ganz tief durchzuatmen, eine Nacht 
darüber zu schlafen und Dir morgen nochmal das Timerproblem anzugucken 
und uns dann bezüglich dieses Problems zu fragen.

Einen anderen Ansatz zu wählen wenn garnicht der Ansatz falsch ist 
sondern die Realisierung Schwierigkeiten macht bringt Dich nicht weiter.

von Michael H. (michael_h45)


Lesenswert?

Matthias Laubnitz schrieb:
> Poste doch mal deinen Code
Sicher? Meinst du wirklich, das muss sein?

von Florian K. (flo7)


Lesenswert?

Guru schrieb:
> Es ist ja lobenswert das Du den Fehler im Programm erstmal bei Dir
> suchst und Du bist wahrscheinlich sehr genervt und gestresst

ich kann dir gar nicht sagen wie recht du hast!

Ich werds wohl besser für heute gut sein lassen anstatt mich verzweifelt 
hier an dieses forum zu klemmen.

von Mücke (Gast)


Lesenswert?

Abend : )

ich habe den gleichen Encoder wie du und hatte auch das Problem, dass er 
nicht funktioniert hat, mit den Programmen die hier zu finden sind, ich 
poste dir mal den Beitrag und das Program welches definitiv läuft : )

Beitrag "Drehcoder ALPS Stec12E08 will nicht"
1
#define XTAL        8e6                 // 8MHz
2
 
3
#define PHASE_B     (PIND & 1<<PD6)     // an Pinbelegung anpassen
4
#define PHASE_A     (PIND & 1<<PD4)     // an Pinbelegung anpassen
5
6
volatile int8_t enc_delta;              // Drehgeberbewegung zwischen
7
                                        // zwei Auslesungen im 
8
9
int8_t table[16] PROGMEM = {0,0,-1,0,0,0,0,1,1,0,0,0,0,-1,0,0};    //halb
10
11
12
ISR( TIMER0_COMP_vect )             // 1ms fuer manuelle Eingabe
13
{
14
    static int8_t last=0;           // alten Wert speichern
15
 
16
    last = (last << 2)  & 0x0F;
17
    if (PHASE_A) last |=2;
18
    if (PHASE_B) last |=1;
19
    enc_delta += pgm_read_byte(&table[last]);
20
}
21
22
void encode_init( void )            // nur Timer 0 initialisieren
23
{
24
  TCCR0 = (1<<WGM01) | (1<<CS01) | (1<<CS00);     // CTC, XTAL / 64
25
  OCR0 = (uint8_t)(XTAL / 64.0 * 1e-3 - 0.5);       // 1ms
26
  TIMSK |= 1<<OCIE0;
27
}
28
int8_t encode_read( void )         // read two step encoders
29
{
30
  int8_t val;
31
 
32
  cli();
33
  val = enc_delta;
34
  enc_delta = val & 1;
35
  sei();
36
  return val >> 1;
37
}
38
39
int main (void)
40
  {
41
  encode_read();
42
  while (1) 
43
  {
44
  val += encode_read(); 
45
  }
46
}

wenn du noch fragen hast kann ich dir gern helfen...

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.