|
|
View previous topic :: View next topic |
Author |
Message |
hillcraft
Joined: 22 Sep 2003 Posts: 101 Location: Cape Town (South africa)
|
Streamed RS232 RX problem |
Posted: Fri Feb 27, 2004 3:54 pm |
|
|
Hi,
Maybe you guys can help me, I have been trying to solve this problem for about 8 hours now.
Dev_Connect is called which calls InitComms. Dev_Connect the calls upon char timed_getc_PORT_KL to retreive data from the PORT_KL stream.
This is the problem. I can see the data on the logic analyzer on the PIN. The BlipMarker shows correctly at the start of the received byte. For some reason the received byte is always zero. This program worked fine until recently and I cannot see why it does not work now. I have checked the port speeds, I have changed the PIC pins from C0,C1 to B0,B1. I have removed blocks of code but to no avail.
The only thing that I can still do is to put on a grass skirt, lite a fire, dance, chant and howl at the moon, nothing else seems to work!!!
Here are the relevant bits of code:
#include <16F877A.h>
#device ICD=TRUE
#use delay(clock=20000000)
#fuses HS,NOPUT,NOBROWNOUT,NOWDT,NOPROTECT,NOLVP
#define K_TX_PIN PIN_C0
#define K_RX_PIN PIN_C1
#define Blip_PIN PIN_C2
#define L_TX_PIN PIN_A0
// PC Comm speed
#use rs232(baud=19200,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8,stream=PORT_PC)
// default Dev speed
#use rs232(baud=9600,parity=N,xmit=PIN_C0,rcv=PIN_C1,bits=8,stream=PORT_KL)
void BlipMarker() {
output_high(blip_PIN);
delay_us(10);
output_low(blip_PIN);
}
char timed_getc_PORT_KL(unsigned long KEYHIT_DELAY) {
unsigned long timeout = 0;
byte retval = 0;
while (TRUE) {
if (kbhit(PORT_KL)==TRUE) {
BlipMarker();
retval = fgetc(PORT_KL);
fprintf(PORT_PC,"ret %X\n\r",retval);
if (retval > 0)
break;
}
// timeout++;
// delay_us(1);
// if (timeout>KEYHIT_DELAY)
// break;
}
return(retval);
}
void InitComms() {
int i;
// hold the bus high for 2 seconds
output_high(K_TX_PIN);
output_high(L_TX_PIN);
delay_ms(2000);
// output a low startbit for 200ms
output_low(K_TX_PIN);
output_low(L_TX_PIN);
delay_ms(200);
output_float(K_TX_PIN);
output_float(L_TX_PIN);
}
void Dev_Connect() {
byte Sync;
byte W1 = 0;
byte W2 = 0;
byte WP1 = 0;
byte WP2 = 0;
int16KWP = 0;
InitComms();
delay_ms(350);
BlipMarker();
// get the incoming data
sync =timed_getc_PORT_KL(5000);
delay_ms(5);
W1 =timed_getc_PORT_KL(5000);
delay_ms(5);
W2 =timed_getc_PORT_KL(5000);
delay_ms(5);
fprintf(PORT_PC,"Sync %X W1 %X W2 %X\n\r",sync,W1,W2);
} |
|
|
Humberto
Joined: 08 Sep 2003 Posts: 1215 Location: Buenos Aires, La Reina del Plata
|
|
Posted: Sun Feb 29, 2004 9:23 am |
|
|
Hi hillcraft,
Nobody asked yet.
Reading your code itīs not clear to me - doesnīt show the main() function nor explain the functioning - why you expect to receive a char (single char or string???) in the Com PORT_KL (software UART handler).
Quote: |
// PC Comm speed
#use rs232(baud=19200,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8,stream=PORT_PC)
// default Dev speed
#use rs232(baud=9600,parity=N,xmit=PIN_C0,rcv=PIN_C1,bits=8,stream=PORT_KL)
|
Just reversing your RS232 definitions you get the advantage of receiving the incoming char in the UART without wasting processor time in kbhit().
Don't forget to enable the corresponding interrupts.
Quote: |
// PC Comm speed
#use rs232(baud=19200,xmit=PIN_C0,rcv=PIN_C1,stream=PORT_PC) // Software UART
// default Dev speed
#use rs232(baud=9600,xmit=PIN_C6,rcv=PIN_C7,stream=PORT_KL) // Hardware UART
|
I made some changes in the following function -for debbuging purposes only - to show how you will get some info in the PC once the program abandon this function.
Code: |
char timed_getc_PORT_KL(unsigned long KEYHIT_DELAY)
{
unsigned long timeout = 0;
byte retval = 0;
if (kbhit(PORT_KL))
{
do
{
BlipMarker();
retval = fgetc(PORT_KL);
timeout++;
delay_us(1);
}while(( !retval) && ( timeout<KEYHIT_DELAY ));
if(retval) // IF retval != 0
{
fprintf(PORT_PC,"retval %X\n\r",retval);
}
if(timeout>KEYHIT_DELAY)
{
fprintf(PORT_PC,"kbhit detected, TIME_OUT error !\r\n");
}
}
return(retval);
}
|
Regards,
Humberto |
|
|
hillcraft
Joined: 22 Sep 2003 Posts: 101 Location: Cape Town (South africa)
|
KL problem |
Posted: Sun Feb 29, 2004 11:23 am |
|
|
I have found the reason for the problem by looking at the serial signal received on the K-Line.
This all occurs at 9600baud.
if you have a byte 0X55 then the data should go lo for 104us, high for 104us, lo for 104us and so on. I see the data go lo for 178us, high for 30us, lo for 178 us, high for 30us and so forth. It seems as if the data that I am receiving brings the line lo at the correct instant i.e. 104us intervals but takes th line high about 74us late.
If the software uart is rigged so as to take the sample in the middle of the bit i.e. 52us after the line goes lo and 104us thereafter, it would miss the high bits entirely.
I will do some R&D tonight so as to prove the point. It seems that I will have to take a number of samples within the 104us range so as to determine if the line has gone high
The question is: Why did the code work in the first place ? I don't really know! |
|
|
Humberto
Joined: 08 Sep 2003 Posts: 1215 Location: Buenos Aires, La Reina del Plata
|
|
Posted: Sun Feb 29, 2004 1:55 pm |
|
|
hillcraft wrote:
Quote: |
I see the data go lo for 178us, high for 30us, lo for 178 us, high for 30us and so forth. It seems as if the data that I am receiving brings the line lo at the correct instant i.e. 104us intervals but takes th line high about 74us late.
|
You didnīt mention about this kind of signal in the previous post, if you define
Quote: |
// default Dev speed
#use rs232(baud=9600,parity=N,xmit=PIN_C0,rcv=PIN_C1,bits=8,stream=PORT_KL)
|
you will admit that you are dealing with ASCII characters at 9600 bauds, @104usec/bit.
Humberto |
|
|
|
|
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
|