www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Drehimpusgeber auswerten


Autor: Cherkaoui Erratib (char9i)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: ROFL (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: ROFL (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
soll wohl eher heissen:

if (i & 2)
    i ^= 1;

das spart auch rechenzeit gegenüber meinem vorherigen vorschlag.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Cherkaoui Erratib (char9i)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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
  i = 0
  if( PHASE_A )
    i = 1;
  if( PHASE_B )
    i ^= 3;

Autor: Cherkaoui Erratib (char9i)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke Karl für die erklärung.ich habe das letzendlich verstanden

Autor: Basicom_Luder (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mir hat dieser Text hier geholfen:

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.