
CRC для AVR :
;*****************************************************************************
;* ПРОЦЕДУРА ВЫЧИСЛЕНИЯ 8-БИТНОЙ CRC для микроконтроллеров AVR. *
;*****************************************************************************
; Пример использования:
clr fCRC ; Перед вычислением надо обнулять fCRC.
mov fTEMP,fBYTE1 ; Названия байтов к примеру.
rcall DO_CRC
; В fCRC сейчас находится контрольная сумма байта fBYTE1.
mov fTEMP,fBYTE2
rcall DO_CRC
; В fCRC сейчас находится контрольная сумма байтов fBYTE1 и fBYTE2.
mov fTEMP,fBYTE3
rcall DO_CRC
; В fCRC сейчас находится контрольная сумма байтов fBYTE1, fBYTE2, fBYTE3.
; И так далее.
; 8-битная CRC теряет эффективность при размере пакета более 200 байт.
.def SAVE_W =r16 ;
.def fBIT_CNT =r17 ; Счетчик прочитанных битов.
.def fTEMP =r18 ; Временный регистр только для локального использования.
.def fCRC =r19 ; Контрольная сумма.
; Процедура обновления CRC (циклическая контрольная сумма). Параметр в fTEMP.
DO_CRC:
mov SAVE_W,fTEMP
ldi fBIT_CNT,8
CRC_LOOP:
eor fTEMP,CRC
ror fTEMP
mov fTEMP,CRC
brcc ZERO
ldi CRC,0x18
eor fTEMP,CRC
ZERO:
ror fTEMP
mov CRC,fTEMP
lsr SAVE_W
mov fTEMP,SAVE_W
dec fBIT_CNT
brne CRC_LOOP
ret
;-----------------------------------------------------------------------------
и вот :
;----------------------------------------------------------------
crc_calc: ;вычисляем CRC текущего байта
mov r16,r17
ldi r18,8
crc_loop:
eor r17,r19
ror r17
brcc zero
ldi r17,0x18
eor r19,r17
zero: ror r19
lsr r16
mov r17,r16
dec r18
brne crc_loop
ret