View previous topic :: View next topic |
Author |
Message |
Audi80
Joined: 07 Sep 2007 Posts: 41
|
RS-485 synchronism method |
Posted: Fri Feb 22, 2008 6:06 am |
|
|
Hi there. I´ve got a project that is working with a RS-485 communications interface.I´ve got one master device controling all the other slaves with an im alive status in each 100ms. My problem is that if i stop communications for at least one day without working it takes several time to start work. For an example today it took 2 min for the slave to start responding. So i believe that the problem might be in the hardware or software in both devices (master or slave). The question is why does it take so much to responde the first status and then after that it works for hours. Do i need any synchronism method to insure that the first question is awnsered?? Thanks... |
|
|
RLScott
Joined: 10 Jul 2007 Posts: 465
|
Re: RS-485 synchronism method |
Posted: Fri Feb 22, 2008 6:30 am |
|
|
There is nothing specific to RS-485 hardware or software that has time-outs that long. But your application software may very well be doing something with long time periods.
Robert Scott
Real-Time Specialties |
|
|
Audi80
Joined: 07 Sep 2007 Posts: 41
|
|
Posted: Fri Feb 22, 2008 7:08 am |
|
|
What do you mean by "But your application software may very well be doing something with long time periods."?? The master i´m using has a c application running and i had to change the putc and getc functions in both codes as following:
Master:
Code: |
if ( ligar )
{
EscapeCommFunction( hCom, CLRRTS ); // Clears RTS to receive
Sleep(4);
}
else
{
Sleep(2);
EscapeCommFunction( hCom, SETRTS ); // Sets RTS to transmit
Sleep(11);
}
|
Slave:
Code: |
signed int rx_char (char *ch ){
if ( (*ch = fgetc(COMM))>0 ){
// Do nothing
}
else{
delay_ms(1);
output_high(WR);
delay_ms(1);
return -1;
}
return _NO_ERROR;
}
signed int tx_char (char ch ){
delay_ms(1);
output_high(WR);
delay_ms(1);
fputc(ch,COMM);
delay_ms(2);
output_low(WR);
return ( _NO_ERROR );
}
|
In the ccs help it says that we can setup a pin useful for RS-485 interface like "enable=PIN_B3" that set the pin high while transmiting. And i´ve tried that without the delay but i still couldn´t get it working. So i´ve managed the RE/DE problem with delay but for each sended or received character it takes more 4ms because i couldn´t insure that the WR pin was low or high. Is it possible to do that without delays and using only the "enable=PIN_B3" option?? Thanks |
|
|
Humberto
Joined: 08 Sep 2003 Posts: 1215 Location: Buenos Aires, La Reina del Plata
|
|
Posted: Fri Feb 22, 2008 7:18 am |
|
|
As RLScott said:
"There is nothing specific to RS-485 hardware or software"
Looking at your code, it seems that before the RS485 transceiver there is another device that needs a kind of hardware handshake.
Code: |
EscapeCommFunction( hCom, CLRRTS ); // Clears RTS to receive
EscapeCommFunction( hCom, SETRTS ); // Sets RTS to transmit
|
Could you tell us the meaning of such functions and a brief description of your hardware?
Regarding the control pins of the RS485 transceiver, you just need to define the "enable" pin in the #RS232 directive, tied both control pins RE/DE together -if your application is running in half duplex mode- and let the compiler to do its job.
It is not needed to add any kind of delays.
Humberto
Last edited by Humberto on Fri Feb 22, 2008 7:34 am; edited 1 time in total |
|
|
Audi80
Joined: 07 Sep 2007 Posts: 41
|
|
Posted: Fri Feb 22, 2008 7:34 am |
|
|
Tha master has a c and c++ code running.
the
Code: |
EscapeCommFunction( hCom, CLRRTS ); // Clears RTS to receive
|
Only sets the pin7 low of the PC comm port that is connected to RE/DE pin of MAX485 through a MAX232
Code: |
EscapeCommFunction( hCom, SETRTS ); // Sets RTS to transmit
|
Does exacly the same thing but is to set the pin high.
The hardware i have since the PC is not equiped with a 485 port i had to pass it through a RS-485/RS-232 converter so i have the pic directly connected to MAX485 that pass through a MAX485 again and then throught a MAX232 and then to the PC. like this
http://www.mikroe.com/en/books/picbasicbook/09/rs485.gif
My problem is that i´ve got a lot of chars to send and receive and i´m already using a slow baud rate and if i increment the time of delay in W/R pin it will increase too much my communications transfers. The only thing that i thing is weard is that after a while it works perfectly... |
|
|
Humberto
Joined: 08 Sep 2003 Posts: 1215 Location: Buenos Aires, La Reina del Plata
|
|
Posted: Fri Feb 22, 2008 7:40 am |
|
|
Who is controlling the RE/DE pins of the RS485 transceiver close to the PC?
MAX232 T1in is floating!
You need a work around regarding this. There is an easy trick: a hardware solution.
Add a monoestable IC configured in retriggerable mode, trigger it with the Tx line and adjust
the monoestable RC delay using the following criteria:
RC= (minimum bit period + 50% )
being minimum bit period the period for the max expected baud rate
Wire the monoestable Q output to the RE/DE pins and you'll have full hardware control
of the -actually floating- transceiver control pins.
Humberto |
|
|
Audi80
Joined: 07 Sep 2007 Posts: 41
|
|
Posted: Fri Feb 22, 2008 9:09 am |
|
|
Quote: |
Who is controlling the RE/DE pins of the RS485 transceiver close to the PC?
|
Close to the PC is the PC comm port the pin7 of db9 is te RTS so i think that is enough.
You´re right. Does a pull-down or pull-up resistor do the work? Sorry but i not very familiar with RC filters. Do you know any place where i can get that information or any schematic that could help me? Thanks... |
|
|
Humberto
Joined: 08 Sep 2003 Posts: 1215 Location: Buenos Aires, La Reina del Plata
|
|
Posted: Fri Feb 22, 2008 9:41 am |
|
|
Quote: |
Does a pull-down or pull-up resistor do the work?
|
Nop. You need to toggle the RE/DE pins to enable /disable Tx and Rx modules inside
the RS485 transceiver.
Following I send you a schematic found in the web.
http://schematics.blogspot.com/2004/11/monostable-multivibrator.html
You will see an application schematic of a dual monoestable IC (namely CD4538).
It has 2 modules inside, you only need to use one of them.
It include a link to get a full manufacturer datasheet, read it and you will see that it is very easy to use. If you are not familiar reading a datasheet, this will help you:
http://www.egr.msu.edu/classes/ece480/goodman/read_datasheet.pdf
Be aware that in the not used module -another half of the IC - ALL the inputs
(T+ T- and R ) must be tied to GND.
Humberto |
|
|
Audi80
Joined: 07 Sep 2007 Posts: 41
|
|
Posted: Fri Feb 22, 2008 10:41 am |
|
|
Thanks a lot Humberto i´ll read it and try to find out the problem. |
|
|
esa
Joined: 31 Jan 2008 Posts: 19
|
|
Posted: Fri Feb 22, 2008 3:30 pm |
|
|
I think, RTS must be connected to T1In and not R1in
Nevertheless, to control your RE/DE line, you can also check here :
http://www.rs485.com/
there is a lot of schematic.
I make this one to control RE/DE line :
1N4148+1 resistor+1cap+1 NAND
http://www.rs485.com/pdffiles/converters/ipc24.pdf
Working very good and very easy to do.
Eric |
|
|
Humberto
Joined: 08 Sep 2003 Posts: 1215 Location: Buenos Aires, La Reina del Plata
|
|
Posted: Fri Feb 22, 2008 3:40 pm |
|
|
Well, Copperfield in the net !!!
Lets assume that when the poster (Audi80) show us the reference link, there were
only 2 wires coming from the PC. RTS was not showed at all.
If not I would never ask him to explain us regarding those two "unexplained functions".
Also R1in was without any connection.
it's "a kind of magic"
http://www.geocities.com/sunsetstrip/theater/9609/queen2.html
Humberto |
|
|
Audi80
Joined: 07 Sep 2007 Posts: 41
|
|
Posted: Mon Feb 25, 2008 3:43 am |
|
|
Sorry you're right there are errors shown in the link i've posted but they were corrected. One is the connection of the RTS in MAX232, after i repaired those errors it was working i think that the problem might be in the values of my MAX capacitors they should be of 1uF or 100nF but i only had 10uF. Could that be a problem? |
|
|
meereck
Joined: 09 Nov 2006 Posts: 173
|
|
Posted: Mon Feb 25, 2008 5:54 am |
|
|
As for pull-up, pull-down (620 ohm) and terminating resistor (120 ohm) at http://www.rs485.com/pdffiles/converters/ipc24.pdf ,
can they be switched electronically? For example, if the device becomes the last device on the bus, the terminating resistor shall be connected to the bus etc.
EDIT : the following is clear now
In the right top corner at the given scheme, next to the RS485 connector, there are 4 diodes and 2 other "weird" diodes (dont know their name nor function). I assume that their purpose is protection against high voltages within the bus, am I right? How does this part work, please? I reckon that a high voltage is shorted to ground through one of "unknown" diodes. Could Zener diodes be used instead?
EDIT : Allright, the unknown device is transil which is quite similar to the Zener diode.
Thank you
Regards meereck |
|
|
|