Na FreeHostingu Endora běží desítky tisíc webů. Přidejte se ještě dnes!

Vytvořit web zdarma

Na FreeHostingu Endora běží desítky tisíc webů. Přidejte se ještě dnes!

Vytvořit web zdarma

 

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