red32terra
Joined: 28 Sep 2008 Posts: 7
|
UART PIC to PIC communication |
Posted: Thu Mar 05, 2009 4:29 am |
|
|
Hi, i want to communicate multiple PIC16F877a. One is sort of a master and the rest are slaves. I am using CCS version 4.084 with MPLAB ICD2 debugger. Sorry for the long code.
Here is the code of the master:
Code: | #if defined(__PCM__)
#include <16f877a.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP,NOBROWNOUT
#DEVICE *=16 //ICD=TRUE ADC=8
#use Delay (Clock=8000000)
#use i2c (SLAVE,sda=PIN_C4,scl=PIN_C3,address=0xa0,force_hw)
#use rs232(Baud=9600,Xmit=PIN_C6,Rcv=PIN_C7,parity=o)
#priority ssp, rda
enum {POLL,CTRL_ON,CTRL_OFF};
//int mode;
short int SOT_i2c=0,SOT=0,isPoll=0,isUpdate=0,isSendToAll=0,isBlink=0;
int maxOn[2], modemConf[5], priority[2][5];
int i2cBuff[17], packetType;
int ctr1,ctr2;
//byte msg;
unsigned char TXBuff[6], RCBuff[5];
unsigned int slaveAdd;
int ch;
int setCheckSum()
{
long Tsum = 0;
int TcheckSum = 0;
for (ctr1=1;ctr1<4;ctr1++)
{
Tsum = Tsum + TXBuff[ctr1];
}
TcheckSum = make8(Tsum,0);
return TcheckSum;
}
int getCheckSum()
{
long Rsum = 0;
int RcheckSum = 0;
for (ctr1=0;ctr1<3;ctr1++)
{
Rsum = Rsum + RCBuff[ctr1];
}
RcheckSum = make8(Rsum,0);
return RcheckSum;
}
void TXBuff_Init()
{
for (ctr1=0;ctr1<5;ctr1++)
{
TXBuff[ctr1] = 0;
}
TXBuff[0] = 0x7E;
//Addressing
if (slaveAdd == 2)
{
TXBuff[1] = 0x22;
}
else if (slaveAdd == 1)
{
TXBuff[1] = 0x11;
}
else if (slaveAdd == 3)
{
TXBuff[1] = 0x33;
}
else if (slaveAdd == 4)
{
TXBuff[1] = 0x44;
}
else if (slaveAdd == 5)
{
TXBuff[1] = 0x55;
}
TXBuff[2] = 0xA5; // Source address
//PAcket Type for Master2
if (packetType == POLL)
{
TXBuff[3] = 0xFF;
}
if (packetType == CTRL_ON)
{
TXBuff[3] = 0xCA;
}
if (packetType == CTRL_OFF)
{
TXBuff[3] = 0xC3;
}
TXBuff[4] = setCheckSum();
TXBuff[5] = 0x04;
}
#INT_SSP
void ssp_interrupt()
{
if(i2c_poll())
{
ch = i2c_read(0); // read from i2c
if (ch == 0xF1)
{
isPoll = 1;
packetType = POLL;
slaveAdd = 1;
}
else if (ch == 0xF2)
{
isPoll = 1;
packetType = POLL;
slaveAdd = 2;
}
else if (ch == 0xF3)
{
isPoll = 1;
packetType = POLL;
slaveAdd = 3;
}
else if (ch == 0xF4)
{
isPoll = 1;
packetType = POLL;
slaveAdd = 4;
}
else if (ch == 0xF5)
{
isPoll = 1;
packetType = POLL;
slaveAdd = 5;
}
else if (ch == 0x91) //I2C Activate Control Setting
{
isPoll = 1;
}
else if (ch == 0x92) //I2C ShutOff All Device
{
isSendToAll= 1;
packetType = CTRL_ON;
}
else if (ch == 0x94) //I2C Disable All Control
{
isSendToAll= 1;
packetType = CTRL_OFF;
}
else if ((ch==0x41)&&(SOT_i2c==0))
{
SOT_i2c = 1;
ctr1=0;
}
else if ((ch==0x04)&&(SOT_i2c==1))
{
isUpdate = 1;
SOT_i2c = 0;
}
else
{
if (SOT_i2c==1)
{
i2cBuff[ctr1]=ch;
ctr1++;
}
}
}
}
#INT_RDA
void rcv_interrupt()
{
int rcv;
rcv = getc(); // read from i2c
if ((rcv == 0x7E) && (SOT == 0))
{
SOT = 1;
isBlink = 1;
ctr1 = 0;
for(ctr2=0;ctr2<4;ctr2++)
{
RCBuff[ctr2] = 0;
}
}
else if ((rcv == 0x04) && (SOT == 1))
{
SOT = 0;
//if (RCBuff[3] == getCheckSum())
//{
if (RCBuff[0] == 0xA5) // Check if packet is for Slave 1
{
if (RCBuff[2] == 0x5A) // Check if packet is POLL
{
}
if (RCBuff[2] == 0x53) // Check if packet is CTRL ON
{
}
}
//} // Checksum
}
else
{
if (SOT == 1)
{
RCBuff[ctr1] = rcv;
ctr1++;
}
}
}
void main ()
{
delay_ms(500);
enable_interrupts(INT_RDA);
enable_interrupts(INT_SSP);
enable_interrupts(GLOBAL);
set_tris_d(0x00);
set_tris_c(0xFF);
output_D(0x01);
delay_ms(1000);
output_D(0x00);
delay_ms(1000);
isPoll = 0;
isBlink = 0;
SOT_i2c = 0;
while(TRUE)
{
if(isPOLL==1)
{
// output_high(PIN_D0);
TXBuff_Init();
for(ctr1=0;ctr1<=5;ctr1++)
{
putc(TXBuff[ctr1]);
delay_us(100);
}
// delay_ms(500);
// output_low(PIN_D0);
isPoll=0;
enable_interrupts(INT_RDA);
enable_interrupts(INT_SSP);
}
if(isBlink==1)
{
delay_ms(100);
output_high(PIN_D0);
delay_ms(500);
output_low(PIN_D0);
isBlink=0;
enable_interrupts(INT_RDA);
enable_interrupts(INT_SSP);
}
}
}
|
and here is the slave:
Code: |
#if defined(__PCM__)
#include <16f877a.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP,NOBROWNOUT
#DEVICE *=16 //ICD=TRUE ADC=8
#use Delay (Clock=8000000)
#use rs232 (baud = 9600, Xmit=PIN_C6, RCV=PIN_C7, parity=o)
#priority rda,
#BYTE ADCON0 = 0x1F
#BYTE ADCON1 = 0x9D
//int slaveAddress = 0x11;
enum {POLL,CTRL_ON,CTRL_OFF,STATUS,ACK};
short int SOT=0,isPOLL,off_flag;
int RCBuff[4],TXBuff[6];
int ctr1, ctr2;
unsigned int ACMonitor, packetType;
int setCheckSum()
{
long sum = 0;
int checkSum=0;
for (ctr1=1;ctr1<4;ctr1++)
{
sum = sum + TXBuff[ctr1];
}
checkSum = make8(sum,0);
return checkSum;
}
int getCheckSum()
{
long sum = 0;
int checkSum;
for (ctr1=0;ctr1<3;ctr1++)
{
sum = sum + RCBuff[ctr1];
}
checkSum = make8(sum,0);
return checkSum;
}
void TXBuff_Init()
{
TXBuff[0] = 0x7E;
//Addressing
TXBuff[1] = 0xA5;
TXBuff[2] = 0x33;
//PAcket Type for SLAVE
if (packetType == STATUS)
{
if (off_flag == 1)
{
TXBuff[3] = 0x53;
}
else
{
TXBuff[3] = 0x5A;
}
}
else if (packetType == ACK)
{
TXBuff[3] = 0x66;
}
//TXBuff[4] = setCheckSum();
TXBuff[4] = 0x04;
}
#INT_RDA
void rcv_interrupt()
{
int ch;
// disable_interrupts(int_ad);
if (kbhit())
{
ch = getc(); // read from i2c
if ((ch == 0x7E) && (SOT == 0))
{
SOT = 1;
ctr1 = 0;
for(ctr2=0;ctr2<4;ctr2++)
{
RCBuff[ctr2] = 0;
}
}
else if ((ch == 0x04) && (SOT == 1))
{
SOT = 0;
if (RCBuff[3] == getCheckSum())
{
if (RCBuff[0] == 0x33) // Check if packet is for Slave 3
{
if (RCBuff[2] == 0xFF) // Check if packet is POLL
{
isPOLL = 1;
}
if (RCBuff[2] == 0xCA) // Check if packet is CTRL ON
{
output_high(PIN_D1);
}
if (RCBuff[2] == 0xC3) // Check if packet is CTRL_OFF
{
output_low(PIN_D1);
}
}
} // Checksum
}
else
{
if (SOT == 1)
{
RCBuff[ctr1] = ch;
ctr1++;
}
}
}
}
void ADC_check()
{
ACMonitor=read_adc();
// disable_interrupts(int_rda);
if (ACMonitor > 0x6C)
{
output_high(PIN_D7);
off_flag = 0;
}
else
{
output_low(PIN_D7);
off_flag=1;
}
// enable_interrupts(int_rda);
}
void main ()
{
setup_adc_ports(ALL_ANALOG);
setup_adc(ADC_CLOCK_DIV_32);
// enable_interrupts(INT_AD); //enable interrupt on adc
enable_interrupts(INT_RDA);
enable_interrupts(GLOBAL);
set_tris_d(0x00);
output_d(0x81);
delay_ms(1000);
output_d(0x00);
delay_ms(1000);
while(TRUE)
{
ADC_check();
if(isPOLL==1)
{
packetType = STATUS;
TXBuff_Init();
for(ctr1=0;ctr1<=5;ctr1++)
{
putchar(TXBuff[ctr1]);
delay_us(100);
}
}
output_high(PIN_D0);
delay_ms(1000);
output_low(PIN_D0);
// ACMonitor = read_adc();
// disable_interrupts(int_ad);
isPOLL = 0;
enable_interrupts(int_rda);
}
}
}
|
the problem is that Master PIC does not receive anything after Polling. The Slave responds to the POLL if the address is correct. Can you help me point out the problem. tnx for any help. |
|