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

 
 
 
Reply to this topicStart new topic
> Программа расчета таблицы, вычисления CRC16, входные данные полином, выходные – таблица.
Alex ma
сообщение Aug 17 2006, 10:55
Сообщение #1


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

Группа: Новичок
Сообщений: 81
Регистрация: 9-08-06
Пользователь №: 19 445



Существует быстрый расчет CRC16 табличным способом, даже есть таблица для протокола ModBus, может, существует такая программа под Windows, которая формирует эту таблицу для заданного полинома. Например, полином 8005. Может, есть у кого?
Загружать контроллер циклом расчета CRC16, когда ему нужно быстро обработать принятую посылку и выдать команду. Циклический расчет происходит слишком долго.
Go to the top of the page
 
+Quote Post
prottoss
сообщение Aug 17 2006, 11:29
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Цитата(Alex ma @ Aug 17 2006, 18:55) *
Существует быстрый расчет CRC16 табличным способом, даже есть таблица для протокола ModBus, может, существует такая программа под Windows, которая формирует эту таблицу для заданного полинома. Например, полином 8005. Может, есть у кого?
Загружать контроллер циклом расчета CRC16, когда ему нужно быстро обработать принятую посылку и выдать команду. Циклический расчет происходит слишком долго.
Вот отличные статьи на интересующую тему и исходник консольной программы, которая была сделанна по документам, выложенным архиве

Че то CPP не могу кинуть(

Сообщение отредактировал prottoss - Aug 17 2006, 11:26
Прикрепленные файлы
Прикрепленный файл  crc1.zip ( 263.52 килобайт ) Кол-во скачиваний: 330
Прикрепленный файл  main.rar ( 2.94 килобайт ) Кол-во скачиваний: 299
 


--------------------
Go to the top of the page
 
+Quote Post
Alex ma
сообщение Aug 17 2006, 15:38
Сообщение #3


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

Группа: Новичок
Сообщений: 81
Регистрация: 9-08-06
Пользователь №: 19 445



Цитата(prottoss @ Aug 17 2006, 17:29) *
Цитата(Alex ma @ Aug 17 2006, 18:55) *
Существует быстрый расчет CRC16 табличным способом, даже есть таблица для протокола ModBus, может, существует такая программа под Windows, которая формирует эту таблицу для заданного полинома. Например, полином 8005. Может, есть у кого?
Загружать контроллер циклом расчета CRC16, когда ему нужно быстро обработать принятую посылку и выдать команду. Циклический расчет происходит слишком долго.
Вот отличные статьи на интересующую тему и исходник консольной программы, которая была сделанна по документам, выложенным архиве

Че то CPP не могу кинуть(


Спасибо prottoss a14.gif
Go to the top of the page
 
+Quote Post
_artem_
сообщение Aug 17 2006, 22:28
Сообщение #4


учащийся
*****

Группа: Свой
Сообщений: 1 065
Регистрация: 29-10-05
Из: города контрастов
Пользователь №: 10 249



Можно вычисление crc рассредоточить по времени уменьшив обшее разовое время на его вычисление . Причем для большинства случаев crc проверка возможна ва самом теле прерывания.

Если готовый код по полиному то что внизу :
Код
ui16 ms_crc16(ui8 *msg_p, ui8 length)
{

    ui16 crc;
    ui8  msg_ptr, cnt;

    crc = 0xffff;

    for (msg_ptr = 0; msg_ptr < length; msg_ptr++)
    {
        crc = crc ^ msg_p[msg_ptr];

        for (cnt = 0; cnt < 8; cnt++)
        {
            if ( crc & 0x0001 == 1 )
            {
                crc >>= 1;
                crc = crc ^ 0xa001;                         // Reversed 0x8005 polynom
            }
            else
                crc >>= 1;
        }
    }
    return crc;
}


С самымм первым байтом начинаем инициализацию :

Код
                    rx_crc = 0xffff;                            //   init crc field

производим вычисление промежуточного значения для каждого принятого байта по вызову из тела прерывания
приема:
Код
                    rx_crc = rx_crc ^ byte;                     //   Calculate crc for one byte
                    for (cnt = 0; cnt < 8; cnt++)               //
                    {                                           //
                        if ( rx_crc & 0x0001 == 1 )             //
                        {                                       //
                            rx_crc >>= 1;                       //
                            rx_crc = rx_crc ^ 0xa001;           //     0x8005 polynom
                        }                                       //
                        else                                    //
                            rx_crc >>= 1;                       //
                    }                                           //

теперь если мы априорно не знаем длину всего pdu заранее нам придется все время держать в памяти три последние значения crc - tak chto po таймауту в режиме rtu выбрать самый старый crc (вычисленный без двух байтов полей crc) .

Конечно на больших скоростях не потянет - но на малых даст вам возможность сэкономить 512 байтов на таблицу

Можно конечно еще поллингом на приеме при записи байта в буфер уарта сделать это не из обработчика прерывания а из основной программы - по идее скорость приема можно увеличить

Сообщение отредактировал _artem_ - Aug 17 2006, 22:24


--------------------
Зачем лаять на караван , когда на него можно плюнуть?

Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 03:12
Рейтинг@Mail.ru


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