por daniel.sloczynski » 26 Jul 2011 10:29
Olá amigos!
Venho pedir ajuda a alguém mais experiente.
Estou tentando implementar a comunicação modbus rtu com um inversor de frequencia, ondeo pic é o master.
Mando o telegrama, mas o inversor nem pisca o led indicando que está enviando uma resposta de volta.
Já testei ligando no hyperterminal, ele manda certo, e calcula o crc certo... Será algo relacionado a algum delay que está faltando?
Segue o código abaixo para alguém que estiver disposto a me ajudar.
#include <18F4620.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=16000000)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7)
#include "stdio.h"
#include "LCD_4B.c"
//////////////////////////////////////////declaração das variaveis///////////////////////////////////
unsigned char buf_485[30];
unsigned char CRC_bytes[2];//cria um vetor para armazenar o valor do crc
char flag=0;
///////////////////////////////////////////////funçoes usadas/////////////////////////////////////////
void Calculo_CRC(unsigned int num_of_char,unsigned char *ptr_num)//,register unsigned int checksum) checksum = 0XFFFF
{
char i,j;//variaveis local
long checksum = 0XFFFF;//resultado do crc
for (i=0; i < num_of_char; i++)
{
checksum ^= *ptr_num; // executa uma operação ex or (XOR)
ptr_num++; // pega proximo caracter da sequencia(rotaciona uma unidade a direita no vetor)
for (j=0; j < 8; j++) // checa os 8 bits do caracter
{
if ((checksum & 0x01) == 0) // se LSB bit = 0
{
checksum >>= 1;//apenas rotaciona o bit sem nenhum tratamento
}
else
{
checksum = (checksum >> 1) ^ 0XA001;//rotaciona o bit e faz um ou logico(OR) com 0XA001
}
}
}
CRC_bytes[0]=checksum;
CRC_bytes[1]=checksum>>8;
}
/////////////////////////////////////////////////////////////////////////////////////////////////////
void main()
{
lcd_ini();
while(1)
{
if (!input(pin_a2)&&flag==0)
{
buf_485[0] = 0x01; // Endereço do Slave
buf_485[1] = 0x03; // Função MODBUS: Read Input Register
buf_485[2] = 0x00; // Registro inicial para ler (MSB)
buf_485[3] = 0x02; // Registro inicial para ler (LSB)
buf_485[4] = 0x00; // Total de registros para ler (MSB)
buf_485[5] = 0x02; // Total de registros para ler (LSB)
Calculo_CRC(6, buf_485); //coloquei a quantidade-1,pois a contagem
buf_485[6] = CRC_bytes[0]; // CRC (LSB)
buf_485[7] = CRC_bytes[1]; // CRC (MSB)
delay_us(3000);
printf("%X%X%X%X%X%X",buf_485[0],buf_485[1],buf_485[2],buf_485[3],buf_485[4],buf_485[5]);
printf("%X%X", buf_485[6],buf_485[7]);
delay_us(6000);
flag=1;
}
if(!input(pin_a3))
{
flag=0;
}
}
}