CCS C Software and Maintenance Offers
FAQFAQ   FAQForum Help   FAQOfficial CCS Support   SearchSearch  RegisterRegister 

ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

CCS does not monitor this forum on a regular basis.

Please do not post bug reports on this forum. Send them to CCS Technical Support

GPS and 2 baud rates

 
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion
View previous topic :: View next topic  
Author Message
uni_student



Joined: 01 Aug 2007
Posts: 38
Location: AUckland, NEW ZEALAND

View user's profile Send private message Send e-mail MSN Messenger

GPS and 2 baud rates
PostPosted: Tue May 04, 2010 3:45 am     Reply with quote

Hi, im trying out a new gps module which is using 4800 baud. Problem im having is reading time info from the RMC message and displaying onto LCD with the following format "HH:MM:SS". Old Gps module ran on 9600 baud and worked perfectly with my code. New gps module only displays seconds and "IZ" for hours and "CH" for minutes. I only seem to be reading seconds properly. So in format it looks like this "IZ:CH:32" example

Using PIC18F452, LCD using LCD117 phanderson.com kit

Code:
#use rs232(baud=9600, xmit=PIN_A5, rcv=PIN_A4, parity=N, bits=8, stream=LCD, ERRORS)
#use rs232(baud=4800, xmit=PIN_C6, rcv=PIN_C7, parity=N, bits=8, stream=GPS, ERRORS)


//code in a function
 r=message (messge, 1);
      if(r==TRUE){
         i=0;
         while(TRUE){
            z=fgetc(GPS);
            if(z==',')
               break;
            temp[i]=z;
            i++;
         }
         if(x==1){
         fprintf(LCD, "?x06");
         fprintf(LCD, "%c%c:%c%c:%c%c\r", temp[0], temp[1], temp[2], temp[3], temp[4], temp[5]);
         }
//

int message (char *mess, int x){
   int j;
   j=0;
   while(TRUE){
      z=fgetc(GPS);
      if(z=='$')
         break;
   }
   z=fgetc(GPS);
   if(z==mess[0])
      z=fgetc(GPS);
   if(z==mess[1])
      z=fgetc(GPS);
   if(z==mess[2]){
      z=fgetc(GPS);
   if(z==mess[3])
      z=fgetc(GPS);
   if(z==mess[4])
      while(j<x){
         z=fgetc(GPS);
         if(z==',')
            j++;
      }
      return TRUE;
   } else{
      return FALSE;
   }
}


Any help appreciated
Ttelmah



Joined: 11 Mar 2010
Posts: 19496

View user's profile Send private message

PostPosted: Tue May 04, 2010 4:08 am     Reply with quote

Seriously, I'd be looking at what the data format is from the GPS. Classic thing, would be something like the new unit, and the old using different lengths for the numbers. NMEA, allows you to send a time, with or without leading zeros for example, which is why you really need to search for the commas.

Best Wishes
uni_student



Joined: 01 Aug 2007
Posts: 38
Location: AUckland, NEW ZEALAND

View user's profile Send private message Send e-mail MSN Messenger

PostPosted: Tue May 04, 2010 3:55 pm     Reply with quote

Thanx for reply.

I've had both modules on the hyperterminal and messages, commas, etc are the same. Forgot to mention the LCD is running at 9600 baud, so I am switching between 9600 and 4800 all the time...has that got any implications on anything???

Cheers
Douglas Kennedy



Joined: 07 Sep 2003
Posts: 755
Location: Florida

View user's profile Send private message AIM Address

PostPosted: Wed May 05, 2010 2:14 am     Reply with quote

A gps squawks sentences at a rate the GPS determines. Probably you were lucky with the earlier GPS in that your code actually worked. An interrupt driven circular buffer is the only reliable way to interface with a GPS and for that matter most RS232 input. Without the interrupt approach is not that it doesn't work sometimes the issue is it only works sometimes.
bkamen



Joined: 07 Jan 2004
Posts: 1615
Location: Central Illinois, USA

View user's profile Send private message

PostPosted: Sun May 09, 2010 4:05 pm     Reply with quote

Douglas Kennedy wrote:
A gps squawks sentences at a rate the GPS determines. Probably you were lucky with the earlier GPS in that your code actually worked. An interrupt driven circular buffer is the only reliable way to interface with a GPS and for that matter most RS232 input. Without the interrupt approach is not that it doesn't work sometimes the issue is it only works sometimes.



I agree.

I've written routines for both the Garmin GPS16 and the DeLorme GPS2058 module (both have configurable data rates and message outputs with different config methods) both using a common IRQ driven receive buffer.... although I didn't do circular. I did a per/sentence flag and go --- just in case which ended up working out fine.

It really makes dealing with GPS's easier.

-Ben
_________________
Dazed and confused? I don't think so. Just "plain lost" will do. :D
Display posts from previous:   
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion All times are GMT - 6 Hours
Page 1 of 1

 
Jump to:  
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