Smazaný obsah Přidaný obsah
Dělící kotouč
−prakticky duplicitní kód, zjednodušení, redukce obrázků, které strašně natahují pravou část
Řádek 1:
[[Soubor:Gray code rotary encoder 13-track opened.jpg|thumb|rightupright|13bitový Grayův kód použitý na dělícím kotouči (13-bitový) absolutního rotačního snímače polohy (horní část obrázku, kotouč je v dolní části poškozen).]]
'''Zrcadlový binární kód''', známý také jako '''Grayův kód''' podle [[Frank Gray|Franka Graye]], je [[dvojková soustava|binární]] [[číselná soustava]], ve které se každé dvě po sobě jdoucí hodnoty liší v bitovém vyjádření změnou pouze jedné bitové pozice.
 
Zrcadlový binární kód byl původně navržen pro zabránění rušivého výstupu z elektromechanických přepínačů ([[hazard (signál)|hazardy]]y [[relé]]). Dnes je Grayův kód používán pro podporu opravy chyb v digitální komunikaci jako je [[DVB-T|digitální pozemní televize]] a některé systémy [[kabelová televize|kabelové televize]]. Grayův kód využívají také [[odpovídač]]e sekundárního [[radar]]u v letadlech. Také některé [[snímač]]e polohy (lineární i rotační) udávají absolutní polohu v Grayově kódu, aby byl vyloučen výskyt chybné hodnoty při přechodu mezi dvěma sousedními polohami.
 
== Důvod vzniku ==
[[Soubor:Binary-Gray-Code.png|thumb|right|300pxupright|Srovnání dvojkového a Grayova kódu, podbarvením je vyznačen různý rozsah hodnot pro různé počty použitých bitů.]]
Použití tohoto kódu má význam v [[elektrický obvod|elektrických obvodech]] při čtení hodnoty [[asynchronní]]ch (nesynchronizovaných) [[čítač]]ů a absolutní snímače polohy. Obecně se problém zajištění "současnosti" v digitálních systémech řeší pomocí synchronizačního (hodinového, vzorkovacího) signálu i použitím synchronních čítačů. V některých případech může být použití synchronizačního signálu nevýhodné.
 
Při změně hodnoty klasického binárního čítače o hodnotu ±1 dochází u každé druhé změny ve stejném směru (+ nárůst / − pokles hodnoty) ke změně na více bitových pozicích čítače. Například při přechodu z hodnoty 3 (011<sub>B</sub>) na hodnotu 4 (100<sub>B</sub>) se současně změní všechny tři bitové pozice. S nárůstem počtu '''n''' bitů pro vyjádření hodnoty (= 2<sup>''n''</sup>), narůstá i počet takových stavů, ve kterých dochází ke změnám na dvou a více bitových pozicích. Tyto stavy jsou na obrázku vyznačeny červeně, s uvedením počtu změněných bitů při přechodu na hodnotu ±1.
 
V reálném systému není nikdy možné zaručit, aby se změnilo více logických hodnot naprosto současně a není možno zajistit ani jejich naprosto současné přečtení a vyhodnocení. Toto bývá u elektroniky způsobeno různým zpožděním [[logický člen|logických členů]], [[přechodová charakteristika|přechodovými charakteristikami]], [[parazitní kapacita|parazitními kapacitami]], nesynchronním snímání optického kotouče snímači a dalšími vlivy.
Řádek 17:
 
=== Další využití ===
<!--[[Soubor:Gray_discGray disc.png|thumb|right|9-bitový9bitový kódový dělící kotouč.]]-->
Pro svou robustnost se Grayův kód používá pro inkrementální (relativní) [[senzor|snímače]] polohy na principu jedné rotující clonky se dvěma úhlově posunutými optickými senzory, tedy s dvěma kódovými bity vyjadřující stav 0–3. Tento princip se používá nejen u [[Číslicové řízení|CNC]] strojů, ale i u obyčejné [[Počítačová myš|myši]]: Vyhodnocující elektronika pak umožňuje nejen načítání vzdálenosti, ale i určení směru pohybu.
 
Řádek 23:
 
=== HW řešení ===
Převod z Grayova kódu na klasický [[binární kód]] lze snadno realizovat pomocí [[logický člen|logických členů]] [[XOR]] zapojených následovně.:
 
[[Soubor:ConvertGrayToBin.png|200pxcenter|thumb|Obvod pro konverzi z 3bitového Grayova kódu na binární]]
 
Pro převod opačným směrem, tedy z binárního kódu na Grayův, lze použít následující zapojení.
 
[[Soubor:ConvertBinToGray.png|200pxcenter|thumb|Obvod pro konverzi z 3bitového binárního kódu na Grayův]]
 
{{Clear}}
=== SW řešení ===
|Převod z binárního do grayovaGrayova kódu v [[PascalC (programovací jazyk)|Pascalujazyku C]]:
 
{|width=50%
|Velmi snadno lze převod do grayova kódu naprogramovat v [[C (programovací jazyk)|jazyku C]].
|-
|
<source lang="c">
unsigned int gray_encode(unsigned int b) {
Řádek 43 ⟶ 39:
}
</source>
|}
 
O něco málo složitější je převod z Grayova kódu do binárního:
{|width=50%
|Převod z grayova do binárního kódu vyjde v jazyku C o něco složitěji:
|-
|
<source lang="c">
unsigned int gray_decode( unsigned int g ) {
Řádek 60 ⟶ 52:
}
</source>
|}
 
{|width=50%
|Převod do grayova kódu v [[Pascal (programovací jazyk)|Pascalu]]:
|-
|
<source lang="pascal">
function GrayEncode(b: Longint): Longint;
begin
GrayEncode := b xor (b shr 1);
end;
</source>
|}
 
== Jednostopý Grayův kód ==
[[Soubor:Enkelspoors-Graycode.svg|thumb|leftupright|Kódový kotouč pro<br />jednostopý Grayův kód pros 5 senzorů.senzory]]
<!--[[Soubor:Binary-Gray-Code-Single-Track.png|thumb|rightupright|Kódování z jednostopého snímání.]]-->
Ve výše uvedeném příkladu je pro generování kódu použito ''n-'' stop pro ''n-'' [[bit]]ů, minimálně 2. Každý kódový bit je snímán ze samostatné kódové stopy. Existuje však i patentované řešení, pro které postačuje jedna kódová stopa. Snímaný kód je odlišný; je postupný, není zrcadlový a vyjadřuje 30 možných hodnot výstupní kombinace kódu, výstupní kód 0<sub>D</sub> a 31<sub>D</sub> (00<sub>H</sub> a 1F<sub>H</sub> / 00000<sub>B</sub> a 11111<sub>B</sub>) není generován. Podstatné je, že i tento kód splňuje podmínku, že při změně hodnoty o ±1 se výstupní kód mění pouze v jednom bitu.
{{Clear}}