JedlaTech

Elektronika, programování AVR a jedna bílá Felicie

 

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:

Vše názorně ukáže obrázek (převzato z Wikipedie):

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