modbusPIC
-
Upload
steevens-garrido -
Category
Documents
-
view
218 -
download
0
Transcript of modbusPIC
-
7/25/2019 modbusPIC
1/9
#include "874modbu.h"
#define SlaveAddress 1
int isrEnd,readEnd;
bank1 unsigned char buffer[74];
union transform{
struct twoBytes{
unsigned char lowByte;
unsigned char highByte;
}bytes;
unsigned int integer;
}T;
void delay(unsigned int time)
{
unsigned int i,j;
for (i = 0; i
-
7/25/2019 modbusPIC
2/9
BRGH = 0;
SPBRG = 31; // baud rate 9600 for 20 MHz
SYNC = 0;
SPEN = 1; // serial port pins ON
CREN = 1;
SREN = 0;
TXIE = 0;
RCIE = 0;
TX9 = 0;
RX9 = 0;
TXEN = 1;
}
void startI2C(void)
{
SEN = 1;
while (SEN);
}
void stopI2C(void)
{
PEN = 1;
while (PEN);
}
unsigned char readRS(vid)
{
while(!RCIF) continue;
return RCREG;
}
-
7/25/2019 modbusPIC
3/9
void writeRS(unsigned char c)
{
TXREG = c;
TXEN = 1;
while (!TRMT);
}
unsigned char readI2C(void)
{
isrEnd = 0;
while(!isrEnd);
PEN = 1;
while (PEN);
return SSPBUF;
}
void writeI2C(unsigned char data)
{
isrEnd = 0;
SSPBUF = data;
while (!isrEnd);
while (ACKSTAT);
}
bit CRC16(unsigned int dataLength,char check) //CRC 16 for modbus checksum
{
unsigned int CheckSum;
unsigned int j;
unsigned char lowCRC;
unsigned char highCRC;
-
7/25/2019 modbusPIC
4/9
unsigned short i;
CheckSum = 0xffff;
for (j=0; j0;i--)
if((CheckSum)&0x0001)
CheckSum = (CheckSum>>1)^0xa001;
else
CheckSum>>=1;
}
highCRC = CheckSum>>8;
CheckSum8;
if (check==1){
if ( (buffer[dataLength+1] == highCRC) & (buffer[dataLength] == lowCRC ))
return 1;
else
return 0;
}
else
{
buffer[dataLength] = lowCRC;
buffer[dataLength+1] = highCRC;
return 1;
}
}
void readRegResponse(void) //response for modbus 03 function (read registers)
{
-
7/25/2019 modbusPIC
5/9
unsigned char i;
T.bytes.lowByte = buffer[3];
T.bytes.highByte = buffer[2];
T.integer*=2;
buffer[2] = buffer[5]*2;
for (i=0; i
-
7/25/2019 modbusPIC
6/9
CRC16(3,0);
for (i=0; i
-
7/25/2019 modbusPIC
7/9
while((!RCIF) && (j < 30000)) j++;
return RCIF;
}
unsigned char ReadMBFrame()
{
unsigned int counter = 0;
unsigned int aux;
stop = 0;
while (!stop)
if(!CheckRSInBuffer())
stop = 1;
else
{
if (counter 74) return 2; //to many bytes in frame
if (counter < 8) return 0; //to few bytes frame
if (buffer[0] != SlaveAddress) return 0; //wrong address
if ((buffer[1] != 3) & (buffer[1] != 16))return 1; //wrong modbus function
aux = (unsigned int)buffer[2] * 255 + (unsigned int)buffer[3] + (unsigned int)buffer[4]*255+(unsigned int)buffer[5];
if (aux > 8000) return 2; // to many registers
if ((buffer[4]>0)|( buffer[5] > 32)) return 2; // to many registers
if( CRC16(counter - 2,1))
return buffer[1]; //OK
else
return 0; //bad CRC
-
7/25/2019 modbusPIC
8/9
}
void setISR(void) /*Sets ISR bits */
{
GIE = 1;
PEIE = 1;
RCIE = 0;
SSPIE = 1;
EEIE = 1;
}
void I2CInitialize(void)
{
SSPEN = 1;
SSPM3 = 1;
SSPM2 = 0;
SSPM1 = 0;
SSPM0 = 0;
SSPADD = 12;
}
void interrupt isr(void)
{
if (SSPIF)
{
SSPIF = 0;
isrEnd = 1;
}
-
7/25/2019 modbusPIC
9/9
}
void main(void)
{
unsigned char c;
c = 1;
TRISB = 0xE0;
TRISC = 0xF8;
RB1 = 0;
RB2 = 0;
RC3 = 1;
RC4 = 1;
setISR();
I2CInitialize();
setRS();
for(;;)
{
if (RCIF) {
c =ReadMBFrame();
if (c == 3)
readRegResponse();
else
if (c==16)
writeRegResponse();
else
writeBadRequest(c);
}
}
}