|
|
View previous topic :: View next topic |
Author |
Message |
arif Guest
|
kbhit() |
Posted: Wed Sep 08, 2004 7:10 am |
|
|
hi all,
i use two rs232 ports (16F877A)
one is hardware and the other is software.
i want to test kbhit() for incoming serial data.
The problem is how can i understand hardware or software data received by using kbhit().
Can i use kbhit like this:
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7, enable=pin_b0, stream=host)////harware
#use rs232(baud=1000, xmit=PIN_d0, rcv=PIN_d1,stream=loop)///software
....
....
kbhit(loop)///software serial data test?
kbhit(host)///hardware serial data test?
i tryed these but my code din't work.
Please help... |
|
|
Ttelmah Guest
|
Re: kbhit() |
Posted: Wed Sep 08, 2004 8:04 am |
|
|
arif wrote: | hi all,
i use two rs232 ports (16F877A)
one is hardware and the other is software.
i want to test kbhit() for incoming serial data.
The problem is how can i understand hardware or software data received by using kbhit().
Can i use kbhit like this:
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7, enable=pin_b0, stream=host)////harware
#use rs232(baud=1000, xmit=PIN_d0, rcv=PIN_d1,stream=loop)///software
....
....
kbhit(loop)///software serial data test?
kbhit(host)///hardware serial data test?
i tryed these but my code din't work.
Please help... |
It won't.
The software port, has no ability to receive a character, unless the code is actually sitting 'waiting' for it. If you want to have the code actually detect a character when it arrives, it may be possible, by using one of the external interrupt pins, and triggering the receive code, wen the edge is seen on the srial stream.
The kbhit function, is dependant on there being a hardware register to actually receive and 'hold' a character for you.
Best Wishes |
|
|
Mark
Joined: 07 Sep 2003 Posts: 2838 Location: Atlanta, GA
|
|
Posted: Wed Sep 08, 2004 8:17 am |
|
|
Quote: |
KBHIT()
Syntax: value = kbhit()
Parameters: None
Returns: 0 (or FALSE) if getc() will need to wait for a character to
come in, 1 (or TRUE) if a character is ready for getc()
Function: If the RS232 is under software control this function
returns TRUE if the start bit of a character is being sent
on the RS232 RCV pin. If the RS232 is hardware this
function returns TRUE is a character has been received
and is waiting in the hardware buffer for getc() to read.
This function may be used to poll for data without
stopping and waiting for the data to appear. Note that in
the case of software RS232 this function should be
called at least 10 times the bit rate to ensure incoming
data is not lost.
Availability: All devices.
|
|
|
|
SherpaDoug
Joined: 07 Sep 2003 Posts: 1640 Location: Cape Cod Mass USA
|
Re: kbhit() |
Posted: Wed Sep 08, 2004 8:23 am |
|
|
arif wrote: |
Can i use kbhit like this:
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7, enable=pin_b0, stream=host)////harware
#use rs232(baud=1000, xmit=PIN_d0, rcv=PIN_d1,stream=loop)///software
....
....
kbhit(loop)///software serial data test?
kbhit(host)///hardware serial data test?
i tryed these but my code din't work.
Please help... |
This should work fine as long as you are calling the kbhit() for the software stream at least 5 or 10 times per serial bit rate. Kbhit() will detect the beginning of the Start bit and then you can call getc() to get the character. Getc() won't return untill the beginning of the Stop bit. _________________ The search for better is endless. Instead simply find very good and get the job done. |
|
|
Mark
Joined: 07 Sep 2003 Posts: 2838 Location: Atlanta, GA
|
|
Posted: Wed Sep 08, 2004 8:25 am |
|
|
The problem is that he wants to use it for both (I believe). There is no way to tell the compiler which port to use. I believe that it will use the port of the last encountered #use rs232 |
|
|
arif Guest
|
|
Posted: Wed Sep 08, 2004 8:44 am |
|
|
Thanks everybody... |
|
|
SherpaDoug
Joined: 07 Sep 2003 Posts: 1640 Location: Cape Cod Mass USA
|
|
Posted: Wed Sep 08, 2004 9:11 am |
|
|
kbhit(loop) checks the loop stream.
kbhit(host) checks the host stream.
Streams are not real well documented but if you look on this bbs the info it there. _________________ The search for better is endless. Instead simply find very good and get the job done. |
|
|
drh
Joined: 12 Jul 2004 Posts: 192 Location: Hemet, California USA
|
|
Posted: Wed Sep 08, 2004 1:26 pm |
|
|
The kbhit(STREAM) function tests the RCV pin asigned to that stream. If it detects a low, it returns TRUE, even if that low was not the first bit of a character. So, your program needs to call kbhit() often enough to catch the start bit. Once you call getch(STREAM), it will "bit bang" the character in until complete. If your code "missed" the start bit, you will get garbage and or hang in the getch() function. _________________ David |
|
|
SherpaDoug
Joined: 07 Sep 2003 Posts: 1640 Location: Cape Cod Mass USA
|
|
Posted: Wed Sep 08, 2004 1:45 pm |
|
|
The only way getch() should hang is if the low condition detected by kbhit() is gone by the time getch() is called. Even if kbhit() catches some low data bit, getch() should come back with some byte and perhapse a framing error if it didn't find a stop bit where it expects one. Getch() only hangs if it never sees a low to use as a Start bit. _________________ The search for better is endless. Instead simply find very good and get the job done. |
|
|
Arif Guest
|
|
Posted: Thu Sep 09, 2004 12:31 am |
|
|
Thanks everbody,
Here is my test program. İt loops 3 times only (i understand by leds) and then pic locks (i think so).
What is wrong with my program..?
Code: |
#include <16f877A.h>
#fuses XT,NOPROTECT,PUT,NOLVP,nowdt,BROWNOUT
#use delay(clock=4000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7, enable=pin_b0, stream=host)
#use rs232(baud=1000, xmit=PIN_d0, rcv=PIN_d1,stream=loop)
//#include <a2465.C>
#byte PORTA = 0x05
#byte PORTB = 0x06
#byte PORTC = 0x07
#byte PORTD = 0x08
#byte PORTE = 0x09
#define host_led pin_b7
#define loop_led pin_c3
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
char ch1=0;
char data;
int8 adres=0;
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
void init()
{
output_high(host_led);
output_high(loop_led);
delay_ms(1000);
output_low(host_led);
output_low(loop_led);
}
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
void DelayByte()
{
delay_ms(10);
}
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
int8 SensorTara(int8 adr)
{
static int ret,adresler;
int retry=0;
char ch;
adresler=adr+0x40;
output_high(loop_led);
fputc(adresler,loop);
retry=0;
ret=255;
delay_ms(10);
while ((!kbhit(loop)) && (retry < 200))
{
restart_wdt();
delay_us(300);
retry++;
}
if (Retry < 200 ) ret=fgetc(loop);
else fputc('?',loop);
output_LOW(loop_led);
DelayByte();
DelayByte();
DelayByte();
if (kbhit()) ch=fgetc(loop);
if ((ret >='0') && (ret <='9')) return ret;
if (ret ==':') return ret;
ret=255;
return ret;
}
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
void main()
{
init();
delay_ms(100);
while (1)
{
adres='X';
if(!input(pin_a0)) adres='A';
if(!input(pin_a1)) adres='B';
if(!input(pin_a2)) adres='C';
if(!input(pin_a3)) adres='D';
if(adres=='X')
{
disable_interrupts(int_rda);
disable_interrupts(global);
ch1=sensortara(1); ///will answer by sending '0'
if((ch1>='0') && (ch1 <='9')) output_high(loop_led);
delay_ms(10);
output_low(loop_led);
delay_ms(40);
}
else
{
enable_interrupts(int_rda);
enable_interrupts(global);
}
delay_ms(700);
}
}
#int_rda
receive()
{
data=fgetc(host); ///receives every message from host
if(data==adres) ///test address
{
output_high(host_led);
DELAY_MS(5);
fputc(1,host); ///send answer to host
fgetc(host); ///hardware buffer empty
output_low(host_led);
}
}
|
|
|
|
Ttelmah Guest
|
|
Posted: Thu Sep 09, 2004 2:06 am |
|
|
I'd suspect you are overflowing the UART input buffer.
When a character is being received on the hardware UART, you are going to the interrupt routine, which then waits for 5mSsec, sends a character, and waits for another character to come back. If there is not a 'reply' character, the code will hang waiting here, or if there is incoming data during the 'wait' (remember a character takes only just under 1mSec at 9600bps), the UART will have overflowed, and the code will again hang.
General rule, avoid delays, waiting for characters, or sending characters inside the interrupt handler. Look at the ex_sisr.c example, on how to buffer incoming data. Then write your main loop, to just monitor the buffer, flash LEDs, and send replies as required.
Also as a general comment, save time, and don't fiddle with the interrupt settings on every loop. If you have enabled the interrupts you require, just toggle the 'global' setting, to turn them all on/off. hence you only need the one instruction to enable/disable everything. Again though, if you are using an interrupt driven system, keep the times when interrupts are disabled, _short_. As it currently stands, the interrupts are turned off for over 40mSec in the main loop, is 'X' is seen, and again the UART will have overflowed, if characters have arrived in this time...
Best Wishes |
|
|
Arif Guest
|
|
Posted: Thu Sep 09, 2004 2:28 am |
|
|
Thanks a lot
i will try it. |
|
|
|
|
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
|