tcpipchip escreveu:por falar em int, no thumb mode fica como 16 bits ou continua como 32 bits...? (compilador)
int é int...
O modo thumb define a palavra de instrução e não muda a arquitetura.
Moderadores: andre_luis, 51, guest2003, Renie
tcpipchip escreveu:por falar em int, no thumb mode fica como 16 bits ou continua como 32 bits...? (compilador)
fabim escreveu:bom no meu caso, ja existem redundancias de mais. rsrsrs mais do que eu imaginaria que tivesse !!
CHR E SAM, muito obrigado meninos !!
Sam, to pensando aqui, a SUM signed dos dados é basicamente uma integral de string.
Se houverem dados reciprocos inversamente, não é totalmente verdade que ele identifique falhas em algum bit perdido.
Sua tênica sagrada, eu não entendi direito !!
Pode explicar a lógica ?
Li 3X, e ainda não entendi !!!
fabim escreveu:é, check não ficou legal não !!
gerei uma **** sugeira na I2C, e sim, com Check melhora, mais não resolve.
CRC em 8 bits é possivel ?
EX: slave devolve (data 16b)+(CRC. ?
Abraços
int calc_crc(int *buff, int num_vals)
{
int shift_reg=0, data_bit, sr_lsb, fb_bit, i, j;
for (i=0; i<num_vals; i++) // for each byte
{
for(j=0; j<8; j++) // for each bit
{
data_bit = (buff[i]>>j)&0x01;
sr_lsb = shift_reg & 0x01;
fb_bit = (data_bit ^ sr_lsb) & 0x01;
shift_reg = shift_reg >> 1;
if (fb_bit)
{
shift_reg = shift_reg ^ 0x8c;
}
}
}
return(shift_reg);
}
xultz escreveu:... algum matemático sem coisa melhor prá fazer calculou qual tem probabilidade maior de não deixar um erro passar batido.
int calc_crc(int *buff, int num_vals)
{
int shift_reg=0, data_bit, sr_lsb, fb_bit, i, j;
for (i=0; i<num_vals; i++) // for each byte
{
for(j=0; j<8; j++) // for each bit
{
data_bit = (buff[i]>>j)&0x01;
sr_lsb = shift_reg & 0x01;
fb_bit = (data_bit ^ sr_lsb) & 0x01;
shift_reg = shift_reg >> 1;
if (fb_bit)
{
shift_reg = shift_reg ^ 0x8c;
}
}
}
return(shift_reg);
}
void CRC16(unsigned int dataLength, volatile uint8_t *buffer)
{
unsigned int CheckSum = 0xFFFF;
unsigned int j;
unsigned short i;
for (j=0; j<dataLength; j++)
{
CheckSum = CheckSum^(unsigned int)buffer[j];
for(i=1; i<=8; i++)
if((CheckSum)& 0x0001)
{
CheckSum = (CheckSum>>1)^0xA001;
}
else
{
CheckSum>>=1;
}
}
highCRC = CheckSum>>8;
CheckSum= (CheckSum<<8);
lowCRC = CheckSum>>8;
}
Maffeis escreveu:Funciona legal (pelo menos até agora não tive problemas com ele)
Cheguei a esse cara estudando modbus
Peguei simuladores de modbus para comparar
não cheguei a implementar ele como modbus msm
envios pacotes com 1500 valores, rs485
está nos planos implementar isso na memoria I2C também.
copie de algum lugar e modifiquei alguma coisa, não lembro qual foi a fonte
- Código: Selecionar todos
void CRC16(unsigned int dataLength, volatile uint8_t *buffer)
{
unsigned int CheckSum = 0xFFFF;
unsigned int j;
unsigned short i;
for (j=0; j<dataLength; j++)
{
CheckSum = CheckSum^(unsigned int)buffer[j];
for(i=1; i<=8; i++)
if((CheckSum)& 0x0001)
{
CheckSum = (CheckSum>>1)^0xA001;
}
else
{
CheckSum>>=1;
}
}
highCRC = CheckSum>>8;
CheckSum= (CheckSum<<8);
lowCRC = CheckSum>>8;
}
Usuários navegando neste fórum: Google [Bot] e 1 visitante