|
Подсчет СRC |
|
|
|
Nov 17 2005, 06:19
|

Познающий...
     
Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125

|
У меня тут правда на Си пример подсчета CRC8, но он очень простой и я думаю его не трудно перевести на ассембелр. Сам давно не работал с асмом. Если Вы не знаете Си, то прошу меня извинить, другого у меня не было. Код const unsigned char crc_table[256] = { 0x00,0x5E,0xBC,0xE2,0x61,0x3F,0xDD,0x83,0xC2,0x9C,0x7E,0x20,0xA3,0xFD,0x1F,0x41, 0x9D,0xC3,0x21,0x7F,0xFC,0xA2,0x40,0x1E,0x5F,0x01,0xE3,0xBD,0x3E,0x60,0x82,0xDC, 0x23,0x7D,0x9F,0xC1,0x42,0x1C,0xFE,0xA0,0xE1,0xBF,0x5D,0x03,0x80,0xDE,0x3C,0x62, 0xBE,0xE0,0x02,0x5C,0xDF,0x81,0x63,0x3D,0x7C,0x22,0xC0,0x9E,0x1D,0x43,0xA1,0xFF, 0x46,0x18,0xFA,0xA4,0x27,0x79,0x9B,0xC5,0x84,0xDA,0x38,0x66,0xE5,0xBB,0x59,0x07, 0xDB,0x85,0x67,0x39,0xBA,0xE4,0x06,0x58,0x19,0x47,0xA5,0xFB,0x78,0x26,0xC4,0x9A, 0x65,0x3B,0xD9,0x87,0x04,0x5A,0xB8,0xE6,0xA7,0xF9,0x1B,0x45,0xC6,0x98,0x7A,0x24, 0xF8,0xA6,0x44,0x1A,0x99,0xC7,0x25,0x7B,0x3A,0x64,0x86,0xD8,0x5B,0x05,0xE7,0xB9, 0x8C,0xD2,0x30,0x6E,0xED,0xB3,0x51,0x0F,0x4E,0x10,0xF2,0xAC,0x2F,0x71,0x93,0xCD, 0x11,0x4F,0xAD,0xF3,0x70,0x2E,0xCC,0x92,0xD3,0x8D,0x6F,0x31,0xB2,0xEC,0x0E,0x50, 0xAF,0xF1,0x13,0x4D,0xCE,0x90,0x72,0x2C,0x6D,0x33,0xD1,0x8F,0x0C,0x52,0xB0,0xEE, 0x32,0x6C,0x8E,0xD0,0x53,0x0D,0xEF,0xB1,0xF0,0xAE,0x4C,0x12,0x91,0xCF,0x2D,0x73, 0xCA,0x94,0x76,0x28,0xAB,0xF5,0x17,0x49,0x08,0x56,0xB4,0xEA,0x69,0x37,0xD5,0x8B, 0x57,0x09,0xEB,0xB5,0x36,0x68,0x8A,0xD4,0x95,0xCB,0x29,0x77,0xF4,0xAA,0x48,0x16, 0xE9,0xB7,0x55,0x0B,0x88,0xD6,0x34,0x6A,0x2B,0x75,0x97,0xC9,0x4A,0x14,0xF6,0xA8, 0x74,0x2A,0xC8,0x96,0x15,0x4B,0xA9,0xF7,0xB6,0xE8,0x0A,0x54,0xD7,0x89,0x6B,0x35} ;
//Вычисляет и возвращает crc8 //byte - очередной байт, для которого считаем контрольныю сумму //crc8 - байт самой контрольной суммы void do_crc_8(unsigned char byte, unsigned char *crc8) { *crc8=crc_table[(*crc8^byte)]; }
--------------------
Выбор.
|
|
|
|
|
Nov 17 2005, 06:37
|

Познающий...
     
Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125

|
Цитата А можно просто в двух словах изложить алгоритм подсчета, как он делается... К сожалению я не знаю алгоритм, сам выдрал пример из инета. На всякий случай даю дизассемблированный текст, то что для меня создал IAR: Код crc_table: \ 00000000 5E00E2BC3F61 DB 0, 94, 188, 226, 97, 63, 221, 131, 194, 156, 126, 32, 163, 253, 31 \ 83DD9CC2207E \ FDA31F \ 0000000F 9D4121C3FC7F DB 65, 157, 195, 33, 127, 252, 162, 64, 30, 95, 1, 227, 189, 62, 96 \ 40A25F1EE301 \ 3EBD60 \ 0000001E DC827D23C19F DB 130, 220, 35, 125, 159, 193, 66, 28, 254, 160, 225, 191, 93, 3, 128 \ 1C42A0FEBFE1 \ 035D80 \ 0000002D 3CDEBE6202E0 DB 222, 60, 98, 190, 224, 2, 92, 223, 129, 99, 61, 124, 34, 192, 158 \ DF5C63817C3D \ C0229E \ 0000003C 431DFFA11846 DB 29, 67, 161, 255, 70, 24, 250, 164, 39, 121, 155, 197, 132, 218, 56 \ A4FA7927C59B \ DA8438 \ 0000004B E56659BBDB07 DB 102, 229, 187, 89, 7, 219, 133, 103, 57, 186, 228, 6, 88, 25, 71 \ 6785BA3906E4 \ 195847 \ 0000005A FBA526789AC4 DB 165, 251, 120, 38, 196, 154, 101, 59, 217, 135, 4, 90, 184, 230, 167 \ 3B6587D95A04 \ E6B8A7 \ 00000069 1BF9C6457A98 DB 249, 27, 69, 198, 152, 122, 36, 248, 166, 68, 26, 153, 199, 37, 123 \ F82444A6991A \ 25C77B \ 00000078 643AD886055B DB 58, 100, 134, 216, 91, 5, 231, 185, 140, 210, 48, 110, 237, 179, 81 \ B9E7D28C6E30 \ B3ED51 \ 00000087 4E0FF2102FAC DB 15, 78, 16, 242, 172, 47, 113, 147, 205, 17, 79, 173, 243, 112, 46 \ 937111CDAD4F \ 70F32E \ 00000096 92CC8DD3316F DB 204, 146, 211, 141, 111, 49, 178, 236, 14, 80, 175, 241, 19, 77, 206 \ ECB2500EF1AF \ 4D13CE \ 000000A5 72906D2CD133 DB 144, 114, 44, 109, 51, 209, 143, 12, 82, 176, 238, 50, 108, 142, 208 \ 0C8FB05232EE \ 8E6CD0 \ 000000B4 0D53B1EFAEF0 DB 83, 13, 239, 177, 240, 174, 76, 18, 145, 207, 45, 115, 202, 148, 118 \ 124CCF91732D \ 94CA76 \ 000000C3 AB2817F50849 DB 40, 171, 245, 23, 73, 8, 86, 180, 234, 105, 55, 213, 139, 87, 9, 235 \ B45669EAD537 \ 578BEB09 \ 000000D3 36B58A6895D4 DB 181, 54, 104, 138, 212, 149, 203, 41, 119, 244, 170, 72, 22, 233 \ 29CBF47748AA \ E916 \ 000000E1 55B7880B34D6 DB 183, 85, 11, 136, 214, 52, 106, 43, 117, 151, 201, 74, 20, 246, 168 \ 2B6A97754AC9 \ F614A8 \ 000000F0 2A7496C84B15 DB 116, 42, 200, 150, 21, 75, 169, 247, 182, 232, 10, 84, 215, 137, 107 \ F7A9E8B6540A \ 89D76B \ 000000FF 35 DB 53 12 0x00,0x5E,0xBC,0xE2,0x61,0x3F,0xDD,0x83,0xC2,0x9C,0x7E,0x20,0xA3,0xFD,0x1F, 0x41, 13 0x9D,0xC3,0x21,0x7F,0xFC,0xA2,0x40,0x1E,0x5F,0x01,0xE3,0xBD,0x3E,0x60,0x82, 0xDC, 14 0x23,0x7D,0x9F,0xC1,0x42,0x1C,0xFE,0xA0,0xE1,0xBF,0x5D,0x03,0x80,0xDE,0x3C, 0x62, 15 0xBE,0xE0,0x02,0x5C,0xDF,0x81,0x63,0x3D,0x7C,0x22,0xC0,0x9E,0x1D,0x43,0xA1, 0xFF, 16 0x46,0x18,0xFA,0xA4,0x27,0x79,0x9B,0xC5,0x84,0xDA,0x38,0x66,0xE5,0xBB,0x59, 0x07, 17 0xDB,0x85,0x67,0x39,0xBA,0xE4,0x06,0x58,0x19,0x47,0xA5,0xFB,0x78,0x26,0xC4, 0x9A, 18 0x65,0x3B,0xD9,0x87,0x04,0x5A,0xB8,0xE6,0xA7,0xF9,0x1B,0x45,0xC6,0x98,0x7A, 0x24, 19 0xF8,0xA6,0x44,0x1A,0x99,0xC7,0x25,0x7B,0x3A,0x64,0x86,0xD8,0x5B,0x05,0xE7, 0xB9, 20 0x8C,0xD2,0x30,0x6E,0xED,0xB3,0x51,0x0F,0x4E,0x10,0xF2,0xAC,0x2F,0x71,0x93, 0xCD, 21 0x11,0x4F,0xAD,0xF3,0x70,0x2E,0xCC,0x92,0xD3,0x8D,0x6F,0x31,0xB2,0xEC,0x0E, 0x50, 22 0xAF,0xF1,0x13,0x4D,0xCE,0x90,0x72,0x2C,0x6D,0x33,0xD1,0x8F,0x0C,0x52,0xB0, 0xEE, 23 0x32,0x6C,0x8E,0xD0,0x53,0x0D,0xEF,0xB1,0xF0,0xAE,0x4C,0x12,0x91,0xCF,0x2D, 0x73, 24 0xCA,0x94,0x76,0x28,0xAB,0xF5,0x17,0x49,0x08,0x56,0xB4,0xEA,0x69,0x37,0xD5, 0x8B, 25 0x57,0x09,0xEB,0xB5,0x36,0x68,0x8A,0xD4,0x95,0xCB,0x29,0x77,0xF4,0xAA,0x48, 0x16, 26 0xE9,0xB7,0x55,0x0B,0x88,0xD6,0x34,0x6A,0x2B,0x75,0x97,0xC9,0x4A,0x14,0xF6, 0xA8, 27 0x74,0x2A,0xC8,0x96,0x15,0x4B,0xA9,0xF7,0xB6,0xE8,0x0A,0x54,0xD7,0x89,0x6B, 0x35}; 28 29 //Вычисляет и возвращает crc8
\ In segment CODE, align 2, keep-with-next 30 void do_crc_8(unsigned char byte, unsigned char *crc8) \ do_crc_8: 31 { 32 *crc8=crc_table[(*crc8^byte)]; \ 00000000 .... LDI R20, LOW(crc_table) \ 00000002 .... LDI R21, (crc_table) >> 8 \ 00000004 01F9 MOVW R31:R30, R19:R18 \ 00000006 8160 LD R22, Z \ 00000008 E010 LDI R17, 0 \ 0000000A 2706 EOR R16, R22 \ 0000000C 0F40 ADD R20, R16 \ 0000000E 1F51 ADC R21, R17 \ 00000010 01FA MOVW R31:R30, R21:R20 \ 00000012 9104 LPM R16, Z \ 00000014 01F9 MOVW R31:R30, R19:R18 \ 00000016 8300 ST Z, R16 33 } \ 00000018 9508 RET
Сообщение отредактировал haker_fox - Nov 17 2005, 06:54
--------------------
Выбор.
|
|
|
|
|
Nov 17 2005, 07:39
|
Местный
  
Группа: Свой
Сообщений: 298
Регистрация: 29-08-05
Пользователь №: 8 064

|
Держи еще такой вариант. ;------------------- CRC FOR N BYTES ; var in : FSR (pointer to 1-st byte), crc_byte_count (# bytes) ; var out: crc_my ; var local: W, R0, R1 crc_n clrf crc_my crc_byte MOVLF .8,crc_bit_count movf INDF0,W movwf R1 crc_bit xorwf crc_my, W movwf R0 movlb 0x0F bcf STATUS,C movlb 0x00 rrcf R0, W movf crc_my, W movlb 0x0F btfsc STATUS,C xorlw 18h movlb 0x00 movwf R0 rrcf R0, W movwf crc_my rrcf R1 movf R1, W decfsz crc_bit_count goto crc_bit movlb 0x0F infsnz FSR0L incf FSR0H movlb 0x00 decfsz crc_byte_count goto crc_byte return ;------------------- CRC END Это правда для мелкочипов было, так что movlb можешь игнорировать. Идея CRC заключается в генерации выходного кода на основе полинома. так же как в генераторах псевдослучайного воздействия есть наиболее подходящие полиномы дающие наилучьшее кодирование... или наибольший отлов ошибок... В 8-битном это 0x18 Данный вариант сократит код, но удлинит время обработки.
|
|
|
|
|
Nov 17 2005, 08:11
|
Местный
  
Группа: Свой
Сообщений: 298
Регистрация: 29-08-05
Пользователь №: 8 064

|
Цитата(Pyku_He_oTTyda @ Nov 17 2005, 11:56)  А как вручную подсчитать CRC для ключа с номером "00000ССА061Е", на калькуляторе у меня что то не совпало с оригинальным  1. 00h 00h 2. 00h 00h 3. 0Ch A3h 4. CAh F9h 5. 06h 35h 6. 1Eh 03h Оригинал то какой ??? и чего они там пишут по поводу начального значения и полинома ?
|
|
|
|
|
Nov 17 2005, 08:32
|

Профессионал
    
Группа: Свой
Сообщений: 1 751
Регистрация: 4-08-05
Из: Великие Луки
Пользователь №: 7 360

|
CRC ASSEMBLY LANGUAGE PROCEDURE
DO_CRC: CRC_LOOP: ZERO: PUSH ACC PUSH B PUSH ACC MOV B,#8 XRL A,CRC RRC A MOV A,CRC JNC ZERO XRL A,#18H RRC A MOV CRC,A POP ACC RR A PUSH ACC DJNZ B,CRC_LOOP POP ACC POP B POP ACC RET CRC GENERATION
To validate the data transmitted from the DS1990A, the bus master may generate a CRC value from the data as it is received. This generated value is compared to the value stored in the last eight bits of the DS1990A. The bus master computes the CRC over the 8-bit family code and all 48 ID number data bits, but not over the stored CRC value itself. If the two CRC values match, the transmission is error-free. An example of how to generate the CRC using assembly language software is shown in Table 1. This assembly language code is written for the DS5000 Soft microcontroller which is compatible with the 8031/51 Microcontroller family. The procedure DO_CRC calculates the cumulative CRC of all the bytes passed to it in the accumulator. It should be noted that the variable CRC needs to be initialized to 0 before the procedure is executed. Each byte of the data is then placed in the accumulator and DO-CRC is called to update the CRC variable. After all the data has been passed to DO_CRC, the variable CRC will contain the result. The equivalent polynomial function of this software routine is:
CRC = x^8+ x^5+ x^4+ 1
--------------------
Андрей Смирнов
|
|
|
|
|
Nov 17 2005, 08:35
|
Частый гость
 
Группа: Свой
Сообщений: 124
Регистрация: 27-05-05
Из: St.-P
Пользователь №: 5 462

|
Есть хорошая статья про CRC. Многое становится понятно.
|
|
|
|
|
Nov 17 2005, 10:05
|
Группа: Новичок
Сообщений: 9
Регистрация: 28-01-05
Пользователь №: 2 265

|
Цитата(Pyku_He_oTTyda @ Nov 17 2005, 08:59)  Подскажите, как правильно посчитать на ассемблере контрольную сумму ключа I-BUTTON? Например так: ldi tempA,$18 ldi tempC,8 ; Счетчик бит rk_CRCloop: ;----------------- Вычисление CRC байта -------------- mov tempD,current_byte eor tempD,tempB ror tempD mov tempD,tempB brcc rk_zero eor tempD,tempA rk_zero: ror tempD mov tempB,tempD lsr current_byte dec tempC brne rk_CRCloop rjmp rk_NEXTbyte_loop
|
|
|
|
|
Nov 17 2005, 10:46
|
Участник

Группа: Новичок
Сообщений: 16
Регистрация: 28-10-05
Из: Москва
Пользователь №: 10 240

|
CRC8 на С, не табличная версия: Код void Update_CRC(char in, char *crc) { #define POLYNOMIAL 0x1D // x^8 + x^4 + x^3 + x^2 + 1 *crc = *crc ^ in; for (unsigned char i=0; i<8; i++) { *crc = (*crc & 0x80)? (*crc << 1) ^ POLYNOMIAL : (*crc << 1); } }
Сообщение отредактировал Antony Ugolev - Nov 17 2005, 10:46
--------------------
Remember about the Main...
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|