Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: CRC16
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > MSP430
ilian
Привет,
У меня такая задача.
Нужно работает по RS-485 , RF наводки по кабелем болшие.
PC мастер и управляет 6 MSP430.Сейчас у меня протокол простой и нет CRC.
Если кто нибутъ может предложит хорошии протокол и литература для CRC-16.
Спосиба.

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

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

Начните с описания стандартного протокола Modbus/RTU или какого еще. В такого рода вещах лучше не заниматься отсебятиной.
Yura_K
Я изучал CRC по файлу CRC Guide. Смотрите в приложении.
ilian
Цитата(Yura_K @ Aug 16 2007, 20:40) *
Я изучал CRC по файлу CRC Guide. Смотрите в приложении.

Болшое Спосиба!
VAI
Код

#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 );
}
shasik
Небольшое дополнение к сказанному VAI: его программулину пихаем не в MSP, а в PC, вычисляем массив констант и уже эти константы пихаем в MSP. Так быстрее будет.
VAI
Цитата
Небольшое дополнение к сказанному 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()                          // выравнивание по умолчанию
ilian
Цитата(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()                          // выравнивание по умолчанию

Спосиба!
Ето будет помочъ мне.
Я на асемблер буду написатъ.
vesago
По протоколу могу порекомендовать WAKE.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.