|
list p=PIC16F84
include p16f84.inc
ba equ 0f
_TMP1 equ ba+0
_TMP2 equ ba+1
_TMP3 equ ba+2
_CRC8 equ ba+3
buff equ ba+10
org 0h
goto _main
_main
movlw buff
movwf FSR
movlw 01
movwf 0
movlw 7
call _CRC_8
nop
nop
nop
_001:
goto _001
; typedef unsigned char byte; byte crc8(byte *buf,word l,byte crc); //byte cc[]={0x01,0xf1,0xb6,0x8a,0x01,0x00,0x00,0xc2}; byte crc8(byte *buf,word len,byte crc){
E-mail:
info@telesys.ru
;***************************** _CRC_8 ********************
; вычисляет CRC8 для W байт из FSR и возвращает ее в W
; после выполнения FSR=FSR(до выполн.)+W
_CRC_8
movwf _TMP1
clrf _CRC8
_CRC8_01
movlw 8
movwf _TMP2
movf 0,0
movwf _TMP3
_CRC8_02
rrf _TMP3,1 ;-
btfss STATUS,C ; если входной бит = 1
goto _CRC8_03 ;
movlw 1 ; то xor-им младший бит CRC с 1
xorwf _CRC8,1 ;-
_CRC8_03
bcf STATUS,C
rrf _CRC8,1 ;- смотрим, что в младшем бите
clrw ; если бит = 0 (ID xor CRC<0>) , то W=0
btfsc STATUS,C ; если бит = 1 , то W=0FF
movlw b'10001100' ;-
xorwf _CRC8,1 ; хорим CRC с вычисленным значением
decfsz _TMP2,f
goto _CRC8_02
incf FSR,1
decfsz _TMP1,f
goto _CRC8_01
movf _CRC8,0
return
end
=============
и на BC3.0 для DOS-а :-))
#include
typedef unsigned int word;
byte cc[]={0x01,0x12,0x34,0x56,0x78,0x90,0x00,0x47};
//01 06 34 11 07 00 00 d9
void main(void){
byte crc;
int i;
crc=crc8(cc,7,0);
printf("CRC8 %02X\n",(word)crc);
}
word i,j,k;
byte ret=crc,m,l;
for(i=0;i
for(j=0;j<8;j++){
l=((buf[i]&m)? 0x8c:0)^((ret&0x1)? 0x8c:0);
ret>>=1;
ret^=l;
m<<=1;
}
}
return ret;
}
Ответы