|
|
View previous topic :: View next topic |
Author |
Message |
Salenko
Joined: 08 Sep 2008 Posts: 84
|
Code works well but only after RESET (RS485)!! |
Posted: Sun Mar 22, 2009 6:05 am |
|
|
Everybody hi,
I wrote two simple codes to send characters from one PIC to another through RS485,
the purpose is very simple: when I push a button connected to the first PIC, a character is sent to the second one where a Led should be lighted up depending on the character (A or B). (similar Leds are also connected the the Sender so that I can see that the caracter is correctly sent and received from the Slave )
my problem is that, the simultion runs well (ISIS) but only after RESET'ing the Receiver PIC once , Is there something to modify in my codes, so that I can make it run directly, or can it be a hardware problem ?. what do you think of my codes ? is stream =RS485 needed in the #USE RS232() directive ?
I'm using two 75176 as transceivers and my resistances values (pull up and pull down) were taken from the datasheet (I also added two termination resistances of 120 ohm), the distance between the PICs is about 25cm.
here is the schematic:
http://rapidshare.com/files/212454678/2_PICs_-RS485.pdf.html
Sender PIC:16F877
receiver PIC:16F876
Compiler version: CCS 4.057
Here is the sender's code (Master)
Code: |
#include <16f877.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP,BROWNOUT,NODEBUG
#use delay(clock=20000000)
#include <stdlib.h>
#USE RS232(ENABLE=PIN_C0,Parity=N,BAUD=9600,XMIT=PIN_C6, RCV=PIN_C7,bits=8)
#define bp1 input_state(PIN_C1)
#define bp2 input_state(PIN_C2)
char car;
#int_RDA
void RDA_isr()
{
car=getchar();
}
void main()
{
while(TRUE)
{
if(bp1)
{
putc('A');
}
if(bp2)
{
putc('B');
}
if(car=='A')
{
output_high(PIN_D0);
delay_ms(200);
output_low(PIN_D0);
car='x'; // to prevent re-entering the loop
}
if(car=='B')
{
output_high(PIN_D1);
delay_ms(200);
output_low(PIN_D1);
car='x'; // to prevent re-entering the loop
}
}
}
|
and here is the Receiver adress (Slave 1)
Code: | #include <16f876.h>
#device adc=8
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#include <stdlib.h>
#USE RS232(ENABLE=PIN_C0,Parity=N,BAUD=9600, XMIT=PIN_C6, RCV=PIN_C7,bits=8)
char car;
#int_RDA
void RDA_isr()
{
car=getchar();
}
void main()
{
enable_interrupts(INT_RDA);
enable_interrupts(GLOBAL);
while(TRUE)
{
if(car=='A')
{
output_bit(PIN_A0,1);
delay_ms(300);
output_bit(PIN_A0,0);
car='x'; //to prevent re-entering the loop
putc('A');
}
if(car=='B')
{
output_bit(PIN_A1,1);
delay_ms(300);
output_bit(PIN_A1,0);
car='x' ; //to prevent re-entering the loop
putc('B');
}
}
} |
PS: my codes there are a first step to write a protocol between a Master PIC and three Slaves (very close to Modbus).
your advices will be much appreciated,
thanks in advance.
Last edited by Salenko on Mon Mar 23, 2009 1:38 am; edited 1 time in total |
|
|
FvM
Joined: 27 Aug 2008 Posts: 2337 Location: Germany
|
|
Posted: Sun Mar 22, 2009 8:13 am |
|
|
Are you reporting simulation results or real circuit behaviour? I don't see a sense in commenting simulations, except perhaps for MPLAB SIM.
Generally, your code doesn't work without enabling interrupts. Also, you need a pull-up at RC7 to keep the high level during RS485 send. |
|
|
Salenko
Joined: 08 Sep 2008 Posts: 84
|
|
Posted: Mon Mar 23, 2009 1:33 am |
|
|
FvM wrote: | Are you reporting simulation results or real circuit behaviour? I don't see a sense in commenting simulations, except perhaps for MPLAB SIM.
Generally, your code doesn't work without enabling interrupts. Also, you need a pull-up at RC7 to keep the high level during RS485 send. |
hi FvM,
thank you for answering me,
as you said, I'm reporting simulation results awaiting my jdm programmer to come (should be today or tommorow) to make real circuit test.
thank you for reminding me to add:
Code: | enable_interrupts(INT_RDA);
enable_interrupts(GLOBAL); |
in the Master PIC code. I also added the pull up resistance for both transceiver's RO pins.
I have a further question if you would like to help me more: should I add stream =RS485 in the #USE RS232() directive ?, my code worked in the same way with or without this option.
thanks. |
|
|
Ttelmah Guest
|
|
Posted: Mon Mar 23, 2009 3:34 am |
|
|
Makes no difference, if you are only talking to the RS485.
The advantage of streams, appears when you are handling talking to multiple RS232/485 links, making it easier to understand what is going on (if you use logical names), and handle the control of the 'right' link.
Best Wishes |
|
|
Salenko
Joined: 08 Sep 2008 Posts: 84
|
|
Posted: Mon Mar 23, 2009 12:43 pm |
|
|
Ttelmah wrote: | Makes no difference, if you are only talking to the RS485.
The advantage of streams, appears when you are handling talking to multiple RS232/485 links, making it easier to understand what is going on (if you use logical names), and handle the control of the 'right' link.
Best Wishes |
hi,
thanks Ttelmah, |
|
|
Salenko
Joined: 08 Sep 2008 Posts: 84
|
|
Posted: Wed Apr 08, 2009 9:15 am |
|
|
Ttelmah wrote: | Makes no difference, if you are only talking to the RS485.
The advantage of streams, appears when you are handling talking to multiple RS232/485 links, making it easier to understand what is going on (if you use logical names), and handle the control of the 'right' link.
Best Wishes |
hi Ttelmah,
I tried to apply your suggestion by adding a PIC (slave 3) and send a data to it from the master via RS232 using stream=RS232 but the other slaves are receiving this data, is there anything wrong with the hardware ? (the same thing occurs with the stream=RS485, though I put the same use RS232() directive in the master and slave )
http://rapidshare.com/files/218913680/RS232_and_RS485_network.pdf.html
thanks |
|
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|