|
|
View previous topic :: View next topic |
Author |
Message |
theMagni
Joined: 21 May 2004 Posts: 48 Location: Victoria, BC
|
16F628 RS232 not transmitting or receiving. |
Posted: Tue May 25, 2004 12:23 pm |
|
|
Hello, forum:
I am using v3.178 on a 16LF628. I am trying to send data on the RS232 to communicate between the PIC and a GPS unit. The hardware is fine - whilst monitoring the wires, I can see that the GPS unit is sending its default set of strings.
However, I can't get the chip to send the string to request the non-default data. Previous versions of the code (which are unreadably obfuscated) were able to send and receive the required information.
This leads me to believe that the problem is a PEBKAS error. (Problem exists between keyboard and seat.) I've clearly not set some critical value somewhere. My question is, what's that missing setting?
Thank you for your help.
Code: |
#define GGA_REQUEST "$PXEMSNM,0001,01*50"
int1 get_GPS_fix( struct GPS_data * G_P_S )
{
int1 got_fix = false;
#use rs232(baud=9600, xmit=PIN_B2, rcv=PIN_B1, RESTART_WDT)
//Set the output pins to output.
TRIS_B = 0b10001011; // PORT B.2 RS232_XMT, B.4 TX_ON, B.5 PHASE_1
// B.6 PHASE_2 are outputs. PORT_B.0 TIMEBASE,
// B.1 RS232_RCV, B.3 MORT_IO, B.7 RTS are IN.
PORT_B = 0b01100000; // PORT B.2 RS232_XMT = 0 (idle state for GPS
// interface), B.3 PLL_ON = 0 (xmtr PLL off),
// B.4 TX_ON = 0 (xmtr off), B.5 PHASE_1 = 1
// & B.6 PHASE_2 = 1 (xmtr modulator phase
// controls inactive), all other pins are IN
// Power up the GPS engine.
GPS_ON = HIGH;
// Wait for GPS engine to power up (250ms is marginal).
delay_ms( 1000 );
//Wait for the GGA request to clear, then wait for the GGA data
//to come back. Do nothing until then.
if( send_request( GGA_REQUEST ) )
{ //do something }
//A *LOT* more code goes here, but it's not important.
}
// Sends the NMEA string $PXEMSNM,0001,01*50 (followed by <CR> <LF>)
// which sets up the Xemics GPS module to send GGA data every second.
// Note - strings are hard coded, because of lack of memory space.
int1 send_request( char request[19] )
{
int1 return_value = false;
putc(0); // Send a dummy character to flush out the GPS uart.
putc(0);
putc(0);
putc( request );
putc(13); //CR
putc(10); //LF
//The return and line feed are automatically sent with puts().
return_value = true;
return( return_value );
}
|
|
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Tue May 25, 2004 1:48 pm |
|
|
My suggestion is to always keep things simple.
If you just want to send that string, here is a routine that will do it.
Code: | char send_request(void)
{
putc(0); // Send 3 dummy chars to flush GPS USART.
putc(0);
putc(0);
puts("$PXEMSNM,0001,01*50"); // Send string, followed by CRLF.
return(TRUE);
} |
|
|
|
theMagni
Joined: 21 May 2004 Posts: 48 Location: Victoria, BC
|
|
Posted: Tue May 25, 2004 3:03 pm |
|
|
Thanks, PCM. I tried that, but I'm still not transmitting. There's no activity on the transmit pin, and the GPS keeps sending out its default messages.
The reason I didn't hardcode in the message in that function is because I call it three times. That's in the code that I didn't include.
PCM programmer wrote: | My suggestion is to always keep things simple.
If you just want to send that string, here is a routine that will do it.
|
|
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Tue May 25, 2004 3:18 pm |
|
|
If it's not transmitting, then create a simple test program,
such as the following one. Run this program, and then
look at pin B2 for activity. (Change the oscillator fuse,
clock speed, and baud rate as required for your proto board).
Code: | #include <16F628.h>
#fuses XT, NOWDT, NOPROTECT, PUT, BROWNOUT, NOLVP
#use Delay(Clock=4000000)
#use rs232(baud=9600, xmit=PIN_B2, rcv=PIN_B1, ERRORS)
//=========================================
void main(void)
{
while(1)
{
putc(0x55);
}
} |
|
|
|
theMagni
Joined: 21 May 2004 Posts: 48 Location: Victoria, BC
|
|
Posted: Tue May 25, 2004 5:13 pm |
|
|
PCM:
The test program is working. After changing it to send out the request ( "$PXEMSNM,0001,01*50" ), I get the expected return string on the RS232 recieve pin. I had to put in a bit of a delay to prevent gibberish, but I am getting the correct data.
To me, this says that I'm not getting to the function. It's nice to know that I did get the RS232 settings set properly.
Thanks for your help.
PCM programmer wrote: | If it's not transmitting, then create a simple test program,
such as the following one. Run this program, and then
look at pin B2 for activity. (Change the oscillator fuse,
clock speed, and baud rate as required for your proto board).
|
|
|
|
Humberto
Joined: 08 Sep 2003 Posts: 1215 Location: Buenos Aires, La Reina del Plata
|
|
Posted: Wed May 26, 2004 7:25 am |
|
|
Quote: |
This leads me to believe that the problem is a PEBKAS error. (Problem exists between keyboard and seat.)
|
Regarding the PEKBAS, you just post a couple of functions out of context. In this way I canīt see how they works. Pls drop the relevant code in main() regarding how such functions are called.
Humberto |
|
|
theMagni
Joined: 21 May 2004 Posts: 48 Location: Victoria, BC
|
|
Posted: Wed May 26, 2004 11:11 am |
|
|
Humberto:
For testing, I've modified main so it's as listed below. I'm using the serial port monitor to figure out what's going on in the circuit. It's transmitting just fine, but I think it's not receiving. (The "putc(timed_getc());") plan is giving the timeout character.)
Code: |
main()
{
struct GPS_data GPS;
do //superloop
{
if( get_GPS_fix( &GPS )
{
// do nothing;
}
}while(true);
}
|
Humberto wrote: | Quote: |
This leads me to believe that the problem is a PEBKAS error. (Problem exists between keyboard and seat.)
|
Regarding the PEKBAS, you just post a couple of functions out of context. In this way I canīt see how they works. Pls drop the relevant code in main() regarding how such functions are called.
Humberto |
|
|
|
theMagni
Joined: 21 May 2004 Posts: 48 Location: Victoria, BC
|
|
Posted: Wed May 26, 2004 12:33 pm |
|
|
It's funny how the manual doesn't say that you should include the "ERRORS" option in the list of options. I put it in, and I was able to start receiving.
Thanks for your help, guys. |
|
|
Kasper
Joined: 14 Jan 2004 Posts: 88 Location: Aurora, Ontario, Canada
|
|
Posted: Wed May 26, 2004 1:13 pm |
|
|
theMagni wrote: | It's funny how the manual doesn't say that you should include the "ERRORS" option in the list of options. I put it in, and I was able to start receiving.
Thanks for your help, guys. |
I found that the manual really needs updating by someone who did not write the compiler so the obvious stuff( to the compiler writers) is included |
|
|
|
|
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
|