;范例 快速生成位序列校验码/或对接收位序列进行循环冗余检测子程序 ;100字节位序列m0,m1,m2,m3,m4,。。。m98,m99在发送方以递推方式生成CRC校验码子程序 ;或在接收方对该序列进行CRC检测之子程序 ;在发送方,本程序为CRC校验码生成子程序。
将此位序列除以生成多项式P(X) ;=X16 X15 X2 1,将生成的CRC校验码(即余式)装入位序列的最低两位字节 ;(冲掉m0,m1),将最终处理的位序列发送出去。 ;在接收方,本程序为CRC检测子程序。将接收到的位序列除以生成多项式P(X) ;=X16 X15 X2 1,若将原位序列最低两位字节m0,m1恢复(即除得的余式R15R14 ;与原始位序列最高两位字节相等),则为正确接收。
;本程序中循环次数为98,比位序列字节数少2。因为位序列最低两个字节m0,m1直 ;接作为(第一个)余式,不对它们查取CRC校验码。 ;X为按字节寻址位序列指针 ;寻址CRC校验码表格先按字计算地址指针,将其增倍后变为按字节寻址。
CRCOUT:LDI XH,$1 ;THE BIT SEQUENCE IS IN $100---$163 CLR XL ;TOTAL 100 BYTES LDI R16,$62 ;THE DATA BLOCK LENGTH IS 98(=100-2) LD R14,X ;m0 LD R15,X ;m1CRCO1:LD R13,X ;fetch m2 at the first! LDI ZH,HIGH(DATA5) LDI ZL,LOW(DATA5) ADD R30,R13 CLR R13 ADC R31,R13 LSL R30 ROL R31 ;point to the CRC CODE! LPM EOR R14,R0 ADIW R30,1 LPM EOR R15,R0 ;CRC CODE IN R14&R15(HIGH)! DEC R16 BRNE CRCO1 STS $101,R15 STS $100,R14 ;将生成的CRC校验码放在位序列的最低两位字节中 RET ;或将原始位序列的最低两位字节恢复DATA5:。
DB $00,$00,$80,$05 ;THE CRC CODE TABLE 。DB $80,$0F,$00,$0A ;与范例101中SRAM$100--$2FF单元内容完全相同! 。DB $80,$1B,$00,$1E ;。
。。。。。。。。。。。。。。。。。。。 ;其余略 end 我这有很多!我发到你邮箱里吧!。
全部