Você está na página 1de 2

#include <16F877A.

h>
#fuses HS,NOWDT,NOPROTECT,BROWNOUT,PUT,NOLVP
#use delay(clock=20000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7, ERRORS)
//============================
void main()
{
char c;
while(1)
{
c = getc();
putc(c);
}
}

// protocolo modbus
//
//microcontrolador : microchip
//compilador : CCS
//autor : aguivone
//data : 23/11/2010
//descrio : calculando o crc no modbus;
//..............................................................................
....................
#include <16F877A.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20M)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7)//,enable=PIN_D4)
//////////////////////////////////////////declarao das variaveis//////////////////
/////////////////
unsigned char buf_485[30];
unsigned char CRC_bytes[2];//cria um vetor para armazenar o valor do crc
///////////////////////////////////////////////funoes usadas/////////////////////
////////////////////
void Calculo_CRC(unsigned int num_of_char,unsigned char *ptr_num)//,register uns
igned int checksum) checksum = 0XFFFF
{
//variaveis local
char i,j;
//resultado do crc
long checksum = 0XFFFF;
for (i=0; i < num_of_char; i++)
{
// executa uma operao
// pega proximo caracter da sequencia(rotaciona uma unidade a direita no v
etor)
checksum ^= *ptr_num;
ptr_num++;

// checa os 8 bits do caracter


for (j=0; j < 8; j++)
{
// se LSB bit = 0
if ((checksum & 0x01) == 0)
{
//apenas rotaciona o bit sem nenhum tratamento
checksum >>= 1;
}else{
//rotaciona o bit e faz um ou logico(OR) com 0XA001
checksum = (checksum >> 1) ^ 0XA001;
}
}
}
CRC_bytes[0]=checksum;
CRC_bytes[1]=checksum>>8;
}
////////////////////////////////////////////////////////////////////////////////
/////////////////////
void main()
{
buf_485[0] = 0x02; // Endereo do Slave
buf_485[1] = 0x06; // Funo MODBUS: Read Input Register
buf_485[2] = 0x01; // Registro inicial para ler (MSB)
buf_485[3] = 0x2C; // Registro inicial para ler (LSB)
buf_485[4] = 0x32; // Total de registros para ler (MSB)
buf_485[5] = 0x10; // Total de registros para ler (LSB)
Calculo_CRC(6, buf_485); //coloque a quantidade-1,pois a contagem
buf_485[6] = CRC_bytes[1]; // CRC (LSB)
buf_485[7] = CRC_bytes[0]; // CRC (MSB)
output_low(PIN_C5);
while(true){
printf("MODBUS = %X - %X - %X - %X - %X - %X \r\n",buf_485[0],buf_485[1],b
uf_485[2],buf_485[3],buf_485[4],buf_485[5]);
printf("CRC = %X%X ", buf_485[6],buf_485[7]);
delay_ms(100);
}
}

Você também pode gostar