Как вычислять контрольную сумму - CRC8 CRC16 ?
Добавлено: Чт окт 19, 2006 13:05:43
подскажите как вычислять контрольную сумму - CRC8 и CRC16 ?
Здесь можно немножко помяукать :)
https://radiokot.ru/forum/
Код: Выделить всё
unsigned char OWI_ComputeCRC8(unsigned char inData, unsigned char seed)
{
unsigned char bitsLeft;
unsigned char temp;
for (bitsLeft = 8; bitsLeft > 0; bitsLeft--)
{
temp = ((seed ^ inData) & 0x01);
if (temp == 0)
{
seed >>= 1;
}
else
{
seed ^= 0x18;
seed >>= 1;
seed |= 0x80;
}
inData >>= 1;
}
return seed;
}
Код: Выделить всё
CRCGEN:
PUSH R1
LDI R20,8
LDI R18,0x18
PUSH R1
CRC_L: lds R3,CRC
EOR R1,R3
ROR R1
MOV R1,R3
BRCC ZERO
EOR R1,R18
ZERO: ROR R1
sts CRC,R1
POP R1
SEC
SBRS R1,0
CLC
ROR R1
PUSH R1
DEC R20
BRNE CRC_L
POP R1
POP R1
RET
Код: Выделить всё
_w1_dow_crc8:
clr r30
ld r24,y
tst r24
breq __w1_dow_crc83
ldi r22,0x18
ldd r26,y+1
clr r27
__w1_dow_crc80:
ldi r25,8
ld r31,x+
__w1_dow_crc81:
mov r23,r31
eor r23,r30
ror r23
brcc __w1_dow_crc82
eor r30,r22
__w1_dow_crc82:
ror r30
lsr r31
dec r25
brne __w1_dow_crc81
dec r24
brne __w1_dow_crc80
__w1_dow_crc83:
adiw r28,2
ret
Код: Выделить всё
crc_go2:
ldi mask,0x8C ; полином
clr crc ; вначале был 0
loc1: lpm ; data - в r0
adiw ZL,1 ; может быть на границе блока
ldi bits,8
eor crc,r0
loc2: lsr crc ; left shift
brcc loc3
eor crc,mask
loc3: dec bits
brne loc2
dec buflen
brne loc1 ; do next byte
ret
Прежде всего - научитесь правильно оформлять код программы, который вставляете в пост!Lonleystranger писал(а): Совершенно ничего не понимаю!...
...
Вообще выдает непонятно что...
А ошибка в выделенном куске. Нельзя тупо копировать код, вы же с чужого языка не дословно предложение переводите?Lonleystranger писал(а):
ROR TEMP ; сдвиг вправо через флаг переноса
MOV TEMP, CRC ; берем последнее значение CRC
BRCC ZERO ; переход, если не было переноса
Но где-то ошибка...Ввожу номер 1990 iButton'a 8-ми байтовый (с CRC включительно), а 0 не получаю...
Помогите пожалуйста-где я ошибся?
Код: Выделить всё
Do_Crc:
EOR CRC,temp ;Exclusive OR
LDI R18,0x08 ;Load immediate
LDI temp,0x8C ;Load immediate
BST CRC,0 ;Bit store from register to T
LSR CRC ;Logical shift right
BRTC PC+0x02 ;Branch if T flag cleared
EOR CRC,temp ;Exclusive OR
DEC R18 ;Decrement
BRNE PC-0x05 ;Branch if not equal
LDI temp,0x00 ;Load immediate
ret
А вот этого не надо, команда mov не воздействует на флаги результата.nictrace писал(а):...
Команда МОV обнуляет флаг С!
...