|
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 19 2008, 20:27
|

Нечётный пользователь.
     
Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417

|
Цитата(Rst7 @ Sep 19 2008, 19:06)  Ну и пара огрехов других, например, надо сдвигать yl влево на один бит. Это ладно, я не это имел ввиду, когда писал Цитата(ReAl @ Sep 19 2008, 18:16)  И что, именно этот веник действительно метёт? Даже если исправить эти мелкие огрехи, в переводе на С тот ассемблерный кусок выглядит приблизительно так: Код extern uint16_t crctable[32]; uint16_t crc;
void crc_update(uint8_t data) { crc ^= crctable[ data & 0x0F ]; crc ^= crctable[ 16 + (data >>4) ]; } Что-то не пахнет тут CRC. Мне кажется, что это ничем не лучше простой XORки всех байтов сообщения. Независимо от таблицы реакция на последовательность 0xA5 0xC3 будет та же, что и на 0xC3 0xA5 или на 0xC5 0xA3. А после того, как заставить этот код считать таки CRC, да табличку положить во флеш и получить +4 такта на переходе от LD к LPM - выйдет дольше, чем обсуждавшиеся методы.
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
|
Sep 19 2008, 23:17
|

Ambidexter
    
Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282

|
Цитата(ReAl @ Sep 19 2008, 19:27)  в переводе на С тот ассемблерный кусок выглядит приблизительно так: Код extern uint16_t crctable[32]; uint16_t crc; void crc_update(uint8_t data) { crc ^= crctable[ data & 0x0F ]; crc ^= crctable[ 16 + (data >>4) ]; } Что-то не пахнет тут CRC. Я бы ещё усилил, примерно так Код void crc_update(uint8_t data) { crc ^= crctable2[ data ]; } А это чисто табличный метод счёта crc. Возражения есть(:-)? В посте #18 я дал чисто идею реализации. Посчитал поточнее, получился 21 такт, включая загрузку байта из буфера и счётчик байт. В симуляторе вроде дышит, доберусь до работы, проверю поточнее. А может у кого под рукой есть тестовая строка с вычисленной crc?
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
Sep 20 2008, 07:16
|

Нечётный пользователь.
     
Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417

|
Цитата(=GM= @ Sep 20 2008, 02:17)  Я бы ещё усилил, примерно так Код void crc_update(uint8_t data) { crc ^= crctable2[ data ]; } Кажется, речь шла о коде, который не вычисляет CRC с помощью таблички для 4 битов, а не при помощи таблички для 8 битов. Хотя с 256-словной таблицей алгоритм не вычисляет CRC быстрее, спору нет. Цитата(=GM= @ Sep 20 2008, 02:17)  А это чисто табличный метод счёта crc. Возражения есть(:-)? В посте #18 я дал чисто идею реализации. Да какие уж тут возражения... "слов нет"
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
Сообщений в этой теме
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 Rst7 Цитата+1 Оптимальнее чем в avr-gcc для crc16 и не ... Sep 18 2008, 11:42 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    =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
|
|
|