CCS C Software and Maintenance Offers
FAQFAQ   FAQForum Help   FAQOfficial CCS Support   SearchSearch  RegisterRegister 

ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

CCS does not monitor this forum on a regular basis.

Please do not post bug reports on this forum. Send them to CCS Technical Support

Enabling/Disabling Hardware USART on the fly?

 
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion
View previous topic :: View next topic  
Author Message
Max Peelman
Guest







Enabling/Disabling Hardware USART on the fly?
PostPosted: Thu Feb 07, 2002 1:20 pm     Reply with quote

I have an application with a PIC16F877 acting as a Master communicating to four PIC16F628 Slaves using the hardware USART of the Slaves with a hard-wired /Slave Select output from the Master to each Slave. Is there a way to disable the Transmit pin of each Slave that is not selected so that the Tx line is not held HIGH and is available only to the desired Slave?
Right now I can communicate between the Master and one Slave but when I connect another Slave the Master does not receive the data transmitted by the selected Slave. I have verified that the selected Slave is transmitting data but the LOW transitions are not LOW enough for the Master to recognize.
Any suggestions would be appreciated!
___________________________
This message was ported from CCS's old forum
Original Post ID: 2466
Douglas Kennedy



Joined: 07 Sep 2003
Posts: 755
Location: Florida

View user's profile Send private message AIM Address

Re: Enabling/Disabling Hardware USART on the fly?
PostPosted: Fri Feb 08, 2002 4:36 am     Reply with quote

Did you try FLOAT_HIGH in the options list of #USE RS232? This will give you the equivalent of open collector outputs which with an appropriate pull up will float up.This will stop the short circuit between one slave driving high and another slave driving low. Any slave going low will be able to pull down against the resistor any slave going high will floatup providing no slave is driving low. I know you are using the hardware USART so maybe this option doesn't apply so you will have to TRIS the transmit pin to input after you check the Tx outbuff is empty and re TRIS the TX pin to output prior to sending a byte.
___________________________
This message was ported from CCS's old forum
Original Post ID: 2488
Max Peelman
Guest







Re: Enabling/Disabling Hardware USART on the fly?
PostPosted: Fri Feb 08, 2002 7:11 am     Reply with quote

:=Did you try FLOAT_HIGH in the options list of #USE RS232?

Thanks for the suggestions. I tried FLOAT_HIGH but like you said it is not allowed for the hardware USART. I have tried various combinations of enabling/disabling the USART (using SPEN and TXEN) and setting/clearing the TRIS for the Tx pin but all I succeed in doing is keeping the Tx pin LOW at all times except when data is being transmitted. When data is being transmitted I see the bit pulses on my 'scope but they are pulses HIGH with the line normally LOW and the HIGH level is very small (it really looks like the pulses are charging a cap by the looks of the transitions).
I should mention that with these experiments I only have one Slave connected to the Master, with a 330 Ohm resistor in series to the Slave pin and another 330 Ohm resistor in series to the Master pin. I don't see any way the pin could be held LOW externally.
___________________________
This message was ported from CCS's old forum
Original Post ID: 2495
John Purbrick
Guest







Re: Enabling/Disabling Hardware USART on the fly?
PostPosted: Sun Feb 10, 2002 9:21 pm     Reply with quote

One quick 'n dirty way to deal with this is to put a diode in series with each TX pin, oriented cathode (banded end) toward the PIC chip. Tie all the anodes together to form your transmission line, and add one resistor--say 2.2K--to Vcc adjacent to the processor which receives the data. What you'll have is a "wire AND" connection, where the line is only high if all the TX pins are high, and low if any one (or more, so be careful!) is low. The RX pins can all be tied together.

The alternative would seem to involve each chip watching its transmissions, and only allowing the TX pin out of high-impedance state when it actually has something to transmit. This is perfectly possible but you have to get into the workings of the PIC's UART to do it.
___________________________
This message was ported from CCS's old forum
Original Post ID: 2528
JimJ
Guest







Re: Enabling/Disabling Hardware USART on the fly?
PostPosted: Tue Feb 12, 2002 1:44 pm     Reply with quote

:=I have an application with a PIC16F877 acting as a Master communicating to four PIC16F628 Slaves using the hardware USART of the Slaves with a hard-wired /Slave Select output from the Master to each Slave. Is there a way to disable the Transmit pin of each Slave that is not selected so that the Tx line is not held HIGH and is available only to the desired Slave?
:=Right now I can communicate between the Master and one Slave but when I connect another Slave the Master does not receive the data transmitted by the selected Slave. I have verified that the selected Slave is transmitting data but the LOW transitions are not LOW enough for the Master to recognize.
:=Any suggestions would be appreciated!

My project is Single Master/Multiple Slave using the 9-bit command mode with the F877. I had trouble tri-stating the slave UART TX pins appropriately. The following works for me...

// ---
// Setup
// TRISC:
// C6 = input: PIC UART output is tri-stated in TRIS and enabled/disabled via TXSTA.TXEN
// C7 = input: PIC UART input
SET_TRIS_C(0b11......);

UART_TXSTA_TXEN = 0; // Setup: turn UART transmitter OFF to tristate TX output.

Then, during operation....
UART_TXSTA_TXEN = 1; // Before transmitting.
UART_TXSTA_TXEN = 0; // After transmission is COMPLETE.
// Leave time for the UART transmit register to empty.
___________________________
This message was ported from CCS's old forum
Original Post ID: 2557
dgi



Joined: 07 Jan 2004
Posts: 11
Location: Philadelphia, USA

View user's profile Send private message Visit poster's website

Re: Enabling/Disabling Hardware USART on the fly?
PostPosted: Wed Sep 20, 2006 11:01 am     Reply with quote

JimJ wrote:
:=I have an application with a PIC16F877 acting as a
My project is Single Master/Multiple Slave using the 9-bit command mode with the F877. I had trouble tri-stating the slave UART TX pins appropriately. The following works for me...


I am using JimJ's approach after finding that CCS compiler does not support the FLOAT_HIGH option when using the hardware UART.

I am using the PIC16F88. Here is how I implemented open-collector uart communication:

Code:

#use rs232(baud=19200, xmit=PIN_B5, rcv=PIN_B2)
#BIT TXEN = 0x98.5 // enables output. Used for disabling/tristating output pin.

void DriveTx()
{ TXEN = 1; }

void TristateTx()
{ TXEN = 0; }

void open_collector_tx(char outChar)
{
      DriveTx(); 
      putc(outChar);
      delay_us(500);
      TristateTx();
}


//and then, in main()

set_tris_b(0x25); // leave it that way for the whole program


printf(open_collector_tx, "wake up %d\n\r", reset_count);
funmix



Joined: 27 Mar 2007
Posts: 33

View user's profile Send private message

PostPosted: Wed Apr 25, 2007 6:28 am     Reply with quote

To JimJ

Do you mind to share your working code? communication between multiple slaves via USART.

Appreciate if you are sharing
ckielstra



Joined: 18 Mar 2004
Posts: 3680
Location: The Netherlands

View user's profile Send private message

PostPosted: Wed Apr 25, 2007 6:37 am     Reply with quote

funmix wrote:
To JimJ

Do you mind to share your working code? communication between multiple slaves via USART.
JimJ signed in as a guest 5 years ago, small chance he is still monitoring this forum.

I suggest you search this forum for RS485. RS485 is very similar to RS232 but as a multi-drop connection it is specifically designed for talking to multiple slaves.
funmix



Joined: 27 Mar 2007
Posts: 33

View user's profile Send private message

PostPosted: Wed Apr 25, 2007 6:50 am     Reply with quote

Ya..I am going to design simple 485 protocol

<start><node addr><length><data><checksum>

Do you have sample code that i can refer to design the 485 protocol?

I have gone through the rs485.c driver, but i no idea how to use all the function in rs485.

Master: 18F4520
Slave: 18F4520 x 5

Thanks
Oli
Guest







another way
PostPosted: Thu Jul 05, 2007 9:52 am     Reply with quote

My way is to use:

Code:
setup_uart(false);


hope this helps someone
Gabriel



Joined: 03 Aug 2009
Posts: 1067
Location: Panama

View user's profile Send private message

PostPosted: Mon Nov 22, 2010 7:54 am     Reply with quote

.... instead of trying to adapt a point to point protocol to handle multiple slaves... why not work with the system as it is?

you have one master pic and 4 slaves...
use a "ring" network (i know, rings = "no-no", i know)
use an identifier byte preciding data for each slave.
if the identifier is not the one for the slave.. pass data on to next pick..

no extra hardware... or strange protocols...

... my 2 cents..
_________________
CCS PCM 5.078 & CCS PCH 5.093
Display posts from previous:   
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion All times are GMT - 6 Hours
Page 1 of 1

 
Jump to:  
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