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

 
 
 
Reply to this topicStart new topic
> CRC16
ilian
сообщение Aug 16 2007, 17:02
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 65
Регистрация: 17-01-05
Пользователь №: 1 997



Привет,
У меня такая задача.
Нужно работает по RS-485 , RF наводки по кабелем болшие.
PC мастер и управляет 6 MSP430.Сейчас у меня протокол простой и нет CRC.
Если кто нибутъ может предложит хорошии протокол и литература для CRC-16.
Спосиба.

Илиян
Go to the top of the page
 
+Quote Post
uriy
сообщение Aug 16 2007, 17:14
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 429
Регистрация: 30-11-05
Из: Ижевск
Пользователь №: 11 606



По RS-485 большие наводки???
Странно, как же так. Они однозначно должны быть синфазные, т.е. на входе приемника они должны исчезнуть при вычитании. Или я чего-то не понимаю. Может быть простой контрольной суммы будет достаточно.
Go to the top of the page
 
+Quote Post
ilian
сообщение Aug 16 2007, 17:18
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 65
Регистрация: 17-01-05
Пользователь №: 1 997



Цитата(urasinov @ Aug 16 2007, 20:14) *
По RS-485 большие наводки???
Странно, как же так. Они однозначно должны быть синфазные, т.е. на входе приемника они должны исчезнуть при вычитании. Или я чего-то не понимаю. Может быть простой контрольной суммы будет достаточно.

Наводки я имею предвид що среда агресивная.
Да CRC должна работает харашо.У меня нужна литература по CRC16
Go to the top of the page
 
+Quote Post
Прохожий
сообщение Aug 16 2007, 17:27
Сообщение #4


Cундук
*****

Группа: Участник
Сообщений: 1 478
Регистрация: 13-11-06
Из: Ростов-на-Дону
Пользователь №: 22 269



Цитата(ilian @ Aug 16 2007, 21:18) *
Наводки я имею предвид що среда агресивная.
Да CRC должна работает харашо.У меня нужна литература по CRC16

Начните с описания стандартного протокола Modbus/RTU или какого еще. В такого рода вещах лучше не заниматься отсебятиной.
Go to the top of the page
 
+Quote Post
Yura_K
сообщение Aug 16 2007, 17:40
Сообщение #5


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

Группа: Свой
Сообщений: 185
Регистрация: 5-05-06
Из: Ekaterinburg, Russia
Пользователь №: 16 821



Я изучал CRC по файлу CRC Guide. Смотрите в приложении.
Прикрепленные файлы
Прикрепленный файл  crcguide.pdf ( 199.59 килобайт ) Кол-во скачиваний: 710
 


--------------------
Чудес не бывает - бывает мало знаний и опыта!
Go to the top of the page
 
+Quote Post
ilian
сообщение Aug 16 2007, 17:51
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 65
Регистрация: 17-01-05
Пользователь №: 1 997



Цитата(Yura_K @ Aug 16 2007, 20:40) *
Я изучал CRC по файлу CRC Guide. Смотрите в приложении.

Болшое Спосиба!
Go to the top of the page
 
+Quote Post
VAI
сообщение Aug 17 2007, 03:39
Сообщение #7


Профессионал
*****

Группа: Модераторы
Сообщений: 1 120
Регистрация: 17-06-04
Пользователь №: 37



Код

#if !defined( BYTE )
  #define BYTE          unsigned char
#endif

#if !defined( WORD )
  #define WORD          unsigned short
#endif

/* --- crc16() -------------------------------------------------------------------------------------------- **
*  Контрольная сумма crc16
*    BYTE *buf - указатель на байтовый буфер
*    short num - размер буфера в байтах
*  Возвращает
*    unsigned short crc16 буфера
* -------------------------------------------------------------------------------------------------------- */
WORD crc16( BYTE *buf, WORD num )
{
int i;
unsigned short crc = 0xffff;

  while ( num-- )
  { crc ^= *buf++;
    i = 8;
    do
    { if ( crc & 1 )
        crc = ( crc >> 1 ) ^ 0xa001;
      else
        crc >>= 1;
    } while ( --i );
  }
  return( crc );
}

/* --- crc8() --------------------------------------------------------------------------------------------- **
*  Контрольная сумма crc8
*    BYTE *buf - указатель на байтовый буфер
*    short num - размер буфера в байтах
*  Возвращает
*    BYTE crc8 буфера
* -------------------------------------------------------------------------------------------------------- */
BYTE crc8( BYTE *buf, WORD num )
{
int i;
BYTE chr, crc = 0;

  while ( num-- )
  { chr = *buf++;
    i = 8;
    do
    { crc = (( chr ^ crc ) & 1 ) ? ((( crc ^ 0x18 ) >> 1 ) | 0x80 ) : (( crc >> 1 ) & ~0x80 );
      chr >>= 1;
    } while ( --i );
  }
  return( crc );
}


--------------------
Если зайца бить, его можно и спички научить зажигать
Сколько дурака не бей - умнее не будет. Зато опытнее
Go to the top of the page
 
+Quote Post
shasik
сообщение Aug 17 2007, 05:43
Сообщение #8


Местный
***

Группа: Свой
Сообщений: 319
Регистрация: 3-09-05
Из: Беларусь, Новополоцк
Пользователь №: 8 188



Небольшое дополнение к сказанному VAI: его программулину пихаем не в MSP, а в PC, вычисляем массив констант и уже эти константы пихаем в MSP. Так быстрее будет.
Go to the top of the page
 
+Quote Post
VAI
сообщение Aug 17 2007, 06:28
Сообщение #9


Профессионал
*****

Группа: Модераторы
Сообщений: 1 120
Регистрация: 17-06-04
Пользователь №: 37



Цитата
Небольшое дополнение к сказанному VAI: его программулину пихаем не в MSP, а в PC, вычисляем массив констант и уже эти константы пихаем в MSP. Так быстрее будет.

Пихаем и в MSP и в РС. А съэкономленные микросекунды, по сравнению со временем передачи....
P.S.
Не забыть, что в IAR для MSP по умолчанию - выравниванивание по словам, т.е. по 2 байта. Надо в PC установить такое-же при описании принимаемых данных. Надежнее один и тот-же файл применять и в PC и в MSP...
Пример:
Код
/* -------------------------------------------------------------------------------------------------------- **
*  Директива "#pragma pack()" работает одинакого в "MSP430 IAR C/EC++ Compiler" и "Borland C++Builder" и "VC"
* -------------------------------------------------------------------------------------------------------- */
#pragma pack( 2 )     // выравнивание по 2-м байтам, в MSP дает оптимальный код

typedef struct
{ short reset_status;
  volatile unsigned short t_tick;       // при измерении температуры делает ++
  signed char       term_f;  
  signed char       term_q;
  signed char       term_m;
} termometer;

typedef struct
{ double            ratio;
  double            Zero;
} predesign;

typedef struct            
{ float             gse[gse_cnt];
  predesign         pre_gse[ch_cnt];
  struct
  { short delta;                
    float Paskal;              
  } pressure;
  float             mabda;
  unsigned short    axue;
  unsigned long     tick_ms;работы прибора
  termometer        term_data;
} TM2_result;
#pragma pack()                          // выравнивание по умолчанию


--------------------
Если зайца бить, его можно и спички научить зажигать
Сколько дурака не бей - умнее не будет. Зато опытнее
Go to the top of the page
 
+Quote Post
ilian
сообщение Aug 17 2007, 06:36
Сообщение #10


Участник
*

Группа: Участник
Сообщений: 65
Регистрация: 17-01-05
Пользователь №: 1 997



Цитата(VAI @ Aug 17 2007, 09:28) *
Пихаем и в MSP и в РС. А съэкономленные микросекунды, по сравнению со временем передачи....
P.S.
Не забыть, что в IAR для MSP по умолчанию - выравниванивание по словам, т.е. по 2 байта. Надо в PC установить такое-же при описании принимаемых данных. Надежнее один и тот-же файл применять и в PC и в MSP...
Пример:
Код
/* -------------------------------------------------------------------------------------------------------- **
*  Директива "#pragma pack()" работает одинакого в "MSP430 IAR C/EC++ Compiler" и "Borland C++Builder" и "VC"
* -------------------------------------------------------------------------------------------------------- */
#pragma pack( 2 )     // выравнивание по 2-м байтам, в MSP дает оптимальный код

typedef struct
{ short reset_status;
  volatile unsigned short t_tick;       // при измерении температуры делает ++
  signed char       term_f;  
  signed char       term_q;
  signed char       term_m;
} termometer;

typedef struct
{ double            ratio;
  double            Zero;
} predesign;

typedef struct            
{ float             gse[gse_cnt];
  predesign         pre_gse[ch_cnt];
  struct
  { short delta;                
    float Paskal;              
  } pressure;
  float             mabda;
  unsigned short    axue;
  unsigned long     tick_ms;работы прибора
  termometer        term_data;
} TM2_result;
#pragma pack()                          // выравнивание по умолчанию

Спосиба!
Ето будет помочъ мне.
Я на асемблер буду написатъ.
Go to the top of the page
 
+Quote Post
vesago
сообщение Aug 18 2007, 10:47
Сообщение #11


Тутэйшы
****

Группа: Свой
Сообщений: 708
Регистрация: 30-11-04
Пользователь №: 1 263



По протоколу могу порекомендовать WAKE.
Go to the top of the page
 
+Quote Post

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

 


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


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