Расшифровка кода Грея по А.А.Силкину

Для управления антенной, следящей за ДПЛА, зачастую приходится пользоваться датчиками положения антенны, работающими в коде Грея.

Код Грея знаменит тем, что при переходе из одного сектора вала поворота антенны в соседний сектор в кодовой последовательности датчика меняется только один разряд. Это, конечно, хорошо, но нам-то требуется истинное положение вала антенны, то есть позиция в вала в истинном двоичном коде. Есть целый ряд алгоритмов пересчёта. Они, безусловно, хорошие.  Приведённый ниже алгоритм тоже хороший. К тому же он реально работает.

Аппаратный вариант пересчёта:

Программа на Паскале (Слава Н.Вирту), реально работающая на БАРСе:

function Razrjad(G, P:Boolean):Boolean;
begin
G:=Not G;
//исключающее ИЛИ:
if P then
begin
if G then Result:=False else Result:=True;
end
else//P=False
begin
if G then Result:=True else Result:=False;
end;
end;//Razrjad

function GrayToBin2(Value: word):word;
var G, P:Boolean;
I:Byte;
begin
Result:=$00;
P:=True{1};
I:=13;
repeat
dec(I);
//имеется в виду, что с порта поступает инвертированный код Грея (Not Value)
if ((Not Value)and Maski[I])<>0 then G:=True else G:=False;
P:=Razrjad(G, P);
if P then Result:=Result or Maski[I];
until I=0;
end;//GrayToBin2

______

Так вышло. У нас всё просто.

SpyLOG