реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Подсчет СRC
Pyku_He_oTTyda
сообщение Nov 17 2005, 05:59
Сообщение #1


Профессионал
*****

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



Подскажите, как правильно посчитать на ассемблере контрольную сумму ключа I-BUTTON?


--------------------
Андрей Смирнов
Go to the top of the page
 
+Quote Post
haker_fox
сообщение Nov 17 2005, 06:19
Сообщение #2


Познающий...
******

Группа: Свой
Сообщений: 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)];
}


--------------------
Выбор.
Go to the top of the page
 
+Quote Post
Pyku_He_oTTyda
сообщение Nov 17 2005, 06:28
Сообщение #3


Профессионал
*****

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



Попробую разобратся, вроде понятно немного.
А можно просто в двух словах изложить алгоритм подсчета, как он делается...


--------------------
Андрей Смирнов
Go to the top of the page
 
+Quote Post
haker_fox
сообщение Nov 17 2005, 06:37
Сообщение #4


Познающий...
******

Группа: Свой
Сообщений: 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


--------------------
Выбор.
Go to the top of the page
 
+Quote Post
arttab
сообщение Nov 17 2005, 07:33
Сообщение #5


Профессионал
*****

Группа: Свой
Сообщений: 1 432
Регистрация: 7-12-04
Из: Новосибирск
Пользователь №: 1 371



это табличный метод (CRC8) - для скорости.
Вот обычный, но на CRC16

WORD CalcCRC(BYTE *pBuff, BYTE n)
{
unsigned char i,carry;
WORD crc16=0xFFFF;
while(n)
{
crc16 ^=*pBuff;
for (i = 0; i < 8; i++)
{
carry = crc16 & 1;
crc16 >>= 1;
if (carry) crc16 ^= 0xA001;
}
n--;
pBuff++;
}
return crc16;
}
вместо WORD пишите int. Опять же это на си.

Сообщение отредактировал arttab - Nov 17 2005, 07:33


--------------------
OrCAD, Altium,IAR, AVR....
Go to the top of the page
 
+Quote Post
andrvisht
сообщение Nov 17 2005, 07:39
Сообщение #6


Местный
***

Группа: Свой
Сообщений: 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
Данный вариант сократит код, но удлинит время обработки.
Go to the top of the page
 
+Quote Post
Pyku_He_oTTyda
сообщение Nov 17 2005, 07:56
Сообщение #7


Профессионал
*****

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



А как вручную подсчитать CRC для ключа с номером "00000ССА061Е", на калькуляторе у меня что то не совпало с оригинальнымsad.gif


--------------------
Андрей Смирнов
Go to the top of the page
 
+Quote Post
andrvisht
сообщение Nov 17 2005, 08:11
Сообщение #8


Местный
***

Группа: Свой
Сообщений: 298
Регистрация: 29-08-05
Пользователь №: 8 064



Цитата(Pyku_He_oTTyda @ Nov 17 2005, 11:56) *
А как вручную подсчитать CRC для ключа с номером "00000ССА061Е", на калькуляторе у меня что то не совпало с оригинальнымsad.gif

1. 00h 00h
2. 00h 00h
3. 0Ch A3h
4. CAh F9h
5. 06h 35h
6. 1Eh 03h

Оригинал то какой ???
и чего они там пишут по поводу начального значения и полинома ?
Go to the top of the page
 
+Quote Post
Pyku_He_oTTyda
сообщение Nov 17 2005, 08:32
Сообщение #9


Профессионал
*****

Группа: Свой
Сообщений: 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


--------------------
Андрей Смирнов
Go to the top of the page
 
+Quote Post
NULL
сообщение Nov 17 2005, 08:35
Сообщение #10


Частый гость
**

Группа: Свой
Сообщений: 124
Регистрация: 27-05-05
Из: St.-P
Пользователь №: 5 462



Есть хорошая статья про CRC. Многое становится понятно.
Прикрепленные файлы
Прикрепленный файл  crcguide.pdf ( 199.59 килобайт ) Кол-во скачиваний: 432
 
Go to the top of the page
 
+Quote Post
andrvisht
сообщение Nov 17 2005, 08:52
Сообщение #11


Местный
***

Группа: Свой
Сообщений: 298
Регистрация: 29-08-05
Пользователь №: 8 064



Ну тогда все верно.
У меня данный код на DS18B20 работает.
И все таки что он вычитывает

код устройства - ?
48 бит ROM - ?
CRC8 - ?
а то проверять не с чем...
Go to the top of the page
 
+Quote Post
PaulS
сообщение Nov 17 2005, 10:05
Сообщение #12





Группа: Новичок
Сообщений: 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
Go to the top of the page
 
+Quote Post
Antony Ugolev
сообщение Nov 17 2005, 10:46
Сообщение #13


Участник
*

Группа: Новичок
Сообщений: 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...
Go to the top of the page
 
+Quote Post
Pyku_He_oTTyda
сообщение Nov 17 2005, 10:48
Сообщение #14


Профессионал
*****

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



Cпасибо! Буду вечером осмысливать, разбиратся.
Тему не закрываюsmile.gif
попробую вручную получить требуемое значение, потом в код переводить.
Жаль нет готового исходника, апнота например


--------------------
Андрей Смирнов
Go to the top of the page
 
+Quote Post
Pyku_He_oTTyda
сообщение Nov 17 2005, 12:09
Сообщение #15


Профессионал
*****

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



&-rey буду премного благодарен!
Ящик cam()mart.ru
В свою очередь обязуюсь выполнять авторские права.


--------------------
Андрей Смирнов
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 16th July 2025 - 08:31
Рейтинг@Mail.ru


Страница сгенерированна за 0.01569 секунд с 7
ELECTRONIX ©2004-2016