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

 
 
> И снова про CRC, Что надо сказать IAR-у, чтобы он считал CRC как для пакетов MODBUS?
spf
сообщение Dec 12 2007, 07:05
Сообщение #1


Странник
****

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



Привет!

Как работает пример получения CRC кода понятно, все работает.

В боевом коде программы имеются функции по работе с пакетами Modbus (вычисление CRC).
Заставить IAR посчитать CRC так же, как считает проверенная функция вычисления CRC для Modbus
не удалось. Может кто-то это прошел?

Не хотелось бы иметь две таблицы для расчета CRC.

PS: IAR 3.42 (MSP430)


--------------------
"Как много есть на свете вещей, которые мне не нужны!" Сократ
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Baser
сообщение Dec 13 2007, 10:36
Сообщение #2


Просто Che
*****

Группа: Свой
Сообщений: 1 567
Регистрация: 22-05-07
Из: ExUSSR
Пользователь №: 27 881



Цитата(spf @ Dec 13 2007, 05:51) *
Линкеру говорим:

-Hff
-J2,crc16,,Flash_CRC,INFO=(CODE)4000-ffff

Линкер должен считать crc не всей памяти, а от её начала до месторасположения CRC.
То есть сегмент INFO у вас должен находится в конце памяти:
Код
-Z(CODE)INFO#FFFF

а строка вычисления CRC совсем другая, там куча ошибок. Примерно так:
Код
-J2,crc=A001,m,Flash_CRC,INFO,,FFFF=(CODE)4000-FFFD

да и то я сомневаюсь, что получится, посколько там есть еще какая то лажа, с которой я ещё не разобрался. Дайте пример CRC: несколько байт и верную сумму, тогда когда доберусь до работы, попробую.

Цитата(rezident @ Dec 13 2007, 00:26) *
CRC16 ModBus вместе полиномом, таблицей и примером реализации на Си имеются в спецификации ModBus over serial line.
Выше я уже привел пример алгоритма расчета CRC16 именно с тем полиномом, который используется в ModBus. Что же вам еще нужно-то? Помогайте

А вы бы товарищ, лучше бы дали несколько конкретных цифр вместо ёрничанья. Или все должны знать алгоритм расчета CRC Modbus? В том что вы дали не ни слова о Modbus.
Go to the top of the page
 
+Quote Post
spf
сообщение Dec 13 2007, 11:56
Сообщение #3


Странник
****

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



Цитата(Baser @ Dec 13 2007, 15:36) *
Линкер должен считать crc не всей памяти, а от её начала до месторасположения CRC.

Попрошу не отдаляться от темы.
У меня CRC лежит именно там, где мне это надо. Не об этом речь. Пример приведен из рабочего вариант для простого CRC16(CCITT), в нем нет ошибок.


Что только не предлагают, но все не по теме...

Вот пример кода для расчета CRC для MODBUS
Код
unsigned int Crc16AddBlock(unsigned int cur_crc, unsigned char *p_data, unsigned int data_len)
{
        do
        {
            unsigned int   i = 8;    

            cur_crc = cur_crc ^ *p_data++;

            do
            {
                if (0x0001 & cur_crc)
                {
                    cur_crc >>= 1;    
                    cur_crc  ^=  0xA001;
                }
                else                          
                {
                    cur_crc >>= 1;      
                }
            }
            while (--i);
        }
        while (--data_len);
    return  cur_crc;
}


PS: только не надо ёрничанья


--------------------
"Как много есть на свете вещей, которые мне не нужны!" Сократ
Go to the top of the page
 
+Quote Post
Baser
сообщение Dec 13 2007, 13:20
Сообщение #4


Просто Che
*****

Группа: Свой
Сообщений: 1 567
Регистрация: 22-05-07
Из: ExUSSR
Пользователь №: 27 881



Цитата(spf @ Dec 13 2007, 13:56) *
Попрошу не отдаляться от темы.
У меня CRC лежит именно там, где мне это надо. Не об этом речь. Пример приведен из рабочего вариант для простого CRC16(CCITT), в нем нет ошибок.

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

Конкретно по теме smile.gif
Я попробовал вариант суммы Модбаса, получается. Правда только при условии нулевого начального значения CRC. Проверьте такой вариант:
Код
-J2,crc=8005,m,Flash_CRC,INFO,,0=(CODE)4000-FFFF

Если хочется считать с начальным значением CRC==0xFFFF, то ИАР выдает что-то непонятное.
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 24th August 2025 - 03:30
Рейтинг@Mail.ru


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