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

 
 
> Программа расчета таблицы, вычисления 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
 
Start new topic
Ответов
_artem_
сообщение Aug 17 2006, 22:28
Сообщение #2


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

Группа: Свой
Сообщений: 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 Текстовая версия Сейчас: 24th July 2025 - 04:38
Рейтинг@Mail.ru


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