Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- Nome do Projeto: CRC8_Site
- Nome do Aquivo: CRC8_Site.ino
- link:
- Dependencias: N/A
- MCU: ATmega
- Board: Arduino Uno/Mega/Mini
- Compilador N/A
- IDE: Arduino IDE 1.6.6
- Hardware: Arduino UNO/MEGA/Mini
- Escrito por: Rui Viana
- Modificado por: N/A
- Data: 29/05/2016
- Uso: Didático
- Desenhos N/A
- Copyright @ N/A
- Este programa é software livre;
- e é distribuído na esperança que possa ser útil, mas SEM QUALQUER GARANTIA;
- mesmo sem a garantia implícita de COMERCIALIZAÇÃO ou ADEQUAÇÃO A UM DETERMINADO FIM.
- REVISÕES:
- 29/05/2016 - .ino - Inicial
- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- Descrição:
- Este código calcula o CRC de 8 bits de uma sequencia de bytes conforme descrito no site
- https://www.ghsi.de/CRC/
- Usa o polinomio P(x)=x^8+x^5+x^4+1 = 0x31 = 1 0 0 1 1 0 0 0 1
- bits = 7 6 5 4 3 2 1 0
- Desloca os bits a partir do LSB para esquerda.
- Depois compara o crc calculado com o crc informado, e informa o resultado.
- Exemplos para teste.
- O ultimo byte é o CRC encontrado e deve ser igual ao calculado com os primeiros 7 bytes.
- { 0x28, 0xFF, 0x38, 0x50, 0x73, 0x04, 0x00, 0x9E };
- { 0x28, 0xFF, 0x3C, 0x4B, 0x77, 0x04, 0x00, 0x10 };
- { 0x28, 0xFF, 0x1B, 0x4D, 0x73, 0x04, 0x00, 0x93 };
- */
- #define POLYNOMIAL 0x31 // Polinomio usado
- byte ROM[] { 0x28, 0xFF, 0x1B, 0x4D, 0x73, 0x04, 0x00, 0x93 }; // Matriz com o valotr a ser calculado
- byte crc_shift = 0; // Variavel para guardar o crc deslocado
- byte crc = 0; // Variavel para guardar o crc calculado
- //-------------------------------
- void setup()
- {
- Serial.begin(9600); // Inicialisa o serial monitor
- }
- //-------------------------------
- void CheckCrc ()
- {
- for (byte byteROM = 0; byteROM < (sizeof(ROM)-1); byteROM++) // Calcula 8-Bit checksum com polynomial
- {
- for (byte i = 0; i <8; i++) // Calcula CRC pra cada bit
- {
- 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
- { // Faça
- crc_shift = crc_shift^POLYNOMIAL; // Or exclusivo entre o crc declocado e o polinomio
- }
- ROM[byteROM] = ROM[byteROM]<<1; // Desloca o byte lido um bit para esquerda
- crc = crc_shift; // Salva o valor deslocado do crc
- Serial.println(crc,HEX); // Mostra o valor do CRC em cada fase
- crc_shift = crc_shift << 1; // Desloca o crc um bit pra esquerda
- }
- }
- if (crc == ROM[sizeof(ROM)-1]) // Compara crc calculado com crc informado
- Serial.print("CRC Ok "); // se for igual
- else
- Serial.print("CRC incorreto "); // se for diferente
- }
- //----------------------------
- void loop()
- {
- CheckCrc ();
- while(1) {}
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement