Welcome to our new forum
All users of the legacy CODESYS Forums, please create a new account at account.codesys.com. But make sure to use the same E-Mail address as in the old Forum. Then your posts will be matched. Close

Konvertierung Gray Code in Dual Code

fujitsufan
2009-11-04
2016-03-23
  • fujitsufan - 2009-11-04

    Hallo,

    weiß jemand eine Funktion die mir eine Variable mit Gray-Code codierten Inhalt in einen Dual codierten Inhalt umwandelt?

    Dual-Code in Gray-Code hab ich schon (in C/C++).

    UINT8 APP_Binary2Gray(UINT8 b)
    {
      return b ^ (b >> 1);
    }
    

    mfG.

    fujitaufan

     
  • Rolf-Geisler - 2009-11-04

    Hallo,

    für die Konvertierung von gray-codierten Encoderpositionen (24 Bit) nehme ich folgenden Code:

    FUNCTION GRAY_TO_BIN : DWORD
    VAR_INPUT
      Signal : DWORD;  (* encoder signal *)
    END_VAR
    VAR
      local  : DWORD;
      ix     : INT;
      Mask   : DWORD;
    END_VAR
    (* Bit 23 *)
    Mask := SHR (Mask, 1);  (* adopt bit mask *)
    IF ((local AND Mask) <> DWORD#16#00000000)
    THEN IF ((local AND (SHR (Mask, 1))) = DWORD#16#00000000)
         THEN local := local OR (SHR (Mask, 1));
         ELSE local := local AND NOT (SHR (Mask, 1));
         END_IF;
    END_IF;
    (* Bit 22 *)
    Mask := SHR (Mask, 1);  (* adopt bit mask *)
    IF ((local AND Mask) <> DWORD#16#00000000)
    THEN IF ((local AND (SHR (Mask, 1))) = DWORD#16#00000000)
         THEN local := local OR (SHR (Mask, 1));
         ELSE local := local AND NOT (SHR (Mask, 1));
         END_IF;
    END_IF;
    (* und so weiter bis Bit 0 *)
    (* Bit 0 *)
    Mask := SHR (Mask, 1);  (* adopt bit mask *)
    IF ((local AND Mask) <> DWORD#16#00000000)
    THEN IF ((local AND (SHR (Mask, 1))) = DWORD#16#00000000)
         THEN local := local OR (SHR (Mask, 1));
         ELSE local := local AND NOT (SHR (Mask, 1));
         END_IF;
    END_IF;
    Gray_to_Bin := local;
    END_FOR;
    

    Gebe zu, sieht fürchterlich aus, viel redundanter Code. Habe aber auf die Schnelle keine Möglichkeit gefunden, eine Schleife mit aufsteigender Kontrollvariablen und daraus abgeleitetem absteigenden Bit-Index zu bauen. Die Bit-Abfrage geht leider nur von oben nach unten.

    Gruss Rolf

     
  • janinno - 2016-03-23

    Hallo User,
    es geht tatsächlich einfacher. Folgendes Beispiel rechnet ein Byte Gray-Code in Binärcode um:

    bBinCode := bGrayCode AND 128; (* Bitmaskierung höchstes Bit, 2^n, hier n=8, 2^8=128 *)
    FOR n := 1 TO 7 DO      (* n-1 = 7 Durchläufe für die restlichen Bits *)
       bBinCode := SHR(bBinCode,1) XOR bGrayCode;
    END_FOR
    

    Warum und wie diese Verfahren funktioniert ist auf mehreren Seiten im Internet zum Teil sehr anschaulich beschrieben.
    Für andere Variablen-Größen muss nur der Variablen-Typ und 'n' angepasst werden, es bleibt bei vier Programmzeilen.

    Gruß, Jan

     

Log in to post a comment.