Manchester kódování na AVR
Co je Manchester kódování?
Manchester kódování je způsob zakódování digitálních dat. Jednotlivé bity v přenášené informaci jsou převedeny na změnu hodnoty, tedy hodnota bitu je vyjádřena sestupnou nebo vzestupnou hranou přenášeného signálu. Díky tomu lze z přenášených dat snadno získat Clock signál pro synchronní přenosy dat - každá hrana v přenášeném signálu totiž znamená jeden takt.
Výhodou Manchester kódování je vyšší odolnost vůči rušení, zjednodušení synchronizace při synchronních přenosech a především skutečnost, že zakódovaný signál má konstantní střední hodnotu!
Existují dva typy:
- dle G.E. Thomase - logická hodnota 1 je vyjádřena sestupnou hranou, naopak logická 0 je vyjádřena vzestupnou hranou
- dle IEEE 802.3 (Ethernet norma) - logická 1 je vyjádřena vzestupnou hranou a logická 0 sestupnou.
Vše názorně ukáže obrázek (převzato z Wikipedie):
![](images/Manchester.png)
POZOR! Nevýhodou tohoto způsobu kódování je, že zakódovaná informace obsahuje 2x větší počet dat. Každý bit je vyjádřen změnou úrovně = na každý bit potřebujeme 2 bity v kódování Manchester. 1B informace tak bude zakódován do 2B! Abychom tedy přenesly data v zakódované podobě za stejný čas jako surová data, musíme 2x zvětšit přenosovou rychlost!.
Příklad Encoderu:
Encoder je algorithmus, který vstupní informaci zakóduje do jiného formátu v našem případě do kódování Manchester.
Možné řešení:
void manchesterEncoder(uint16_t *encodeData,
uint8_t *data,uint8_t delka)
{
uint16_t temp=0;
for(int m=0;m<delka;m++)
{
for (int n=0;n<8;n++)
{
if(data[m] & (1<<n))
// když je bit jednička
{
temp |= (1<<(n*2));
// první bit bude jednička
temp &= ~(1<<((n*2)+1));
// a druhý bit bude nula
}
else
// jinak
{
temp &= ~(1<<(n*2));
// první bit je nula
temp |= (1<<((n*2)+1));
// a druhý bit je jednička
}
}
encodeData[m] = temp;
}
}
Kde:
encodeData - proměnná pro uložení zakódovaných dat
data - vstupní proměnná k zakódování
delka - počet Bytů proměnné data
Příklad odpovídajícího Decoderu:
Decoder je algoritmus, který zpětně získá data ze vstupního zakódovaného signálu.
Možné řešení:
uint8_t manchesterDecoder2(uint16_t *manchesterData,uint8_t *decodeData,uint8_t
delka)
{
uint16_t m,n,tempCoded;
uint8_t temp = 0;
for(m=0;m<delka;m++)
{
tempCoded = manchesterData[m]; // vždy 2B v Manchesteru jsou
1B dat
for (n=0;n<16;n+=2) // 0-15 bit pro dekodovani jednoho uint16
{
if((tempCoded &
(1<<n)) != (tempCoded & (1<<(n+1)))) // následující bit v každé dvojici
musí být opačný
{
if(tempCoded & (1<<n)) // když první bit je jedna
temp |= 1<<(n/2); // nastav bit do jedničky
else
temp &= ~(1<<(n/2)); // jinak nastav do nuly
}
else
{
return(0);
// v případě chyby je návratová hodnota "0"
}
}
decodeData[m] = temp;
}
return(1);
// v případě úspěšného převodu je návratová hodnota "1"
}
Kde:
manchesterData - vstupní data ve formátu Manchester - ktrá chceme dekódovat
decodeData - výstupní proměnná do které se uloží rozkódovaný výsledek
delka - počet Bytů proměnné data