|
|
View previous topic :: View next topic |
Author |
Message |
zogbog
Joined: 02 Jun 2004 Posts: 16
|
Timed Out Get C |
Posted: Mon May 22, 2006 12:56 pm |
|
|
I am trying to use the EX_TGETC.C example in my code.
All is working well but i need some help with the timer.
The ccs help states
"Note that without a hardware UART the delay_us should be less than a tenth of a bit time (10 us at 9600 baud). With hardware you can make it up to 10 times the bit time. (1000 us at 9600 baud). Use two counters if you need a timeout value larger than 65535."
and the example code is
Code: |
short timeout_error;
char timed_getc()
{
long timeout;
timeout_error=FALSE;
timeout=0;
while(!kbhit&&(++timeout<50000)) // 1/2 second
delay_us(10);
if(kbhit())
return(getc());
else
{
timeout_error=TRUE;
return(0);
}
}
|
I have two main problems
1) How is the 50000 derived to be 1/2 sec.
2) How do i use two counters to increase the timeout durration.
My header info is as follows:
Code: |
#include <16F877.h>
#device ADC=10;
#use delay (CLOCK=4000000)
#fuses XT,NOWDT,NOPUT,NOLVP,BROWNOUT
#use rs232(baud=19200, parity=N, xmit=PIN_C6, rcv=PIN_C7)
#include <input.c> |
any help or comments are appreciated as always
thanks |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Mon May 22, 2006 3:30 pm |
|
|
You are using the hardware UART, so the 2nd sentence that begins with
"With hardware" applies to your program.
Your baud rate is 19200, so the time for one character is 10/19200,
which is approximately 521 us. (8 data bits, plus 1 start and 1 stop bit).
So theoretically, you could set the delay_us() value to 500, based on
the CCS recommendation. However, your oscillator speed is much
slower at only 4 MHz, compared to 20 MHz shown in the CCS example.
It takes at least 20 instruction cycles to execuite the while() loop.
That's 20 us, with a 4 MHz clock. So let's use a much safer value
for the delay_us(), such as 200 us. Then a timeout count of 50000
will give a 10 second timeout. (50000 x 200 = 10,000,000 usec =10 sec)
In fact, because the loop itself takes 20 us, the actual timeout is more
like 220 x 50,000 = 11 seconds. Example:
Code: | while(!kbhit&&(++timeout<50000)) // 10 second timeout (nominal)
delay_us(200); |
|
|
|
|
|
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
|