Перейти к содержанию
    

Привет,

У меня такая задача.

Нужно работает по RS-485 , RF наводки по кабелем болшие.

PC мастер и управляет 6 MSP430.Сейчас у меня протокол простой и нет CRC.

Если кто нибутъ может предложит хорошии протокол и литература для CRC-16.

Спосиба.

 

Илиян

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

По RS-485 большие наводки???

Странно, как же так. Они однозначно должны быть синфазные, т.е. на входе приемника они должны исчезнуть при вычитании. Или я чего-то не понимаю. Может быть простой контрольной суммы будет достаточно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

По RS-485 большие наводки???

Странно, как же так. Они однозначно должны быть синфазные, т.е. на входе приемника они должны исчезнуть при вычитании. Или я чего-то не понимаю. Может быть простой контрольной суммы будет достаточно.

Наводки я имею предвид що среда агресивная.

Да CRC должна работает харашо.У меня нужна литература по CRC16

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Наводки я имею предвид що среда агресивная.

Да CRC должна работает харашо.У меня нужна литература по CRC16

Начните с описания стандартного протокола Modbus/RTU или какого еще. В такого рода вещах лучше не заниматься отсебятиной.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

 
#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 );
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Небольшое дополнение к сказанному 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()                          // выравнивание по умолчанию

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Пихаем и в 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()                          // выравнивание по умолчанию

Спосиба!

Ето будет помочъ мне.

Я на асемблер буду написатъ.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...