### Re^2: Dallas/Maxim crc

by anita2R (Scribe)
 on Nov 28, 2013 at 13:16 UTC ( #1064823=note: print w/replies, xml ) Need Help??

in reply to Re: Dallas/Maxim crc

As a follow-up to the script for the 16 bit crc, here is a script for the Dallas/Maxim 8 bit crc. The sample data & crc comes from a DS1822 1-wire digital thermometer. I use the code in a slightly modified format as a function in a larger program, with data and transmitted crc passed to the function, which returns 'OK' or 'Error' back to the main program.

```#!/usr/bin/perl
#
# Script to calculate the Dallas/Maxim 8 bit crc
# The data block is 8 bytes and the crc is 1 byte
#
# The script compares a calculated 8 bit crc with the
#  transmitted crc
#
# LS  = least significant
# MS  = most significant
# XOR = bitwise exclusive OR
#
use strict;
#
# variables
my (\$data, \$crc8); # input data & input crc
my \$crc;           # calculated crc
my \$test;          # initial XOR of bit 1 of data & crc
my (\$byte, \$bit);  # each byte of data & each bit of byte
my (\$i, \$n);       # loop counters
#
###########################################################
# Sample data (8 bytes in hex)
\$data = "4E014B467FFF0210";
# Sample crc (correct crc for the sample data above)
\$crc8 = "D9";
###########################################################
#
# set initial crc for calculation (8 bits all zero)
\$crc = 0b00000000;
#
# loop through data bytes
for (\$i = 0; \$i <= 14; \$i+=2) {
#convert pairs of hex digits into number
\$byte = hex(substr \$data, \$i, 2);
# sub-loop to read 8 bits from byte
for (\$n = 0; \$n <= 7; \$n++) {
#
# get LSbit of byte by applying mask
\$bit = \$byte & 0b00000001;
#
# XOR the LS bit of the crc with
#  the current data bit
\$test = \$crc ^ \$bit;
# apply mask to get LS bit only
\$test = \$test & 0b00000001;
#
# test if result was 1 or 0
if (\$test) {
# result was 1 so need to XOR, right shift
#   & make MS bit 1
#
# XOR crc with 0b00011000
\$crc = \$crc ^ 0b00011000;
# right shift
\$crc = \$crc >> 1;
# make MS bit 1 by OR'ing with 0b10000000
\$crc = \$crc | 0b10000000;
} else {
# result was zero, so just right shift crc
#  (MS bit will be 0)
\$crc = \$crc >> 1;
}
# shift data byte to right so next bit
#   is in LS bit position
\$byte = ( \$byte >> 1 );
}
}
#
# compare calculated crc to transmitted crc
if (\$crc == hex(\$crc8)) {
print "Result ". sprintf("%X",\$crc) . " is correct\n";
} else {
print "Result " . sprintf("%X",\$crc) . " does not match the trans
+mitted crc:" .  sprintf("%02X",\$crc8) . "\n";
}
#
exit 0;

Create A New User
Node Status?
node history
Node Type: note [id://1064823]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others chilling in the Monastery: (7)
As of 2020-11-23 17:32 GMT
Sections?
Information?
Find Nodes?
Leftovers?
Voting Booth?

No recent polls found

Notices?