CRC16 z wielomianem charakterystycznym 0xA001 liczy się tak (było w EP):
void crc_calc(unsigned char work_data)
{
unsigned int genpoly = 0xa001; /* Reversed polynomial */
unsigned char i;
/* Convert the received byte to an integer */
crc_accum = crc_accum ^ (unsigned int)work_data;
for(i=8; i>0; i--)
{
/* Loop 8 times to test each bit of the new character */
if ((crc_accum) & 0x0001)
crc_accum = ((crc_accum) >> 1) ^ genpoly;
else
(crc_accum) >>= 1;
}
} Przetestowane na ATMega8 Używa się w MODBUSIE Modicona .
Wektory testowe: E1 05 01 19 CRC16: E6 43
E1 05 01 1D CRC16: E7 80