View previous topic :: View next topic |
Author |
Message |
arrow
Joined: 17 May 2005 Posts: 213
|
How To Pull UART high? |
Posted: Mon Jun 05, 2006 7:34 am |
|
|
Hi
I am seeing "dummy" characters on my receive pin of the PIC16F873
i.e. pin_C7.
The poster Ttelmah warned me:
Quote: |
However remember that unless the receive input of the UART is pulled high, 'dummy' characters may be seen, and a receive interupt occur.
|
Can someone please tell me how I can "pull the UART high"?
Thank you.
a. |
|
|
jecottrell
Joined: 16 Jan 2005 Posts: 559 Location: Tucson, AZ
|
|
Posted: Mon Jun 05, 2006 7:42 am |
|
|
Connect RX and TX to Vdd through a 4.7K to 10K resistor.
Good luck,
John |
|
|
Ttelmah Guest
|
|
Posted: Mon Jun 05, 2006 7:45 am |
|
|
It depends totally on how you have your circuit connected. Normally, provided you have the RX pin of the chip, connected via a MAX232 or similar transciever, and wired to a transmit pin on another serial port, the pin will always be 'pulled high', when no data is being received. However there can be problems. For instance, Dell laptops, in order to save power, stop driving the serial line when data is not beng sent for a while. Similarly, if you are connecting to another device that does not guarantee to drive the pin high when idle (some serial radio receiver modules in particular), then you either have to write your code to deal with the 'break' condition that this corresponds to, or arrange the hardware to pull the pin high. Solutions will depend totally on what _you_ are connecting. For instance, some of the radio modules have a 'carrier detect' output, and this can be connected with simple logic, to pull the signal high, when no carrier is seen.
Best Wishes |
|
|
arrow
Joined: 17 May 2005 Posts: 213
|
|
Posted: Mon Jun 05, 2006 7:51 am |
|
|
Hi Ttelmah and Jecottrell
I am connecting my PIC to a SMiRF from Sparkfun- this is a BlueTooth transceiver.
So do you agree with Jecottrell- can I connect Pin C6 and C7 to Vdd via a 5k resistor and still transmit and receive data?
Thank you
a. |
|
|
arrow
Joined: 17 May 2005 Posts: 213
|
|
Posted: Mon Jun 05, 2006 8:04 am |
|
|
Hi
I have just put the Tx from the SMiRF onto an Oscope.
When its not connected to the PIC16F873 I see 5V.
When its connected to the PIC16F873 Pin_C6 I see 1V.
Does this sound right to you?
All the best
a. |
|
|
Ttelmah Guest
|
|
Posted: Mon Jun 05, 2006 8:19 am |
|
|
Hint.
The TX pin on the SMiRF, goes to the RX pin on the PIC, and vice verse...
Best Wishes |
|
|
arrow
Joined: 17 May 2005 Posts: 213
|
|
Posted: Mon Jun 05, 2006 8:43 am |
|
|
Hi
Yes I did do that Tx on the SMiRF to Rx on the PIC
and the Rx on the SMiRF to the Tx on the PIC.
I have put a 7.2k resistor from PIN_C7 to Vdd.
Also, will a printf command be interrupted by an
int_rda?
Thank you
a. |
|
|
Ttelmah Guest
|
|
Posted: Mon Jun 05, 2006 9:09 am |
|
|
On your earlier post, you talk about connecting TX on the module to C6 (which is TX on the PIC..).
Yes, a printf, will be interupted, _provided_ you are not using a printf inside the interrupt.
It is probable, that you may have to write the code to be 'break tolerant' on a radio like this. It'd be perfectly normal for the unit to drop the RX line, when the bluetooth connection is lost. You need to find out from the manufacturer, what the unit does in this case. If it does issue a 'break' (pulling the receive line permanently low), then you may have to consider running the line into another pin like the B0 interrupt as well, and disabling the receive routine, if a break character is received, and only re-enabling it if the line rises.
Best Wishes |
|
|
arrow
Joined: 17 May 2005 Posts: 213
|
|
Posted: Mon Jun 05, 2006 9:22 am |
|
|
Hi Ttelmah
Sorry I made a typo- I am running the Tx and Rx lines correctly (as far as I can tell). I do receive the data by having a printf in the main program.
However, I cannot get the data to stop being sent- using the int_rda. It seems that the int_rda is being ignored during the printf.
When the printf is not operating I do get an interrupt in the int_rda routine (this is what starts the whole data transmission).
I am just wondering if I should use something other than int_rda.
kbhit()?
I would appreciate any suggestions that you might have
a. |
|
|
Ttelmah Guest
|
|
Posted: Mon Jun 05, 2006 9:40 am |
|
|
There seems to be a crossover in what you are saying. INT_RDA, has nothing to do with _sending_ data, yet you say:
" I cannot get the data to stop being sent- using the int_rda".
INT_RDA, reflects data _arriving_ at the PIC only.
Now it is possible that int_rda, is being disabled in the printf, but if so, this is because of something being used in both locations. What does your RDA interrupt do?. Look at the EX_SISR.c, for an example of how to use the receive interrupt to handle incoming communications. I suspect you are sending data from the RDA interrupt (your comment about using this to start a transmission suggests this), and if so, then this is why the interrupt is disabled in the printf.
If the code is inside a printf, you won't be able to get to a kbhit routine. Kbhit, only software 'polls' the same flag that triggers the interrupt.
Best Wishes |
|
|
arrow
Joined: 17 May 2005 Posts: 213
|
|
Posted: Mon Jun 05, 2006 9:48 am |
|
|
Hi Ttelmah
If I may explain my problem:
I have the following code:
Code: |
#int_rda
void interuptIn(){
ch = getc();
if(ch==36)
setFlag = true;
if(ch==42)
setFlag = false;
}
main(){
setFlag = false;
while(true){
if(setFlag)
printf("ok here we are");
}
|
I would like to send a character "36" and for it to start printing "ok here we are" to the hyperterminal repeatedly.
While this is happening- I would like to hit the keyboard with character "42" and for the transmission (printf) to stop.
Can you see anything wrong with the code?
Thank you
a. |
|
|
jecottrell
Joined: 16 Jan 2005 Posts: 559 Location: Tucson, AZ
|
|
Posted: Mon Jun 05, 2006 11:04 am |
|
|
Here is a tip that will go a long way when starting any project:
Build up hardware and software one piece at a time. That way you'll never have to decide what is causing 'the' problem.
So, start with a simple routine such as this to see if your PIC is transmitting as expected:
Code: |
main() {
delay_ms(1000); //delay 1 second between transmits
printf("ok here we are\n\r"); //test print and CRLF
}
|
Once you decide that is working as expected we'll try to help you with the receive interrupt. But only one piece at a time.....
John |
|
|
Mark
Joined: 07 Sep 2003 Posts: 2838 Location: Atlanta, GA
|
|
|
|