Continue to Site

Welcome to EDAboard.com

Welcome to our site! EDAboard.com is an international Electronics Discussion Forum focused on EDA software, circuits, schematics, books, theory, papers, asic, pld, 8051, DSP, Network, RF, Analog Design, PCB, Service Manuals... and a whole lot more! To participate you need to register. Registration is free. Click here to register now.

rs485 master slave communication using PIC18F87K22-I/PT microchip,

Status
Not open for further replies.

nagarajud

Newbie level 3
Newbie level 3
Joined
Sep 13, 2012
Messages
3
Helped
0
Reputation
0
Reaction score
0
Trophy points
1,281
Activity points
1,328
hi,
i got error in master reception. master controller establishing transmission and slave controller receiving data.
but when i'm sending data from slave to master controller got error.
but one thing is i used adm485 with 120ohm resistor and pull-up and pull down resistors rs485 transceiver in master and max485 without pull-up,pull-down and 120ohm resistor in slave.
R/T pin of transceiver to RC2(PWM) pin of MUC

program for master:

sbit LCD_RS at LATB4_bit;
sbit LCD_EN at LATB5_bit;
sbit LCD_D4 at LATB0_bit;
sbit LCD_D5 at LATB1_bit;
sbit LCD_D6 at LATB2_bit;
sbit LCD_D7 at LATB3_bit;

sbit LCD_RS_Direction at TRISB4_bit;
sbit LCD_EN_Direction at TRISB5_bit;
sbit LCD_D4_Direction at TRISB0_bit;
sbit LCD_D5_Direction at TRISB1_bit;
sbit LCD_D6_Direction at TRISB2_bit;
sbit LCD_D7_Direction at TRISB3_bit;
char dat[9],data1[8]; // buffer for receving/sending messages
char i,j;

sbit rs485_rxtx_pin at RC2_bit; // set transcieve pin
sbit rs485_rxtx_pin_direction at TRISC2_bit; // set transcieve pin direction

// Interrupt routine
void interrupt() {
RS485Master_Receive(data1);
}

void main(){

ancon0=0;
ancon1=0;
ancon2=0;
LATB = 0;
LATD = 0;
TRISB = 0;
TRISD = 0;

UART1_Init(9600); // initialize UART1 module
lcd_init();
Delay_ms(100);

RS485Master_Init(); // initialize MCU as Master
dat[0] = 0x31;
dat[1] = 0x32;
dat[2] = 0x33;
dat[4] = 0; // ensure that message received flag is 0
dat[5] = 0; // ensure that error flag is 0
dat[6] = 0;

RS485Master_Send(dat,3,160);


RCIE_bit = 1; // enable interrupt on UART1 receive
TXIE_bit = 0; // disable interrupt on UART1 transmit
PEIE_bit = 1; // enable peripheral interrupts
GIE_bit = 1; // enable all interrupts

while (1){
// upon completed valid message receiving
// data[4] is set to 255

if (data1[5]) { // if an error detected, signal it
lcd_out(2,1,"ERROR");
data1[5] = 0;
}
if (data1[4]) { // if message received successfully
data1[4] = 0; // clear message received flag
j = data1[3];
for (i = 1; i <= data1[3]; i++) { // show data on PORTB

lcd_chr(1,i,data1[i-1]);

} // increment received dat[0]

Delay_ms(30);
RS485Master_Send(dat,3,160);

}

}

}

program for slave:
sbit LCD_RS at LATB4_bit;
sbit LCD_EN at LATB5_bit;
sbit LCD_D4 at LATB0_bit;
sbit LCD_D5 at LATB1_bit;
sbit LCD_D6 at LATB2_bit;
sbit LCD_D7 at LATB3_bit;

sbit LCD_RS_Direction at TRISB4_bit;
sbit LCD_EN_Direction at TRISB5_bit;
sbit LCD_D4_Direction at TRISB0_bit;
sbit LCD_D5_Direction at TRISB1_bit;
sbit LCD_D6_Direction at TRISB2_bit;
sbit LCD_D7_Direction at TRISB3_bit;
char dat[9]; // buffer for receving/sending messages
char i,j;

sbit rs485_rxtx_pin at RC2_bit; // set transcieve pin
sbit rs485_rxtx_pin_direction at TRISC2_bit; // set transcieve pin direction

// Interrupt routine
void interrupt() {
RS485Slave_Receive(dat);
}

void main() {
ancon0=0;
ancon1=0;
ancon2=0;
LATB = 0;
LATD = 0;
TRISB = 0;
TRISD = 0;

UART1_Init(9600); // initialize UART1 module
lcd_init();
Delay_ms(100);
RS485Slave_Init(160); // Intialize MCU as slave, address 160

dat[4] = 0; // ensure that message received flag is 0
dat[5] = 0; // ensure that message received flag is 0
dat[6] = 0; // ensure that error flag is 0

RCIE_bit = 1; // enable interrupt on UART1 receive
TXIE_bit = 0; // disable interrupt on UART1 transmit
PEIE_bit = 1; // enable peripheral interrupts
GIE_bit = 1; // enable all interrupts

while (1) {
if (dat[5]) { // if an error detected, signal it by

lcd_out(2,1,"ERROR");
dat[5] = 0;
}
if (dat[4]) { // upon completed valid message receive
dat[4] = 0; // data[4] is set to 0xFF
j = dat[3];
for (i = 1; i <= dat[3];i++){

lcd_chr(1,i,dat[i-1]);

}
dat[0] = 65;
dat[1]=66;
dat[2]=67; // increment received dat[0]
Delay_ms(30);
RS485Slave_Send(dat,3); // and send it back to master
}
}
}


please any one guide me.
Thanks advance.
 

What is the exact error that you are getting?

Regards,
Willis

Thanks for reply and i think i got CRC error if I'm correct.
the packet is : start byte,slave addr,data length,data,CRC and stop byte. max data len 3bytes only.
if any error occurs in CRC then dat[5]=255;will assigned.
if any one receiving packet like this: start byte,data<0:2>,data len,error indication,receiving indication,sender addr.,stop byte.
i'm using mikroC pro for pic IDE.



Thanks&regards
nagaraju
 
Last edited:

Status
Not open for further replies.

Part and Inventory Search

Welcome to EDABoard.com

Sponsor

Back
Top