Форум Микро-Чип
Поиск и заказ электронных компонентов
 

Вернуться   Форум Микро-Чип > Общетехнические вопросы

Общетехнические вопросы Общие вопросы аналоговой и цифровой электроники.

Ответ
 
Опции темы Опции просмотра
Старый 21.03.2018, 14:43   #1
NSS
Senior Member
 
Аватар для NSS
 
Регистрация: 25.02.2007
Возраст: 48
Сообщений: 980
Вес репутации: 414/55
NSS is just really niceNSS is just really niceNSS is just really niceNSS is just really niceNSS is just really nice
По умолчанию CRC-8

Всем здравствовать. Озадачился функцией подсчёта CRC-8. На просторах конференции нашёл следующее:

Код:
unsigned char calc_crc(unsigned char *mas, unsigned char Len) { //
       unsigned char i, dat, crc, fb, st_byt;                   //
       st_byt = 0; crc = 0;                                     //
       do{                                                      //
          dat = mas[st_byt];                                    //
          for(i = 0; i < 8; i++) {                              //
             fb = crc ^ dat;                                    //
             fb &= 1;                                           //
             crc >>= 1;                                         //
             dat >>= 1;                                         //
             if(fb == 1) crc ^= 0x07;                           //
           }                                                    //
          st_byt++;                                             //
        } while(st_byt < Len);                                  //
    return crc;                                                 //
  }                                                             //
Попробовал - считает что то не то. Пробовал так:
Код:
        mass[0] = '1';
        mass[1] = '2';
        mass[2] = '3';
        mass[3] = '4';
        mass[4] = '5';
        mass[5] = '6';
        mass[6] = '7';
        mass[7] = '8';
        mass[8] = '9';
        
        crc_res = calc_crc(mass, 9);
        if(crc_res == 0xf4) Green_Led_On;
        else Red_Led_On;
Контрольное значение 0xf4 взял здесь. Зажигается красный. Пробовал кидать результат в порт - доходит 0х02. Что делаю не так?
__________________
"Ignoramus et ignorabimus..."
NSS вне форума   Ответить с цитированием
Старый 21.03.2018, 15:08   #2
pal1222@yandex.ru
Senior Member
 
Регистрация: 30.09.2008
Сообщений: 1,465
Вес репутации: 2482/75
pal1222@yandex.ru has a reputation beyond reputepal1222@yandex.ru has a reputation beyond reputepal1222@yandex.ru has a reputation beyond reputepal1222@yandex.ru has a reputation beyond reputepal1222@yandex.ru has a reputation beyond reputepal1222@yandex.ru has a reputation beyond reputepal1222@yandex.ru has a reputation beyond reputepal1222@yandex.ru has a reputation beyond reputepal1222@yandex.ru has a reputation beyond reputepal1222@yandex.ru has a reputation beyond reputepal1222@yandex.ru has a reputation beyond repute
По умолчанию Re: CRC-8

Сдается мне, не CRC это... на каком полиноме надо считать?
pal1222@yandex.ru вне форума   Ответить с цитированием
Старый 21.03.2018, 16:52   #3
pal1222@yandex.ru
Senior Member
 
Регистрация: 30.09.2008
Сообщений: 1,465
Вес репутации: 2482/75
pal1222@yandex.ru has a reputation beyond reputepal1222@yandex.ru has a reputation beyond reputepal1222@yandex.ru has a reputation beyond reputepal1222@yandex.ru has a reputation beyond reputepal1222@yandex.ru has a reputation beyond reputepal1222@yandex.ru has a reputation beyond reputepal1222@yandex.ru has a reputation beyond reputepal1222@yandex.ru has a reputation beyond reputepal1222@yandex.ru has a reputation beyond reputepal1222@yandex.ru has a reputation beyond reputepal1222@yandex.ru has a reputation beyond repute
По умолчанию Re: CRC-8

Цитата:
Сообщение от NSS Посмотреть сообщение
Всем здравствовать. Озадачился функцией подсчёта CRC-8. На просторах конференции нашёл следующее:

Код:
unsigned char calc_crc(unsigned char *mas, unsigned char Len) { //
       unsigned char i, dat, crc, fb, st_byt;                   //
       st_byt = 0; crc = 0;                                     //
       do{                                                      //
          dat = mas[st_byt];                                    //
          for(i = 0; i < 8; i++) {                              //
             fb = crc ^ dat;                                    //
             fb &= 1;                                           //
             crc >>= 1;                                         //
             dat >>= 1;                                         //
             if(fb == 1) crc ^= 0x07;                           //
           }                                                    //
          st_byt++;                                             //
        } while(st_byt < Len);                                  //
    return crc;                                                 //
  }                                                             //
Попробовал - считает что то не то. Пробовал так:
Код:
        mass[0] = '1';
        mass[1] = '2';
        mass[2] = '3';
        mass[3] = '4';
        mass[4] = '5';
        mass[5] = '6';
        mass[6] = '7';
        mass[7] = '8';
        mass[8] = '9';
        
        crc_res = calc_crc(mass, 9);
        if(crc_res == 0xf4) Green_Led_On;
        else Red_Led_On;
Контрольное значение 0xf4 взял здесь. Зажигается красный. Пробовал кидать результат в порт - доходит 0х02. Что делаю не так?
Ты там спать лёг, что ли?
Код:
unsigned char calc_crc(unsigned char *mas, unsigned int Len)
{
unsigned char crc = 0;

  while(Len--)
    {    
     *mas ^= crc;
     crc = 0;
     if(*mas & 0x80) crc ^= 0x89;
     if(*mas & 0x40) crc ^= 0xc7;
     if(*mas & 0x20) crc ^= 0xe0;
     if(*mas & 0x10) crc ^= 0x70;
     if(*mas & 0x08) crc ^= 0x38;
     if(*mas & 0x04) crc ^= 0x1c;
     if(*mas & 0x02) crc ^= 0x0e;
     if(*mas & 0x01) crc ^= 0x07;
     mas++;
    }
  return(crc);
}
pal1222@yandex.ru вне форума   Ответить с цитированием
Старый 21.03.2018, 17:32   #4
Vovka
Senior Member
 
Аватар для Vovka
 
Регистрация: 27.12.2007
Адрес: недалеко от г.Белгорода
Возраст: 50
Сообщений: 1,880
Вес репутации: 2862/85
Vovka has a reputation beyond reputeVovka has a reputation beyond reputeVovka has a reputation beyond reputeVovka has a reputation beyond reputeVovka has a reputation beyond reputeVovka has a reputation beyond reputeVovka has a reputation beyond reputeVovka has a reputation beyond reputeVovka has a reputation beyond reputeVovka has a reputation beyond reputeVovka has a reputation beyond repute
Отправить сообщение для Vovka с помощью ICQ
По умолчанию Re: CRC-8

Еще вариант:
Код:
/* Подсчет CRC8 массива mas длиной Len */
unsigned char calc_crc( unsigned char *mas, unsigned char Len )
{
  unsigned char i,dat,crc,fb,st_byt;
  st_byt=0; crc=0;
  do{
    dat=mas[st_byt];
    for( i=0; i<8; i++) {  // счетчик битов в байте
      fb = crc ^ dat;
      fb &= 1;
      crc >>= 1;
      dat >>= 1;
      if( fb == 1 ) crc ^= 0x8c; // полином
    }
    st_byt++;
  } while( st_byt < Len ); // счетчик байтов в массиве
  return crc;
}
__________________
Настройся на хороший день и он таким будет!
Vovka вне форума   Ответить с цитированием
Старый 21.03.2018, 18:01   #5
pal1222@yandex.ru
Senior Member
 
Регистрация: 30.09.2008
Сообщений: 1,465
Вес репутации: 2482/75
pal1222@yandex.ru has a reputation beyond reputepal1222@yandex.ru has a reputation beyond reputepal1222@yandex.ru has a reputation beyond reputepal1222@yandex.ru has a reputation beyond reputepal1222@yandex.ru has a reputation beyond reputepal1222@yandex.ru has a reputation beyond reputepal1222@yandex.ru has a reputation beyond reputepal1222@yandex.ru has a reputation beyond reputepal1222@yandex.ru has a reputation beyond reputepal1222@yandex.ru has a reputation beyond reputepal1222@yandex.ru has a reputation beyond repute
По умолчанию Re: CRC-8

Цитата:
Сообщение от Vovka Посмотреть сообщение
Еще вариант:
Код:
/* Подсчет CRC8 массива mas длиной Len */
unsigned char calc_crc( unsigned char *mas, unsigned char Len )
{
  unsigned char i,dat,crc,fb,st_byt;
  st_byt=0; crc=0;
  do{
    dat=mas[st_byt];
    for( i=0; i<8; i++) {  // счетчик битов в байте
      fb = crc ^ dat;
      fb &= 1;
      crc >>= 1;
      dat >>= 1;
      if( fb == 1 ) crc ^= 0x8c; // полином
    }
    st_byt++;
  } while( st_byt < Len ); // счетчик байтов в массиве
  return crc;
}
У него полином 0х07 прямой а реализацию он взял для обратного
двигать надо было в другую сторону
Код:
unsigned char calc_crc(unsigned char *mas, unsigned char Len) { //
       unsigned char i, dat, crc, fb, st_byt;                   //
       st_byt = 0; crc = 0;                                     //
       do{                                                      //
          dat = mas[st_byt];                                    //
          for(i = 0; i < 8; i++) {                              //
             fb = crc ^ dat;                                    //
             fb &= 0x80;                                           //
             crc <<= 1;                                         //
             dat <<= 1;                                         //
             if(fb == 0x80) crc ^= 0x07;                           //
           }                                                    //
          st_byt++;                                             //
        } while(st_byt < Len);                                  //
    return crc;
pal1222@yandex.ru вне форума   Ответить с цитированием
Старый 21.03.2018, 18:35   #6
NSS
Senior Member
 
Аватар для NSS
 
Регистрация: 25.02.2007
Возраст: 48
Сообщений: 980
Вес репутации: 414/55
NSS is just really niceNSS is just really niceNSS is just really niceNSS is just really niceNSS is just really nice
По умолчанию Re: CRC-8

Не, не лёг, в спортзал ходил... Спасибо, завтра попробую.
__________________
"Ignoramus et ignorabimus..."
NSS вне форума   Ответить с цитированием
Старый 21.03.2018, 18:36   #7
NSS
Senior Member
 
Аватар для NSS
 
Регистрация: 25.02.2007
Возраст: 48
Сообщений: 980
Вес репутации: 414/55
NSS is just really niceNSS is just really niceNSS is just really niceNSS is just really niceNSS is just really nice
По умолчанию Re: CRC-8

Так я именно этот код и взял. Здесь, на конфе. ))
__________________
"Ignoramus et ignorabimus..."
NSS вне форума   Ответить с цитированием
Старый 21.03.2018, 18:38   #8
NSS
Senior Member
 
Аватар для NSS
 
Регистрация: 25.02.2007
Возраст: 48
Сообщений: 980
Вес репутации: 414/55
NSS is just really niceNSS is just really niceNSS is just really niceNSS is just really niceNSS is just really nice
По умолчанию Re: CRC-8

О как! Бывают разные? Вот блин. )))
__________________
"Ignoramus et ignorabimus..."
NSS вне форума   Ответить с цитированием
Старый 22.03.2018, 08:29   #9
NSS
Senior Member
 
Аватар для NSS
 
Регистрация: 25.02.2007
Возраст: 48
Сообщений: 980
Вес репутации: 414/55
NSS is just really niceNSS is just really niceNSS is just really niceNSS is just really niceNSS is just really nice
По умолчанию Re: CRC-8

Спасибо, заработало. Блин, надо было математику лучше учить.. ))) А чем отличаются прямой и обратный полиномы?
__________________
"Ignoramus et ignorabimus..."
NSS вне форума   Ответить с цитированием
Старый 22.03.2018, 17:36   #10
pal1222@yandex.ru
Senior Member
 
Регистрация: 30.09.2008
Сообщений: 1,465
Вес репутации: 2482/75
pal1222@yandex.ru has a reputation beyond reputepal1222@yandex.ru has a reputation beyond reputepal1222@yandex.ru has a reputation beyond reputepal1222@yandex.ru has a reputation beyond reputepal1222@yandex.ru has a reputation beyond reputepal1222@yandex.ru has a reputation beyond reputepal1222@yandex.ru has a reputation beyond reputepal1222@yandex.ru has a reputation beyond reputepal1222@yandex.ru has a reputation beyond reputepal1222@yandex.ru has a reputation beyond reputepal1222@yandex.ru has a reputation beyond repute
По умолчанию Re: CRC-8

Цитата:
Сообщение от NSS Посмотреть сообщение
Спасибо, заработало. Блин, надо было математику лучше учить.. ))) А чем отличаются прямой и обратный полиномы?
Зеркальные они, b7 <-> b0. Когда то эту хрень считали на ксорах и сдвиговых регистрах. Первым приходит старший бит -> двигаем влево и считаем на прямом, первым приходит младший бит -> на обратном и двигаем вправо. Это если на пальцах. А не на пальцах я и сам нихрена в этом не понимаю
pal1222@yandex.ru вне форума   Ответить с цитированием
Старый 22.03.2018, 18:58   #11
NSS
Senior Member
 
Аватар для NSS
 
Регистрация: 25.02.2007
Возраст: 48
Сообщений: 980
Вес репутации: 414/55
NSS is just really niceNSS is just really niceNSS is just really niceNSS is just really niceNSS is just really nice
По умолчанию Re: CRC-8

Цитата:
Сообщение от pal1222@yandex.ru Посмотреть сообщение
...А не на пальцах я и сам нихрена в этом не понимаю
Во-во...
__________________
"Ignoramus et ignorabimus..."
NSS вне форума   Ответить с цитированием
Ответ


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перенос CRC16-X25 (dsPIC33EP) на PIC32MZ Gera82 Продукция MICROCHIP 10 14.03.2018 12:20
CRC 16 spirit Вопросы начинающих 5 11.03.2010 07:22
Реализация расчета контрольной суммы протокола Modbus Zeus80 Cетевые протоколы и технологии 21 15.08.2009 11:30
ds1822 gromovi Вопросы начинающих 6 17.04.2009 08:07
1 wire...Search ROM? timday Продукция MICROCHIP 13 08.05.2008 20:05


Часовой пояс GMT +3, время: 06:44.


Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd. Перевод: zCarot