Forum: Mikrocontroller und Digitale Elektronik Drehgeber Forums-Lib Verständnisproblem


von Marvin H. (marvin_h)


Lesenswert?

Hallo zusammen,

Ich experimentiere gerade mit einem Drehgeber von Alps.
Dazu verwende ich einen ATmega32 und die C-Lib hier aus der 
Code-Sammlung: http://www.mikrocontroller.net/articles/Drehgeber
Ich verwende die Lib mit wackeligem Rastpunkt.

Allerdings habe ich noch ein paar Verständnisfragen, auf die ich keine 
Antworten im Internet gefunden habe.

1.
Beim Timer-Interrupt wird diese Abfrage ausgeführt:
1
    last = (last << 2)  & 0x0F;
2
    if (PHASE_A) last |=2;
3
    if (PHASE_B) last |=1;
Was geschieht hier genau mit der Variable "last" ?

2.
Was hat es mit dieser Tabelle auf sich?
1
const int8_t table[16] PROGMEM = {0,0,-1,0,0,0,0,1,1,0,0,0,0,-1,0,0};

Und wie ist der zusammenhang zu diesem aufruf?
1
enc_delta += pgm_read_byte(&table[last]);

Hoffe Ihr könnt mir helfen.

Gruß und guten Rutsch!
Marvin

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Marvin H. schrieb:
> last |=1;
> Was geschieht hier genau mit der Variable "last" ?

x |= y;

entspricht

x = x | y;

enc_delta += pgm_read_byte(&table[last]);

kann --der einfachheit halber-- als

enc_delta += table[last];

gelesen werden. Hier aber wird auf die Harvard-Eigenschaft des AVR 
Rücksicht genommen, der ohne Klimmzüge nicht auf Konstanten im Flash-ROM 
zugreifen kann, und die Tabelle wird, um RAM zu sparen, im Flash-ROM 
abgelegt.

von Marvin H. (marvin_h)


Lesenswert?

Danke für die Antwort!

Rufus Τ. Firefly schrieb:
> x |= y;
>
> entspricht
>
> x = x | y;

Was bedeutet x | y ? "Oder" wäre ja "||" ?!

Und dann noch :
1
last = (last << 2)  & 0x0F;

Welche bedeutung hat (last << 2) & 0x0F ?

Sorry für die vllt. blöde fragen, habe aber mit solchen Anweisungen noch 
überhaupt keine Erfahrungen gemacht.

Danke schonmal!

von Uwe (de0508)


Lesenswert?

Hallo,
1
last = (last << 2) & 0x0F;

last wird um 2 Bit nach links verschoben:

(0b00001010 << 2) wird zu (0b00101000) und

(0b00101000) & 0x0F bedeute umgangssprachlich binäres "und", also
(0b00101000) und 0x0F, ausgeschrieben bedeutet das:
1
    0b00101000
2
    0b00001111 
3
and ----------
4
    0b00001000

last = 0b00001000

: Bearbeitet durch User
von Marvin H. (marvin_h)


Angehängte Dateien:

Lesenswert?

Vielen Dank! Solangsam wird es mir klar...

Allerdings hänge ich immer noch an einem Problem.
Ich möchte zurzeit nur die Richtung auslesen und über die Leds 
wiedergeben.
Also wenn ich eine Raste nach rechts drehe soll die eine Led an gehen 
und andersherum die andere. Wenn sich nichts ändert, soll der zustand 
gleich bleiben.
Allerdings habe ich jetzt das Problem, dass wenn ich z.B. 5mal nach 
rechts drehe ich erst wieder 6 mal nach links drehen muss das sich der 
zustand der Leds ändert.

Code ist im Anhang, vllt. könnt ihr mir weiter helfen.
Danke,
Marvin

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.