|
|
View previous topic :: View next topic |
Author |
Message |
runtime
Joined: 15 Sep 2003 Posts: 36
|
GPS receive on pin B2, how to timeout (PIC16F876) |
Posted: Sat Aug 28, 2004 3:58 pm |
|
|
Hello all,
PIC16f876
I am receiving GPS readings on pin B2, I did not used any software or hardware interrupts to read the GPS because I wanted to poll the GPS instead of jumping to an interrupt routine every time a GPS char is present.
So, everytime I need a GPS position, I call a routine to get the characters using fgetc(GPS), this works ok if the GPS is connected but hangs up when GPS is disconnected, how can I timeout when GPS is disconnected?
Thank you in advance
Peter |
|
|
dyeatman
Joined: 06 Sep 2003 Posts: 1933 Location: Norman, OK
|
|
Posted: Sat Aug 28, 2004 5:56 pm |
|
|
Have you tried polling using kbhit() before calling fgetc()? |
|
|
Humberto
Joined: 08 Sep 2003 Posts: 1215 Location: Buenos Aires, La Reina del Plata
|
|
Posted: Sun Aug 29, 2004 7:11 am |
|
|
Quote: |
So, everytime I need a GPS position, I call a routine to get the characters using fgetc(GPS), this works ok if the GPS is connected but hangs up when GPS is disconnected, how can I timeout when GPS is disconnected?
|
Does the level of B2 change whenever you disconnect the GPS ?
If so, put a pull up resistor (10K) in B2 and use kbhit(GPS)) function before
fgetc(GPS)) as stated dyeatman.
If this not solve your problem, post your code, headers and compiler version.
Best wishes,
Humberto |
|
|
runtime
Joined: 15 Sep 2003 Posts: 36
|
Here is the code I'm using |
Posted: Sun Aug 29, 2004 10:00 am |
|
|
// Nmea is pin B2
// GetPosition function reads $GPRMS sentence and buffers only relevant info, I need a way to get out of GetPosition if GPS not present...
#use rs232(baud=4800,rcv=Nmea,invert,stream=GPS)
#use rs232(baud=4800,xmit=MOut,rcv=MIn,stream=MODEM)
#use rs232(baud=4800,xmit=PCOut,invert,stream=PC) // RS232 to PC
// --------------------
// Function GetPosition // Parse $GPRMC
// --------------------
void GetPosition(void)
{
start: while (v != 'G') v=fgetc(GPS); // Finds the GPRMC sentence
v = fgetc(GPS);
if (v != 'P') goto start;
v = fgetc(GPS);
if (v != 'R') goto start;
v = fgetc(GPS);
if (v != 'M') goto start;
v = fgetc(GPS);
if (v != 'C') goto start;
fpoint = False; // first point found?
comma = 0; // Count comma chars
status = 0; // Build status bit
i = 0; // Buffer the GPRMC sentence
do {
v = fgetc(GPS);
if (v == ',') comma++;
if (comma == 6) v = '*'; // final marker
if ((v == '.') && (!fpoint)) { // discard .999 in time field
fpoint = True;
v = fgetc(GPS);
v = fgetc(GPS);
v = fgetc(GPS);
v = fgetc(GPS);
}
if (v == 'A'){ // Check for svs
sat = True;
if (firstpos) {
firstpos = False;
seconds = StoreInt - 1;
}
output_high(Valid);
bit_set(status,2);
v = fgetc(GPS); // Discard A,
v = fgetc(GPS);
}
else if (v == 'V') {
sat = False;
if (!input(Valid))(output_high(Valid)); // Flash Valid GPS led if not valid
else (output_low(Valid));
v = fgetc(GPS); // Discard V,
v = fgetc(GPS);
}
if (v == 'S') bit_set(status,3); // Build status bit
if (v == 'E') bit_set(status,4);
if ((v == 'N') || (v == 'S') || (v == 'W') || (v == 'E')) { // Discard N,S,W,E,
v = fgetc(GPS);
v = fgetc(GPS);
}
buf[i] = v; // Fill buffer
i++;
if (i == (MAXBUF - 2)) break;
} while (v != '*');
if (!input(Panic)) { // Check panic btn condition
remote = True;
if (!GPRSStarted && !LineOpen) BaseCall = True;
}
if (!input(Door)) { // Check Doors
DoorS = True;
if (!GPRSStarted && !LineOpen && !AckDoor) BaseCall = True;
}
else AckDoor = False;
if (remote) bit_set(status,0); // Panic bit
if (DoorS) bit_set(status,5); // Door sensor
if (!read_eeprom(12)) bit_set(status,1); // Engine Off bit
if (bit_test(status,0) && (!logP)) { // Log Panic On
seconds = StoreInt - 1;
logP = True;
ZeroStore = False;
}
if (!bit_test(status,0) && (logP)) { // Log Panic Off
seconds = StoreInt - 1;
logP = False;
ZeroStore = False;
}
if (bit_test(status,5) && (!logD)) { // Log Door Open
seconds = StoreInt - 1;
logD = True;
ZeroStore = False;
}
if (!bit_test(status,5) && (logP)) { // Log Door Close
seconds = StoreInt - 1;
logD = False;
ZeroStore = False;
}
status = status + 33;
zip(); // Compress buffer
} |
|
|
dyeatman
Joined: 06 Sep 2003 Posts: 1933 Location: Norman, OK
|
Why not try it this way? |
Posted: Sun Aug 29, 2004 5:56 pm |
|
|
A much better (cleaner) approach would be something like this:
Code: |
#define bkbhit (next_in!=next_out)
// This routine automatically fetches and stores incoming
// chars in buffer. I would call it multiple times in main to
// make sure you dont miss any chars (depending on
// how long your main code is of course).
void Checkfordata()
{
{// get char and put into a circular buffer
RXbuff[next_in] = fgetc();
t = next_in; //save current buffer pointer
// get next open position in recv buffer
next_in = (next_in + 1) % BUFFER_LEN;
if (next_in == next_out) // is it full?
next_in = t; // yes!! restore old position
} // end of CheckforData routine
// **** Start of main background loop *****
While kbhit()
CheckforData();
// call this routine in Main() to check for something in the buffer
if (bkbhit) // if begin and end are not the same, there must be
//something there to get
{
c = Rxbuff[next_out]; // so get it
next_out = (next_out + 1) % BUFFER_LEN; // update pointer
}
While kbhit()
CheckforData();
Here you process your incoming data in the main loop. Use flags to keep track of where you are in the process.
While kbhit()
CheckforData();
etc...
|
Just a suggestion that I thought might be useful.... :-) |
|
|
|
|
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
|