Gps Interface With Microcontroller

19
SOLAR TRACKING SYSTEM USING GPS BLOCK DIAGRAM *SPA = SUN POSITION ALGORITHM PC (SPA) GPS RECEIVER DRIVER CIRCUIT LATITUDE LONGITUD E DATE; TIME SOLAR CELL STEPPER MOTOR

Transcript of Gps Interface With Microcontroller

Page 1: Gps Interface With Microcontroller

SOLAR TRACKING SYSTEM USING GPS

BLOCK DIAGRAM

*SPA = SUN POSITION ALGORITHM

PC

(SPA)

GPS

RECEIVER

DRIVER

CIRCUIT

LATITUDE

LONGITUDE

DATE; TIME

SOLAR

CELL

STEPPER

MOTOR

Page 2: Gps Interface With Microcontroller

How to extract details from GPS Receiver using 8051 Micro-controller

This project is an extension to interfacing GPS with 8051. Here the microcontroller interfaced with GPS module is used to obtain latitude, longitude, time, date and speed of the receiver. These received values are displayed on a 16x2 character LCD.

Page 3: Gps Interface With Microcontroller

Description:

The GPS module continuously transmits serial data (RS232 protocol) in the form of sentences according to NMEA standards. The latitude, longitude, time, date and speed values of the receiver are contained in the GPRMC sentence as given in the following example (also refer NMEA format for other sentences). In this project, these values are extracted from the GPRMC sentence and are displayed on LCD.

Example : $GPRMC,132455.970,A,2651.0145,N,07547.7051,E,0.50,342.76,301010,,,A*64

where: RMC132455.970A2651.0145, N07547.7051, E0.50342.76301010Empty field (xxx.x, y)*64

Recommended Minimum sentence CFix taken at 13:24:55.970 UTCStatus A=Active or V=Void.Latitude 26 deg 51.0145' NLongitude 075 deg 47.7051' ESpeed over the ground in knotsTrack angle in degrees TrueDate : 30th of October 2010Magnetic VariationThe checksum data, always begins with *

 The serial data is taken from the GPS module through MAX232 into the SBUF register of 8051 controller (refer serial interfacing with 8051). The serial data from the GPS receiver is taken by using the Serial Interrupt of the controller. This data consists of a sequence of NMEA sentences from which GPRMC sentence is identified and processed.

The extraction of required values is done as follows. The first six bytes of the data received are compared with the pre-stored ($GPRMC) string and if matched then only data is further accounted for; otherwise the process is repeated again. From the comma delimited GPRMC sentence, latitude, longitude, date, time, speed values are extracted by finding the respective comma positions. The values thus extracted are displayed on the LCD interfaced with AT89C51.The circuit connections are as follows:

Page 4: Gps Interface With Microcontroller

Receiver1 (R1) of MAX232 has been used for the serial communication. The receiver pin of GPS module is connected to R1IN (pin13) of MAX232. R1OUT (pin 12) of MAX232 is connected to RxD (P3.0) of AT89C51.

Pins 1-3 of port P1 (P1.0, P1.1 & P1.2 respectively) of AT89C51 are connected to the control pins (RS, R/W& EN) of LCD. The data pins of LCD are connected to Port P2 of the controller. The latitude and longitude positions are displayed on the LCD.CKT DIAGRAM

Page 5: Gps Interface With Microcontroller

Program to display time date,latitude,longitude,speed on LCD by extracting the GPRMC statement sent by GPS receiver#include<reg51.h>#define port2 P2 sbit rs = P1^0;sbit rw = P1^1;sbit e = P1^2; char info[70];char test[6]={"$GPRMC"};char comma_position[13];unsigned int check=0,i;unsigned char a;void receive_data();void lcd_time();void lcd_latitude();void lcd_longitude();void lcd_speed();void lcd_date();//DELAY FUNCTIONvoid delay(unsigned int msec){    int i,j ;    for(i=0;i<msec;i++)    for(j=0;j<1275;j++); }// LCD COMMAND SENDING FUNCTIONvoid lcd_cmd(unsigned char item){    port2 = item;    rs= 0;    rw=0;    e=1;    delay(1);    e=0;    return;} // LCD DATA SENDING FUNCTIONvoid lcd_data(unsigned char item){    port2 = item;    rs= 1;    rw=0;    e=1;    delay(1);    e=0;    return;} // LCD STRING SENDING FUNCTION void lcd_string(unsigned char *str){

Page 6: Gps Interface With Microcontroller

    int i=0;    while(str[i]!='\0')    {        lcd_data(str[i]);        i++;        delay(10);    }    return;}// SERIAL PORT SETTINGvoid serial(){    TMOD=0x20;    //MODE=2    TH1=0xfa;      // 4800 BAUD    SCON=0x50  ;  // SERIAL MODE 1 ,8- BIT DATA ,1 STOP BIT ,1 START BIT , RECEIVING ON    TR1=1;          //TIMER START}void find_comma(){    unsigned int i,count=0;    for(i=0;i<70;i++)    {            if(info[i]==',')        {            comma_position[count++]=i;        }    }}void compare(){      IE=0x00;           find_comma();    lcd_time();    lcd_date();    lcd_latitude();    lcd_longitude();    lcd_speed();    check=0;    IE=0x90;}  void receive_data()            interrupt 4                      {    info[check++]=SBUF;      //Read SBUF    if(check<7)    {        if(info[check-1]!=test[check-1])        check=0;    }    RI=0;}void lcd_time(){    unsigned int c1=comma_position[0];     lcd_cmd(0x01);                 //Clear LCD display    lcd_data(comma_position[0]);    delay(50);

Page 7: Gps Interface With Microcontroller

    lcd_cmd(0x01);                //Clear LCD display    lcd_cmd(0x86);                //Move cursor to position 6 of line 1    lcd_string("TIME");            //Showing time    lcd_cmd(0xC0);                //Begining of second line    lcd_data(info[c1+1]);        //Displaying hours    lcd_data(info[c1+2]);    lcd_string(":");        lcd_data(info[c1+3]);        //Displaying minutes    lcd_data(info[c1+4]);                         lcd_string(":");    lcd_data(info[c1+5]);        //Displaying seconds    lcd_data(info[c1+6]);    lcd_data(info[c1+8]);            lcd_data(info[c1+9]);        lcd_data(info[c1+10]);        delay(250);                    //Delay, so one can see time}  void lcd_shape()                //Shape of degree symbol{    lcd_cmd(64);    lcd_data(10);    lcd_data(17);    lcd_data(17);    lcd_data(10);    lcd_data(0);    lcd_data(0);    lcd_data(0);    lcd_data(0);}void lcd_latitude(){    unsigned int c3=comma_position[2];    lcd_shape();    lcd_cmd(0x01);                 //Clear LCD display    lcd_cmd(0x84);                 //Move cursor to position 6 of line 1       lcd_string("LATITUDE");         //Showing latitude    lcd_cmd(0xC0);                 //Begining of second line      lcd_data(info[c3+1]);    lcd_data(info[c3+2]);    lcd_data(0);    lcd_data(info[c3+3]);    lcd_data(info[c3+4]);    lcd_data(info[c3+5]);    lcd_data(info[c3+6]);    lcd_data(info[c3+7]);    lcd_data(info[c3+8]);    lcd_data(info[c3+9]);    lcd_data(0x27);             //ASCII of minute sign(')    lcd_data(info[c3+10]);    lcd_data(info[c3+11]);    delay(250);} void lcd_longitude(){    unsigned int c5=comma_position[4];    lcd_cmd(0x01);                 //Clear LCD display

Page 8: Gps Interface With Microcontroller

    lcd_cmd(0x84);                 //Move cursor to position 4 of line 1    lcd_string("LONGITUDE");         //Showing longitude    lcd_cmd(0xC0);                 //Begining of second line      lcd_data(info[c5+1]);    lcd_data(info[c5+2]);    lcd_data(info[c5+3]);    lcd_data(0);    lcd_data(info[c5+4]);    lcd_data(info[c5+5]);    lcd_data(info[c5+6]);    lcd_data(info[c5+7]);    lcd_data(info[c5+8]);    lcd_data(info[c5+9]);    lcd_data(info[c5+10]);    lcd_data(0x27);               //ASCII of minute sign(')    lcd_data(info[c5+11]);    lcd_data(info[c5+12]);    delay(250);}void lcd_speed(){    unsigned int c6=comma_position[6], c7=comma_position[7];    lcd_cmd(0x01);                         //Clear LCD display    lcd_cmd(0x80);                        //Move cursor to position 5 of line 1    lcd_string("SPEED(inKNOTS)");        //Showing longitude    lcd_cmd(0xC0);                        //Begining of second line     for(i=c6+1;i<c7;i++)    {        lcd_data(info[i]);    }    lcd_string("KNOTS");    delay(250);} void lcd_date(){    unsigned int c9=comma_position[8];    lcd_cmd(0x01);             //Clear LCD display    lcd_cmd(0x85);             //Move cursor to position 5 of line 1    lcd_string("DATE");    lcd_cmd(0xC0);    lcd_data(info[c9+1]);    lcd_data(info[c9+2]);    lcd_data('-');    lcd_data(info[c9+3]);    lcd_data(info[c9+4]);    lcd_data('-');    lcd_data(info[c9+5]);    lcd_data(info[c9+6]);    delay(250);} void main(){    serial();    lcd_cmd(0x38);       //2 LINE, 5X7 MATRIX    lcd_cmd(0x0e);     //DISPLAY ON, CURSOR BLINKING    IE=0x90;

Page 9: Gps Interface With Microcontroller

    while(1)    {        if(check==69)        compare();    }} Basics

AT89C51 is an 8-bit microcontroller and belongs to Atmel's 8051 family. ATMEL 89C51 has 4KB of Flash programmable and erasable read only memory (PEROM) and 128 bytes of RAM. It can be erased and program to a maximum of 1000 times.In 40 pin AT89C51, there are four ports designated as P1, P2, P3 and P0. All these ports are 8-bit bi-directional ports, i.e., they can be used as both input and output ports. Except P0 which needs external pull-ups, rest of the ports have internal pull-ups. When 1s are written to these port pins, they are pulled high by the internal pull-ups and can be used as inputs. These ports are also bit addressable and so their bits can also be accessed individually.

 Port P0 and P2 are also used to provide low byte and high byte addresses, respectively, when connected to an external

memory. Port 3 has multiplexed pins for special functions like serial communication, hardware interrupts, timer inputs and

read/write operation from external memory. AT89C51 has an inbuilt UART for serial communication. It can be programmed

to operate at different baud rates. Including two timers & hardware interrupts, it has a total of six interrupts.

 

Pin Diagram: 

Page 10: Gps Interface With Microcontroller

Pin Description: 

 Pin No  Function  Name1

8 bit input/output port (P1) pins

P1.02 P1.13 P1.24 P1.35 P1.46 P1.57 P1.68 P1.79 Reset pin; Active high Reset10 Input (receiver) for serial communication RxD 8 bit input/output

port (P3) pinsP3.0

11 Output (transmitter) for serial communication TxD P3.112 External interrupt 1 Int0 P3.213 External interrupt 2 Int1 P3.3

Page 11: Gps Interface With Microcontroller

14 Timer1 external input T0 P3.415 Timer2 external input T1 P3.516 Write to external data memory Write P3.617 Read from external data memory Read P3.718

Quartz crystal oscillator (up to 24 MHz)Crystal 2

19 Crystal 120 Ground (0V) Ground21

8 bit input/output port (P2) pins/

High-order address bits when interfacing with external memory 

 P2.0/ A8

22  P2.1/ A9

23  P2.2/ A10

24  P2.3/ A11

25  P2.4/ A12

26  P2.5/ A13

27  P2.6/ A14

28  P2.7/ A15

29 Program store enable; Read from external program memory PSEN

30Address Latch Enable ALE

Program pulse input during Flash programming Prog

31External Access Enable;  Vcc for internal program executions EA

Programming enable voltage; 12V (during Flash programming) Vpp

32

8 bit input/output port (P0) pins 

Low-order address bits when interfacing with external memory 

 P0.7/ AD7

33  P0.6/ AD6

34  P0.5/ AD5

35  P0.4/ AD4

36  P0.3/ AD3

37  P0.2/ AD2

38  P0.1/ AD1

39  P0.0/ AD0

40 Supply voltage; 5V (up to 6.6V) Vcc

8051 Tutorial: Serial Communication

One of the 8051s many powerful features is its integrated UART, otherwise known as a serial port. The fact that the 8051 has an integrated serial port means that you may very easily read and write values to the serial port. If it were not for the integrated serial port, writing a byte to a serial line would be a rather tedious process requiring turning on and off one of the I/O lines in rapid succession to properly "clock out" each individual bit, including start bits, stop bits, and parity bits. However, we do not have to do this. Instead, we simply need to configure the serial ports operation mode and baud rate. Once configured, all we have to do is write to an SFR to write a value to the serial port or read the same SFR to read a value from the serial port. The 8051 will automatically let us know when it has finished sending the character we wrote and will also let us know whenever it has received a byte so that we can process it. We do not have to worry about transmission at the bit level--which saves us quite a bit of coding and processing time.

Page 12: Gps Interface With Microcontroller

Setting the Serial Port Mode: The first thing we must do when using the 8051s integrated serial port is, obviously, configure it. This lets us tell the 8051 how many data bits we want, the baud rate we will be using, and how the baud rate will be determined. First, lets present the "Serial Control" (SCON) SFR and define what each bit of the SFR represents:

Bit Name Bit Address Explanation of Function

7 SM0 9Fh Serial port mode bit 0

6 SM1 9Eh Serial port mode bit 1.

5 SM2 9Dh Multiprocessor Communications Enable (explained later)

4 REN 9ChReceiver Enable. This bit must be set in order to receive characters.

3 TB8 9Bh Transmit bit 8. The 9th bit to transmit in mode 2 and 3.

2 RB8 9Ah Receive bit 8. The 9th bit received in mode 2 and 3.

1 TI 99h Transmit Flag. Set when a byte has been completely transmitted.

0 RI 98h Receive Flag. Set when a byte has been completely received.

Additionally, it is necessary to define the function of SM0 and SM1 by an additional table:

SM0 SM1 Serial Mode Explanation Baud Rate

0 0 0 8-bit Shift Register Oscillator / 12

0 1 1 8-bit UART Set by Timer 1 (*)

1 0 2 9-bit UART Oscillator / 64 (*)

1 1 3 9-bit UART Set by Timer 1 (*)

(*) Note: The baud rate indicated in this table is doubled if PCON.7 (SMOD) is set.

The first four bits (bits 4 through 7) are configuration bits.

Bits SM0 and SM1 let us set the serial mode to a value between 0 and 3, inclusive. The four modes are defined in the chart immediately above. As you can see, selecting the Serial Mode selects the mode of operation (8-bit/9-bit, UART or Shift Register) and also determines how the baud rate will be calculated. In modes 0 and 2 the baud rate is fixed based on the oscillators frequency. In modes 1 and 3 the baud rate is variable based on how often Timer 1 overflows. Well talk more about the various Serial Modes in a moment.

The next bit, SM2, is a flag for "Multiprocessor communication." Generally, whenever a byte has been received the 8051 will set the "RI" (Receive Interrupt) flag. This lets the program know that a byte has been received and that it needs to be processed. However, when SM2 is set the "RI" flag will only be triggered if the 9th bit received was a "1". That is to say, if SM2 is set and a byte is received whose 9th bit is clear, the RI flag will never be set. This can be useful in

Page 13: Gps Interface With Microcontroller

certain advanced serial applications. For now it is safe to say that you will almost always want to clear this bit so that the flag is set upon reception of any character.

The next bit, REN, is "Receiver Enable." This bit is very straightforward: If you want to receive data via the serial port, set this bit. You will almost always want to set this bit.

The last four bits (bits 0 through 3) are operational bits. They are used when actually sending and receiving data--they are not used to configure the serial port.

The TB8 bit is used in modes 2 and 3. In modes 2 and 3, a total of nine data bits are transmitted. The first 8 data bits are the 8 bits of the main value, and the ninth bit is taken from TB8. If TB8 is set and a value is written to the serial port, the datas bits will be written to the serial line followed by a "set" ninth bit. If TB8 is clear the ninth bit will be "clear."

The RB8 also operates in modes 2 and 3 and functions essentially the same way as TB8, but on the reception side. When a byte is received in modes 2 or 3, a total of nine bits are received. In this case, the first eight bits received are the data of the serial byte received and the value of the ninth bit received will be placed in RB8.

TI means "Transmit Interrupt." When a program writes a value to the serial port, a certain amount of time will pass before the individual bits of the byte are "clocked out" the serial port. If the program were to write another byte to the serial port before the first byte was completely output, the data being sent would be garbled. Thus, the 8051 lets the program know that it has "clocked out" the last byte by setting the TI bit. When the TI bit is set, the program may assume that the serial port is "free" and ready to send the next byte.

Finally, the RI bit means "Receive Interrupt." It funcions similarly to the "TI" bit, but it indicates that a byte has been received. That is to say, whenever the 8051 has received a complete byte it will trigger the RI bit to let the program know that it needs to read the value quickly, before another byte is read.

Setting the Serial Port Baud Rate

Once the Serial Port Mode has been configured, as explained above, the program must configure the serial ports baud rate. This only applies to Serial Port modes 1 and 3. The Baud Rate is determined based on the oscillators frequency when in mode 0 and 2. In mode 0, the baud rate is always the oscillator frequency divided by 12. This means if youre crystal is 11.059Mhz, mode 0 baud rate will always be 921,583 baud. In mode 2 the baud rate is always the oscillator frequency divided by 64, so a 11.059Mhz crystal speed will yield a baud rate of 172,797.

In modes 1 and 3, the baud rate is determined by how frequently timer 1 overflows. The more frequently timer 1 overflows, the higher the baud rate. There are many ways one can cause timer 1 to overflow at a rate that determines a baud rate, but the most common method is to put timer 1

Page 14: Gps Interface With Microcontroller

in 8-bit auto-reload mode (timer mode 2) and set a reload value (TH1) that causes Timer 1 to overflow at a frequency appropriate to generate a baud rate.

To determine the value that must be placed in TH1 to generate a given baud rate, we may use the following equation (assuming PCON.7 is clear).

TH1 = 256 - ((Crystal / 384) / Baud)If PCON.7 is set then the baud rate is effectively doubled, thus the equation becomes:

TH1 = 256 - ((Crystal / 192) / Baud)For example, if we have an 11.059Mhz crystal and we want to configure the serial port to 19,200 baud we try plugging it in the first equation:

TH1 = 256 - ((Crystal / 384) / Baud)TH1 = 256 - ((11059000 / 384) / 19200 )TH1 = 256 - ((28,799) / 19200)TH1 = 256 - 1.5 = 254.5

As you can see, to obtain 19,200 baud on a 11.059Mhz crystal wed have to set TH1 to 254.5. If we set it to 254 we will have achieved 14,400 baud and if we set it to 255 we will have achieved 28,800 baud. Thus were stuck...

But not quite... to achieve 19,200 baud we simply need to set PCON.7 (SMOD). When we do this we double the baud rate and utilize the second equation mentioned above. Thus we have:

TH1 = 256 - ((Crystal / 192) / Baud)TH1 = 256 - ((11059000 / 192) / 19200)TH1 = 256 - ((57699) / 19200)TH1 = 256 - 3 = 253

Here we are able to calculate a nice, even TH1 value. Therefore, to obtain 19,200 baud with an 11.059MHz crystal we must:

1. Configure Serial Port mode 1 or 3.2. Configure Timer 1 to timer mode 2 (8-bit auto-reload).3. Set TH1 to 253 to reflect the correct frequency for 19,200 baud.4. Set PCON.7 (SMOD) to double the baud rate.

Writing to the Serial PortOnce the Serial Port has been propertly configured as explained above, the serial port is ready to be used to send data and receive data. If you thought that configuring the serial port was simple, using the serial port will be a breeze.

To write a byte to the serial port one must simply write the value to the SBUF (99h) SFR. For example, if you wanted to send the letter "A" to the serial port, it could be accomplished as easily as:

MOV SBUF,#AUpon execution of the above instruction the 8051 will begin transmitting the character via the serial port. Obviously transmission is not instantaneous--it takes a measureable amount of time to

Page 15: Gps Interface With Microcontroller

transmit. And since the 8051 does not have a serial output buffer we need to be sure that a character is completely transmitted before we try to transmit the next character.

The 8051 lets us know when it is done transmitting a character by setting the TI bit in SCON. When this bit is set we know that the last character has been transmitted and that we may send the next character, if any. Consider the following code segment:

CLR TI ;Be sure the bit is initially clearMOV SBUF,#A ;Send the letter A to the serial portJNB TI,$ ;Pause until the TI bit is set.

The above three instructions will successfully transmit a character and wait for the TI bit to be set before continuing. The last instruction says "Jump if the TI bit is not set to $"--$, in most assemblers, means "the same address of the current instruction." Thus the 8051 will pause on the JNB instruction until the TI bit is set by the 8051 upon successful transmission of the character.

Reading the Serial Port

Reading data received by the serial port is equally easy. To read a byte from the serial port one just needs to read the value stored in the SBUF (99h) SFR after the 8051 has automatically set the RI flag in SCON.

For example, if your program wants to wait for a character to be received and subsequently read it into the Accumulator, the following code segment may be used:

JNB RI,$ ;Wait for the 8051 to set the RI flagMOV A,SBUF ;Read the character from the serial port

The first line of the above code segment waits for the 8051 to set the RI flag; again, the 8051 sets the RI flag automatically when it receives a character via the serial port. So as long as the bit is not set the program repeats the "JNB" instruction continuously.Once the RI bit is set upon character reception the above condition automatically fails and program flow falls through to the "MOV" instruction which reads the value