/*
Nome do Projeto: CRC8_1Wire
Nome do Aquivo: CRC8_1Wire.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
da maxim para produtos 1Wire.
Usa o polinomio P(x)=x^8+x^5+x^4+1 = 0x8C = 1 0 0 1 1 0 0 0 1
bits = 0 1 2 3 4 5 6 7
Desloca os bits a partir do LSB para direita.
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, 0x1A };
{ 0x28, 0xFF, 0x3C, 0x4B, 0x77, 0x04, 0x00, 0x37 };
{ 0x28, 0xFF, 0x1B, 0x4D, 0x73, 0x04, 0x00, 0x09 };
*/
#define POLYNOMIAL 0x8C // Polinomio usado
byte ROM[] { 0x28, 0xFF, 0x1B, 0x4D, 0x73, 0x04, 0x00, 0x09 }; // Matriz com o valor 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); // Inicializa 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],0) ^ bitRead(crc,0) == 1) // Se o OR exclusivo entre CRC bit 0 e bit 0 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 direita
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 direita
}
}
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 (); // Chama a rotina de verificação do CRC
while(1) {}
}