RuiViana

CRC8

Aug 15th, 2016
152
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /*
  2.    Nome do Projeto:  CRC8_Site
  3.    Nome do Aquivo:   CRC8_Site.ino
  4.    link:
  5.    Dependencias:     N/A
  6.    MCU:              ATmega
  7.    Board:            Arduino Uno/Mega/Mini
  8.    Compilador        N/A
  9.    IDE:              Arduino IDE 1.6.6
  10.    Hardware:         Arduino UNO/MEGA/Mini
  11.    Escrito por:      Rui Viana
  12.    Modificado por:   N/A
  13.    Data:             29/05/2016
  14.    Uso:              Didático
  15.    Desenhos          N/A
  16.    Copyright @       N/A
  17.    
  18.    Este programa é software livre;
  19.    e é distribuído na esperança que possa ser útil, mas SEM QUALQUER GARANTIA;
  20.    mesmo sem a garantia implícita de COMERCIALIZAÇÃO ou ADEQUAÇÃO A UM DETERMINADO FIM.
  21.  
  22.    REVISÕES:
  23.    29/05/2016   -   .ino - Inicial
  24.  
  25.   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  26.    Descrição:  
  27.    
  28.    Este código calcula o CRC de 8 bits de uma sequencia de bytes conforme descrito no site
  29.    https://www.ghsi.de/CRC/
  30.    Usa o polinomio  P(x)=x^8+x^5+x^4+1  = 0x31   = 1 0 0 1 1 0 0 0 1  
  31.                                           bits   =   7 6 5 4 3 2 1 0    
  32.    Desloca os bits a partir do LSB para esquerda.
  33.    Depois compara o crc calculado com o crc informado, e informa o resultado.
  34.  
  35.    Exemplos para teste.
  36.     O ultimo byte é o CRC encontrado e deve ser igual ao calculado com os primeiros 7 bytes.
  37.      
  38.     { 0x28, 0xFF, 0x38, 0x50, 0x73, 0x04, 0x00, 0x9E };
  39.     { 0x28, 0xFF, 0x3C, 0x4B, 0x77, 0x04, 0x00, 0x10 };
  40.     { 0x28, 0xFF, 0x1B, 0x4D, 0x73, 0x04, 0x00, 0x93 };  
  41. */  
  42.   #define POLYNOMIAL 0x31                                           // Polinomio usado          
  43.   byte ROM[] { 0x28, 0xFF, 0x1B, 0x4D, 0x73, 0x04, 0x00, 0x93 };    // Matriz com o valotr a ser calculado
  44.   byte crc_shift = 0;                                               // Variavel para guardar o crc deslocado
  45.   byte crc = 0;                                                     // Variavel para guardar o crc calculado
  46.   //-------------------------------  
  47.   void setup()
  48.   {
  49.     Serial.begin(9600);                                             // Inicialisa o serial monitor
  50.   }
  51.   //-------------------------------
  52.   void CheckCrc ()
  53.   {
  54.     for (byte byteROM = 0; byteROM < (sizeof(ROM)-1); byteROM++)    // Calcula 8-Bit checksum com polynomial
  55.     {                  
  56.       for (byte i = 0; i <8; i++)                                   // Calcula CRC pra cada bit
  57.       {
  58.         if (bitRead(ROM[byteROM],7) ^  bitRead(crc,7) == 1)         // Se o OR exclusivo entre CRC bit 7 e bit 7 do Byte lido é igual a 1
  59.         {                                                           // Faça
  60.           crc_shift = crc_shift^POLYNOMIAL;                         // Or exclusivo entre o crc declocado e o polinomio                  
  61.         }
  62.         ROM[byteROM] = ROM[byteROM]<<1;                             // Desloca o byte lido um bit para esquerda
  63.         crc = crc_shift;                                            // Salva o valor deslocado do crc
  64.         Serial.println(crc,HEX);                                    // Mostra o valor do CRC em cada fase  
  65.         crc_shift = crc_shift << 1;                                 // Desloca o crc um bit pra esquerda
  66.       }
  67.     }
  68.     if (crc == ROM[sizeof(ROM)-1])                                  // Compara crc calculado com crc informado
  69.     Serial.print("CRC Ok ");                                        // se for igual
  70.     else
  71.     Serial.print("CRC incorreto ");                                 // se for diferente
  72.   }
  73.   //----------------------------
  74.   void loop()
  75.   {
  76.     CheckCrc ();
  77.     while(1) {}
  78.   }
RAW Paste Data