|
I've implemented the 1-wire CRC with both calculation and table lookup.
I haven't actually used it with 1-wire stuff, but for some other communication.
These routines do 1 byte at a time, so you need to put input data into the register crc_in, and the register crc is used for
the crc value. So what you typically do is the set crc to whatever init value it should have (I think it's 0 for 1-wire),
and run one of these routines for each byte. And in the end register crc will contain the crc value calulated.
Calculated:
dow_crc:
ldi crc_bitcnt, 8
crc_loop:
mov crc_data, crc_in
eor crc_data, crc
ror crc_data
mov crc_data, crc
brcc crc_zero
ldi crc_temp, 0x18
eor crc_data, crc_temp
crc_zero:
ror crc_data
mov crc, crc_data
lsr crc_in
dec crc_bitcnt
brne crc_loop
ret
Table lookup:
dow_crc:
ldi ZL, low(crc_tab * 2)
ldi ZH, high(crc_tab * 2)
eor r0, crc_in
add ZL, r0
brcc crc_b1
inc ZH
crc_b1: lpm
ret
crc_tab:
.db 0, 94, 188, 226, 97, 63, 221, 131, 194, 156, 126, 32, 163, 253, 31, 65
.db 157, 195, 33, 127, 252, 162, 64, 30, 95, 1, 227, 189, 62, 96, 130, 220
.db 35, 125, 159, 193, 66, 28, 254, 160, 225, 191, 93, 3, 128, 222, 60, 98
.db 190, 224, 2, 92, 223, 129, 99, 61, 124, 34, 192, 158, 29, 67, 161, 255
.db 70, 24, 250, 164, 39, 121, 155, 197, 132, 218, 56, 102, 229, 187, 89, 7
.db 219, 133, 103, 57, 186, 228, 6, 88, 25, 71, 165, 251, 120, 38, 196, 154
.db 101, 59, 217, 135, 4, 90, 184, 230, 167, 249, 27, 69, 198, 152, 122, 36
.db 248, 166, 68, 26, 153, 199, 37, 123, 58, 100, 134, 216, 91, 5, 231, 185
.db 140, 210, 48, 110, 237, 179, 81, 15, 78, 16, 242, 172, 47, 113, 147, 205
.db 17, 79, 173, 243, 112, 46, 204, 146, 211, 141, 111, 49, 178, 236, 14, 80
.db 175, 241, 19, 77, 206, 144, 114, 44, 109, 51, 209, 143, 12, 82, 176, 238
.db 50, 108, 142, 208, 83, 13, 239, 177, 240, 174, 76, 18, 145, 207, 45, 115
.db 202, 148, 118, 40, 171, 245, 23, 73, 8, 86, 180, 234, 105, 55, 213, 139
.db 87, 9, 235, 181, 54, 104, 138, 212, 149, 203, 41, 119, 244, 170, 72, 22
.db 233, 183, 85, 11, 136, 214, 52, 106, 43, 117, 151, 201, 74, 20, 246, 168
.db 116, 42, 200, 150, 21, 75, 169, 247, 182, 232, 10, 84, 215, 137, 107, 53
|
|