|
CRC16(ModBus) на С для ATmega128, помогите разобраться |
|
|
|
Sep 17 2008, 07:38
|

Участник

Группа: Участник
Сообщений: 35
Регистрация: 30-10-07
Из: Москва
Пользователь №: 31 896

|
Всем доброе время суток! Прошу помочь мне разобраться в С коде.Сам только недавно начал осваивать. нужно реализовать CRC16 для ModBus. Я знаю,что есть куча готовых реализаций.Простым(последовательным) и табличным способом. Но хочу реализовать сам. У меня проблема в том,что для вычисления CRC нужно смотреть на состояние младшого бита. Если "1" - то выполнять XOR,если нет,то крутить дальше. Вот мой код: int crc16 (unsigned char a) // a - 8-bit data for calculation CRC { unsigned int reg, tmp; int i; reg = 0xFFFF; // step1: initial loading of 16-bit register reg ^= (unsigned int)a; // step2: a XOR reg for(i = 0;i<8;i++) //step3: 8-iteration to calculate CRC { reg >>= 1; tmp = reg; tmp <<= 15; if(tmp == 0x8000) reg ^= 0xA001; // checking: if LSB = "1" reg=reg^0xA001 } return reg; } проверку я выолняю поразрядным сдвигом 16-битного reg влево, и, если там "1",то xor. ниже преведена другая реализация CRC16 и она работет корректно!!!!int crc16 (unsigned char a) { unsigned int reg; unsigned char i, tmp; reg = 0xFFFF; reg ^= (unsigned int)a; for(i = 0;i<8;i++) { tmp = (unsigned char)(reg&0x0001); reg >>= 1; if(tmp) reg ^= 0xA001; } return reg; } Поясните,что не так в первой реализачии.
|
|
|
|
|
 |
Ответов
|
Sep 18 2008, 11:42
|

Йа моск ;)
     
Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610

|
Цитата +1 Оптимальнее чем в avr-gcc для crc16 и не сделать Не кажи "гоп"  Код __z UREG CRC16stage2(UINT8 uchCRCLo, UINT8 uchCRCHi, UREG l, UREG write, UINT8 *puchMsg, UREG i128,UREG i1, UREG i192);
UREG CRC16(UINT8 *puchMsg, UREG usDataLen, UREG write ) { return CRC16stage2(0xFF,0xFF,usDataLen,write,puchMsg,128,1,192); }
#pragma optimize=no_inline __z UREG CRC16stage2(UINT8 uchCRCLo, UINT8 uchCRCHi, UREG l, UREG write, UINT8 *puchMsg, UREG i128, UREG i1, UREG i192) { do { UINT8 parity; UINT16 tmp16; parity=*puchMsg++; parity^=uchCRCLo; uchCRCLo=uchCRCHi; tmp16=__multiply_unsigned(parity,i128); uchCRCHi=tmp16>>8; uchCRCLo^=tmp16; tmp16>>=1; uchCRCHi^=tmp16>>8; uchCRCLo^=tmp16; parity^=tmp16>>8; parity^=parity>>1; parity^=__swap_nibbles(parity); if (parity&1) { uchCRCLo^=i1; uchCRCHi^=i192; } } while(--l); if (write) { *puchMsg++=uchCRCLo; *puchMsg++=uchCRCHi; } else { UREG k; if ((k=*puchMsg++-uchCRCLo)) return k; return *puchMsg++-uchCRCHi; } return 0; } Код RSEG CODE:CODE:NOROOT(1) // 74 UREG CRC16(UINT8 *puchMsg, UREG usDataLen, UREG write ) CRC16: // 75 { MOVW R31:R30, R17:R16 // 76 return CRC16stage2(0xFF,0xFF,usDataLen,write,puchMsg,128,1,192); LDI R22, 192 LDI R21, 1 LDI R20, 128 LDI R17, 255 LDI R16, 255 REQUIRE CRC16stage2 ; // Fall through to label CRC16stage2 // 77 } // 78 // 79 #pragma optimize=no_inline
RSEG CODE:CODE:NOROOT(1) // 80 __z UREG CRC16stage2(UINT8 uchCRCLo, UINT8 uchCRCHi, UREG l, UREG write, UINT8 *puchMsg, UREG i128, UREG i1, UREG i192) CRC16stage2: // 81 { MOV R2, R16 MOV R23, R17 // 82 do // 83 { // 84 UINT8 parity; // 85 UINT16 tmp16; // 86 parity=*puchMsg++; ??CRC16stage2_0: LD R3, Z+ // 87 parity^=uchCRCLo; EOR R3, R2 // 88 uchCRCLo=uchCRCHi; MOV R2, R23 // 89 tmp16=__multiply_unsigned(parity,i128); MUL R3, R20 // 90 uchCRCHi=tmp16>>8; MOV R23, R1 // 91 uchCRCLo^=tmp16; EOR R2, R0 // 92 tmp16>>=1; LSR R1 ROR R0 EOR R23, R1 // 93 uchCRCHi^=tmp16>>8; // 94 uchCRCLo^=tmp16; EOR R2, R0 // 95 parity^=tmp16>>8; EOR R3, R1 // 96 parity^=parity>>1; MOV R16, R3 LSR R16 EOR R3, R16 // 97 parity^=__swap_nibbles(parity); MOV R16, R3 SWAP R16 EOR R3, R16 // 98 if (parity&1) BST R3, 0 BRTC ??CRC16stage2_1 // 99 { // 100 uchCRCLo^=i1; EOR R2, R21 // 101 uchCRCHi^=i192; EOR R23, R22 // 102 } // 103 } // 104 while(--l); ??CRC16stage2_1: DEC R18 BRNE ??CRC16stage2_0 // 105 if (write) TST R19 BREQ ??CRC16stage2_2 // 106 { // 107 *puchMsg++=uchCRCLo; ST Z+, R2 // 108 *puchMsg++=uchCRCHi; ST Z, R23 // 109 } // 110 else // 111 { // 112 UREG k; // 113 if ((k=*puchMsg++-uchCRCLo)) return k; // 114 return *puchMsg++-uchCRCHi; // 115 } // 116 return 0; LDI R16, 0 RET ??CRC16stage2_2: LD R16, Z+ SUB R16, R2 BRNE ??CRC16stage2_3 LD R16, Z SUB R16, R23 ??CRC16stage2_3: RET // 117 } 20.5 тактов против 23 на собственно расчет следующего значения CRC16.
--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
|
|
|
|
Сообщений в этой теме
sf9 CRC16(ModBus) на С для ATmega128 Sep 17 2008, 07:38 Sat360 В первой реализации регистр сдвигается ДО анализа ... Sep 17 2008, 07:46 Сергей Борщ В работающей программе сначала запоминается младши... Sep 17 2008, 07:55 sf9 СПАСИБО ОГРОМНОЕ!!!
Я понял,просто ... Sep 17 2008, 08:30 Rst7 А меня вот последнее время поперло по-другому CRC1... Sep 17 2008, 08:52 ReAl Цитата(Rst7 @ Sep 17 2008, 11:52) А меня ... Sep 17 2008, 10:29  singlskv Цитата(ReAl @ Sep 17 2008, 14:29) У avr-g... Sep 17 2008, 17:43 sf9 Кстати,в компиляторах и САПРах для МСs как можно п... Sep 17 2008, 09:15 Rst7 Никак. Только ручками. Ну или в симуляторе выполни... Sep 17 2008, 09:29 sf9 Цитата(Rst7 @ Sep 17 2008, 13:29) Никак. ... Sep 17 2008, 09:43 Rst7 ЦитатаЕсть ли настройки в компиляторах или САПРах ... Sep 17 2008, 09:50 sf9 Спасибо большое!
Побрёл я наращивать головные ... Sep 17 2008, 10:04 sf9 По поводу crc16.h абсолютно согласен,вчера проверя... Sep 18 2008, 09:52 singlskv Цитата(Rst7 @ Sep 18 2008, 15:42) Не кажи... Sep 18 2008, 20:25  =GM= А что если сделать две таблицы на биты <7-4... Sep 19 2008, 11:20   Сергей Борщ Цитата(=GM= @ Sep 19 2008, 14:20) А что е... Sep 19 2008, 11:47    =GM= Идея простая, как веник. Ну вот как-то так, таблиц... Sep 19 2008, 12:07     ReAl Цитата(=GM= @ Sep 19 2008, 15:07) Идея пр... Sep 19 2008, 15:16 Rst7 ЦитатаИдея простая, как веник.
Только таблички в ... Sep 19 2008, 16:06 ReAl Цитата(Rst7 @ Sep 19 2008, 19:06) Ну и па... Sep 19 2008, 20:27  =GM= Цитата(ReAl @ Sep 19 2008, 19:27) в перев... Sep 19 2008, 23:17   ReAl Цитата(=GM= @ Sep 20 2008, 02:17) Я бы ещ... Sep 20 2008, 07:16    =GM= Цитата(ReAl @ Sep 20 2008, 06:16) Кажется... Sep 20 2008, 17:36     ReAl Цитата(=GM= @ Sep 20 2008, 20:36) Речь я ... Sep 20 2008, 20:51  =GM= Цитата(ReAl @ Sep 19 2008, 19:27) Что-то ... Sep 21 2008, 22:30   ReAl Вы так упорствуете в своих заблуждениях...
Цитата(... Sep 22 2008, 11:09    =GM= Ну, я не упорствую, но вот это ваше "return c... Sep 23 2008, 11:51     singlskv Цитата(=GM= @ Sep 23 2008, 15:51) (Замечу... Sep 23 2008, 18:48     ReAl Цитата(=GM= @ Sep 23 2008, 14:51) Ну, я н... Sep 23 2008, 21:33      =GM= Цитата(ReAl @ Sep 23 2008, 20:33) Вы сами... Sep 23 2008, 23:18     defunct Цитата(=GM= @ Sep 23 2008, 14:51) Для ваш... Sep 29 2008, 19:50      =GM= Цитата(defunct @ Sep 29 2008, 18:50) У ва... Sep 30 2008, 09:26       defunct Цитата(=GM= @ Sep 30 2008, 12:26) А вы эт... Sep 30 2008, 13:13        =GM= Цитата(defunct @ Sep 30 2008, 12:13) Я не... Sep 30 2008, 15:35         Сергей Борщ Цитата(=GM= @ Sep 30 2008, 18:35) Я ж вам... Sep 30 2008, 16:04          =GM= Цитата(Сергей Борщ @ Sep 30 2008, 15:04) ... Sep 30 2008, 21:49           Сергей Борщ Цитата(=GM= @ Oct 1 2008, 00:49) Во, Серг... Oct 3 2008, 09:23            =GM= Вот укороченная таблица для модбаса
Код;a short cr... Oct 3 2008, 12:43             defunct Цитата(=GM= @ Oct 3 2008, 14:43) Вот тест... Jan 9 2009, 00:07              =GM= Цитата(defunct @ Jan 9 2009, 00:07) =GM=,... Jan 9 2009, 11:38         defunct Цитата(=GM= @ Sep 30 2008, 18:35) Я ж вам... Sep 30 2008, 16:46      =GM= Цитата(defunct @ Sep 29 2008, 18:50) Mодб... Oct 2 2008, 15:27       defunct Цитата(=GM= @ Oct 2 2008, 18:27) defuct, ... Oct 2 2008, 16:37        =GM= Цитата(defunct @ Oct 2 2008, 15:37) Если ... Oct 2 2008, 20:41      =GM= Проверил ещё раз, получаются другие результаты, но... Oct 3 2008, 08:30 dred73 Держи рабочие функции по расчету CRC8 и CRC16
Код... Jan 11 2009, 07:04 Kovrov Ребят, может кто нибудь оканчательный исходник выл... Aug 12 2009, 09:59 =GM= Код в посте #28, таблица для модбаса и тестовые ве... Aug 12 2009, 22:03 Kovrov В этом примере таблица находится в рам пусть и 64 ... Aug 13 2009, 13:38
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|