Forum: Mikrocontroller und Digitale Elektronik Drehimpusgeber auswerten


von Cherkaoui E. (char9i)


Lesenswert?

Hallo;

Ich bin Anfänger bei dem Breich Mikrocontroller. Ich möchte eine Frage 
im Bezug auf das Thema Drehgeber erklären lassen.

in diesem Links ist eine Erklärung zum Dannerger code:

Beitrag "Re: Drehgeber auslesen"

aber ich habe nicht diesen Abschnitt verstanden :

<<<<<
Einfacher ist jedoch eine Umwandlung des Gray-Code nach Binär, wie sie
in diesem 2.Programmbeispiel erfolgt:

Gray-Code   Binär-Code
00          00 (0)     o.k.
01          01 (1)     o.k.
11          10 (2)     ändern
10          11 (3)     ändern

Wie man sieht, muß man also nur das niederwertige Bit umdrehen, sobald
das höherwertige Bit gesetzt ist.

Diese Anweisung:
  if( PHASE_B )
    i ^= 3;
setzt das höherwertige Bit und invertiert das niederwertige, fertig ist
die Codeumwandlung
>>>>>>>

der Bfehl schon klar  i^=3 heißt  i= i^3
aber wenn ich das ausprobiere kriege ich nicht den Binäre-Code.

Z.B:
    Gray-Code (i)    Binäre-Code( i= i^3 )
       00               00^11= 11
       01               01^11= 10
       11               11^11= 00
       10               10^11= 01

Die Ergebnisse stimmen nicht mit der oben gennanten Tabelle überein. 
Habe ich das falsch verstanden oder gibt einen Trick drin?

Für ihre Hilfe wäre ich dankbar

von ROFL (Gast)


Lesenswert?

Nö, verstehe ich auch nicht ganz was das soll.
Versuche es mal damit:

i = i ^ ( (i&2) >>1 )

das dreht das untere bit um, sobald das 2. bit gesetzt ist.

von ROFL (Gast)


Lesenswert?

soll wohl eher heissen:

if (i & 2)
    i ^= 1;

das spart auch rechenzeit gegenüber meinem vorherigen vorschlag.

von Peter D. (peda)


Lesenswert?

Cherkaoui Erratib wrote:

> Habe ich das falsch verstanden

Ja, die Bedingung:

>   if( PHASE_B )
>     i ^= 3;

Du hast ein unbedingtes i^=3 genommen, das geht natürlich nicht.


Peter

von Karl H. (kbuchegg)


Lesenswert?

Du musst die komplette Vorgeschichte von i berücksichtigen.

i beginnt mit 0
Wenn PHASE_A gesetzt ist, wird i zu 1

An dieser Stelle ist i entweder 0 oder 1

Wenn dann noch PHASE_B gesetzt ist, kommt der 'magische' Ausdruck zum 
Zug


Die Umsetztabelle sieht also, über den kompletten Code gesehen, so aus

  PHASE_B    PHASE_A      Ergebnis
    0           0           00
    0           1           01
    1           1           10
    1           0           11


Der 'Gray Code' steckt in den beiden 'Bits' PHASE_A und PHASE_B

von Cherkaoui E. (char9i)


Lesenswert?

peter:

>   if( PHASE_B )
>     i ^= 3;

>Du hast ein unbedingtes i^=3 genommen, das geht natürlich nicht.
was ist damit gemeint?

sorry ich habe wircklich nicht verstanden. kannst du bitte mit einem 
Beispiele erklären.

cherkaoui

von Karl H. (kbuchegg)


Lesenswert?

Cherkaoui Erratib wrote:

> sorry ich habe wircklich nicht verstanden. kannst du bitte mit einem
> Beispiele erklären.

Welchen Teil meiner Erklärung verstehst du nicht?
i enthält keinen Gray-Code. i ist einfach nur eine Zwischenvariable und 
sonst nichts. Der Gray-Code steckt in PHASE_A und PHASE_B

Anderes Beispiel:
Die Umrechnung von Farenheit nach Celsius lautet
   C = 9/5 * F + 32

Was du jetzt machst ist, du greifst dir aus dieser Formel den Teil 9/5 * 
F heraus, tabellierst das für ein paar Werte und wunderst dich, warum 
die Werte nicht stimmen. So wie du für die Umrechnung F->C die komplette 
Formel benutzen musst, so musst du auch aus dem 'Gray-Code' 
PHASE_A/PHASE_B die komplette Vorschrift zur Umwandlung nach Binär 
benutzen. Und diese komplette Umwandlung lautet nun mal
1
  i = 0
2
  if( PHASE_A )
3
    i = 1;
4
  if( PHASE_B )
5
    i ^= 3;

von Cherkaoui E. (char9i)


Lesenswert?

Danke Karl für die erklärung.ich habe das letzendlich verstanden

von Basicom_Luder (Gast)


Lesenswert?

Mir hat dieser Text hier geholfen:

http://www.rheinfeld.de/andreas/drehgeber.htm

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.