<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss'><id>tag:blogger.com,1999:blog-355411830490069516</id><updated>2009-10-17T02:03:38.418-07:00</updated><title type='text'>Nikon D300 Bluetooth GPS</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://wdaehn.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/355411830490069516/posts/default'/><link rel='alternate' type='text/html' href='http://wdaehn.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>wdaehn</name><uri>http://www.blogger.com/profile/11792883669228965857</uri><email>noreply@blogger.com</email></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>12</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-355411830490069516.post-3795568391287289536</id><published>2009-08-24T07:42:00.000-07:00</published><updated>2009-08-24T07:55:16.415-07:00</updated><title type='text'>Pimp my Telescope Part 3</title><content type='html'>Some more technical data:&lt;br /&gt;&lt;br /&gt;PCB 1:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_trZeScPDm6Q/SpKnAcusNLI/AAAAAAAAADM/TJCKJEeuQb0/s1600-h/pcb1.PNG"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 391px;" src="http://2.bp.blogspot.com/_trZeScPDm6Q/SpKnAcusNLI/AAAAAAAAADM/TJCKJEeuQb0/s400/pcb1.PNG" border="0" alt="" id="BLOGGER_PHOTO_ID_5373540931560289458" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;PCB 2:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_trZeScPDm6Q/SpKnhPtdcBI/AAAAAAAAADU/ct-SbCYuicI/s1600-h/pcb2.PNG"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 386px;" src="http://2.bp.blogspot.com/_trZeScPDm6Q/SpKnhPtdcBI/AAAAAAAAADU/ct-SbCYuicI/s400/pcb2.PNG" border="0" alt="" id="BLOGGER_PHOTO_ID_5373541495001149458" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;A 3D graph of the PCB:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_trZeScPDm6Q/SpKnvg8niFI/AAAAAAAAADc/Y0RXdolX5jU/s1600-h/pcb3.PNG"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 398px; height: 400px;" src="http://2.bp.blogspot.com/_trZeScPDm6Q/SpKnvg8niFI/AAAAAAAAADc/Y0RXdolX5jU/s400/pcb3.PNG" border="0" alt="" id="BLOGGER_PHOTO_ID_5373541740146296914" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/355411830490069516-3795568391287289536?l=wdaehn.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/355411830490069516/posts/default/3795568391287289536'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/355411830490069516/posts/default/3795568391287289536'/><link rel='alternate' type='text/html' href='http://wdaehn.blogspot.com/2009/08/pimp-my-telescope-part-3.html' title='Pimp my Telescope Part 3'/><author><name>wdaehn</name><uri>http://www.blogger.com/profile/11792883669228965857</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='13986123866228273391'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_trZeScPDm6Q/SpKnAcusNLI/AAAAAAAAADM/TJCKJEeuQb0/s72-c/pcb1.PNG' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-355411830490069516.post-1263024718013150389</id><published>2009-08-23T11:05:00.000-07:00</published><updated>2009-08-23T11:32:11.520-07:00</updated><title type='text'>Pimp my Telescope Part 2</title><content type='html'>After describing the general design ideas &lt;a href="http://wdaehn.blogspot.com/2009/08/pimp-my-meade-telescope.html"&gt;in part 1&lt;/a&gt; and how the Laser was fitted into the system, the remaining parts are less fency.&lt;br /&gt;On switch controls the environmental lamp, the one the Laser flashes prior to engaging as safety warning. And two other switches turn on the LEDs for the polefinder and the finder scope. But there as well I had a problem before. Your goal is to get the selected object exactly into the center of the crosshair illuminated via the LEDS. When is it in the center? When you can't see it anymore. Didn't like that, so the microcontroller does not simply switch on the LEDs, it keeps them flashing. Simple implementation but one of the once you have seen it you do want to miss that again.&lt;br /&gt;The power line is connected to one of the analog-digital converters of the microcontroller to measure the voltage of the battery and if it droppes below a threshold, the control LED on the PCB starts flashing. Oh, did I mention I use LiPo batteries with 11.1V known from RC helicopters as power source? They are compact, cheap, do not discharge when not used - very important! - but have one downside, they should never get discharged entirely. That's the reason for that warning light.&lt;br /&gt;&lt;br /&gt;The dew shield and the temp sensor I will connect to the board later the year. And the next major improvement is to listen to the Autostar internal bus to understand its two-wire interface protocol. Then I want to respond to the autostar computer in the beginning when it is in the scanning phase and tell it is a Meade focuser. This should enable the focuser screens on the Autostar and the connected laptop. I could use these buttons then for various things like turning on the laser via the computer. Or I connect a motor to the focuser that understands the standard I²C protocol the microcontroller outputs to the RJ-11 connector. I am not that thrilled about the autostar protocol of the focuser, all you can do is selecting the speed of the focuser motor and not its absolute position but okay, we have to live with that.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/355411830490069516-1263024718013150389?l=wdaehn.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/355411830490069516/posts/default/1263024718013150389'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/355411830490069516/posts/default/1263024718013150389'/><link rel='alternate' type='text/html' href='http://wdaehn.blogspot.com/2009/08/pimp-my-telescope-part-2.html' title='Pimp my Telescope Part 2'/><author><name>wdaehn</name><uri>http://www.blogger.com/profile/11792883669228965857</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='13986123866228273391'/></author></entry><entry><id>tag:blogger.com,1999:blog-355411830490069516.post-8966619587535239734</id><published>2009-08-20T07:54:00.000-07:00</published><updated>2009-08-24T07:31:16.932-07:00</updated><title type='text'>Pimp my Meade Telescope</title><content type='html'>As another project I bought an used Meade Telescope, a LXD55 8" Smith Newton with Autostar. This is a GoTo Mount, meaning once you did setup the scope it moves to the star or planet you picked by name and keeps the object centered. It was a nice learning experience however what I liked the most was enhancing it.&lt;br /&gt;&lt;br /&gt;1. A Laser visible in the sky as a "finder".&lt;br /&gt;2. The cross-hair occular should be illuminated by the main power, not a battery, and it should blink.&lt;br /&gt;3. Same with the pole finder.&lt;br /&gt;4. Dew shield with heater should be temperature controlled.&lt;br /&gt;5. A simple light.&lt;br /&gt;6. Lithium Ion Battery saver.&lt;br /&gt;7. An electric focuser motor controlled by the Meade Autostar computer&lt;br /&gt;&lt;br /&gt;Let's start with the Laser:&lt;br /&gt;&lt;br /&gt;The problem for me was usually, what star am I looking at? During the initialization of the scope, it moves to the appoximate position of a star and your task is to center it. When you look at the sky you can see the star in question as the brightest object in that region. When you look through the main scope you can see tens of stars with similar brightness but certainly not the one you are looking for. And in the finder - a second attached but smaller scope with a bigger angle of view - there are three equally bright stars. So you have to move the scope for quite some time until you can be sure you identified the constellation and are pointing to the correct star. With a Laser it's a piece of cake.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_trZeScPDm6Q/So1ojy1LsLI/AAAAAAAAACs/Fx9PAyWKh0A/s1600-h/20090819_220901.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 346px;" src="http://2.bp.blogspot.com/_trZeScPDm6Q/So1ojy1LsLI/AAAAAAAAACs/Fx9PAyWKh0A/s400/20090819_220901.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5372064894672416946" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;ATTENTION: Only use Class 2 Laserpointers with &lt;1mW power. They are strong enough to be visible in the sky given average moist weather conditions. And only these are not dangerous to humans or animals. And not dangerous does not mean completely harmless either. So never point at somebody else, neither direct nor indirect (reflections). Above image was shot with an exposure time of 8 seconds using a 1.4 aperture setting.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;You can clearly see where the scope points to, you do not have to make any artistic exercises for multiple minutes when looking through the finder. The Laser is a stripped Laserpointer, the green ones work best as the human eye is most sensitive for this color.&lt;br /&gt;&lt;br /&gt;It is placed at the telescope clamp onto a bar where I screwed in two bushings with three adjustment screws, similar to how a viewfinder is adjusted.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_trZeScPDm6Q/So1tAsejpiI/AAAAAAAAAC0/Tao8IR6fvUk/s1600-h/20090819_221002.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 266px;" src="http://1.bp.blogspot.com/_trZeScPDm6Q/So1tAsejpiI/AAAAAAAAAC0/Tao8IR6fvUk/s400/20090819_221002.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5372069789229622818" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_trZeScPDm6Q/SpKkJHUBjRI/AAAAAAAAADE/T0nw162oLtE/s1600-h/20090728_114814.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 266px;" src="http://2.bp.blogspot.com/_trZeScPDm6Q/SpKkJHUBjRI/AAAAAAAAADE/T0nw162oLtE/s400/20090728_114814.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5373537781895236882" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Not beautiful yet, but when I find the time for a CAD plan, I will ask a friend to mill that out of alloy.&lt;br /&gt;&lt;br /&gt;One design question I asked myself was if that system should be completely independent from the telescope or plugged in to the Autostar. Given the fact that I keep forgetting to turn off the polfinder LED and hence the battery is always empty next time I need it, I certainly want to use the Autostar power. So I need to have a DC-DC converter from 12V to 3V between the AUX port of the mount and the Laser. Oh, and a switch somewhere on the mount, not the tube to avoid shaking it.&lt;br /&gt;And a safety mechanism should be implemented as well to warn people the Laser is about to engage. And.....and I need a microcontroller.&lt;br /&gt;&lt;br /&gt;I designed a PCB that &lt;br /&gt;1. is connected to the Aux-Port to draw the power and listen on the Autostar internal bus&lt;br /&gt;2. has rocker switches for the different functionality&lt;br /&gt;3. a RJ-45 connector to connect to a daugther PCB, a tiny one distributing the signals required at the tube (Laser, Temp Sensor, Finderscope LED)&lt;br /&gt;4. a RJ-11 connector for the I²C bus of the microcontroller as a future expansion connector&lt;br /&gt;5. a few mini-usb plugs for the functionalities required at the mount (Polefinder LED, Lamp)&lt;br /&gt;6. a connector for the dew shield heater&lt;br /&gt;&lt;br /&gt;So when I switch on Laser, first the LED lamp starts blinking for a few seconds and then the laser engages.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/355411830490069516-8966619587535239734?l=wdaehn.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/355411830490069516/posts/default/8966619587535239734'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/355411830490069516/posts/default/8966619587535239734'/><link rel='alternate' type='text/html' href='http://wdaehn.blogspot.com/2009/08/pimp-my-meade-telescope.html' title='Pimp my Meade Telescope'/><author><name>wdaehn</name><uri>http://www.blogger.com/profile/11792883669228965857</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='13986123866228273391'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_trZeScPDm6Q/So1ojy1LsLI/AAAAAAAAACs/Fx9PAyWKh0A/s72-c/20090819_220901.jpg' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-355411830490069516.post-8309217450663003619</id><published>2008-09-27T09:30:00.000-07:00</published><updated>2008-09-27T09:50:06.708-07:00</updated><title type='text'>GPS on Nikon - things to watchout for</title><content type='html'>There are many GPS solutions available, the details are important.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Question 1: Where does it get the power from?&lt;br /&gt;The GPS does not require a lot of power but still, an external battery might make sense. Optimum obviously would be to have the option for both, camera battery or GPS own battery.&lt;br /&gt;&lt;br /&gt;Question 2: What happens if the camera is turned off?&lt;br /&gt;Most solutions keep running! No matter if it is a bluetooth solution or a GPS connected directly to it! The reason this is done that way is so you do not have to wait for multiple seconds until the GPS has a satellite fix, it is running non-stop. The downside is, you forget to turn it off - does it have a switch even??? - and a few days later your camera battery is dead. I don't like that at all. That is one of the reasons why I did not go for the blue2can but the www.foolography.com one, this one does switch off if you turn the camera off. And actually, keeping the GPS running does not make sense anyway. If you turn off the GPS it keeps the latest satellite data in memory and if it is turned on again shortly after, it takes just a few seconds to get a fix - not minutes.&lt;br /&gt;&lt;br /&gt;Question 3: Bluetooth or direct GPS?&lt;br /&gt;The bluetooth solution is times smaller, does not have any cables and can remain attached all the time. The power consumption is marginal.&lt;br /&gt;The GPS receiver can be any standard one, if you want a new one no problem, if you want a GPS mouse that supports logging as well - sure, why not. You just have to pair it again. With the bluetooth solution obviously the GPS has its own battery and its own ON/OFF switch. What I have chosen is a GPS mouse that goes into a standby mode if it is not moved for 10 minutes. So I turn off the camera, turn it on again a few minutes later to take another picture - the GPS data I get immediately as the GPS receiver was never turned off. Back home I just put the camera and the GPS into its storage box, 10 minutes later the GPS shuts itself down automatically. Very neat.&lt;br /&gt;The major advantage of the direct GPS is you can use one that has a built in compass and store this information as well in the EXIF data of the pictures.&lt;br /&gt;&lt;br /&gt;Question 4: What if there is no GPS reception while taking a picture?&lt;br /&gt;Imagine you walk into a house and take a few pictures there. No GPS signal shall be available here. You will see that GPS icon in the camera flashing. The alternative would be the GPS device keeps sending the last known position. Don't know what's better in such a case. Personally, if GPS information is important I check if the camera has data. And if it is not important, I do not want wrong or old data. On the other hand....&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/355411830490069516-8309217450663003619?l=wdaehn.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/355411830490069516/posts/default/8309217450663003619'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/355411830490069516/posts/default/8309217450663003619'/><link rel='alternate' type='text/html' href='http://wdaehn.blogspot.com/2008/09/gps-on-nikon-things-to-watchout-for.html' title='GPS on Nikon - things to watchout for'/><author><name>wdaehn</name><uri>http://www.blogger.com/profile/11792883669228965857</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='13986123866228273391'/></author></entry><entry><id>tag:blogger.com,1999:blog-355411830490069516.post-2471130222287095668</id><published>2008-09-27T03:08:00.000-07:00</published><updated>2008-09-27T04:46:55.402-07:00</updated><title type='text'>Motor Tripod - Future Enhancements</title><content type='html'>Grab the GPS signal, convert it to 5V level and send it to the Nikon Camera's 10 Pin plug. &lt;a href="http://www.k-i-s.net/article.php?article=20"&gt;http://www.k-i-s.net/article.php?article=20&lt;/a&gt; With that, whenever a picture is taken, the GPS position is part of the EXIF data.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Let the microcontroller release the Camera Shutter. This is a functionality of above 10pin plug and would allow taking pictures in intervals, e.g. every 20 seconds. Or a a button is implemented on the remote XBee so you can operate the shutter from remote.&lt;br /&gt;&lt;br /&gt;Another otpion would be to use that tripod for Gigapixel images. The you point the camera into one direction, press start and then the camera takes one picture, moves the head by a few degrees, takes another picture, etc and at the end all pictured are merged into one image with extreme high resolution. &lt;a href="http://www.tawbaware.com/maxlyons/gigapixel.htm"&gt;http://www.tawbaware.com/maxlyons/gigapixel.htm&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Another option would be to remove the GPS tracking function and rather remote control the tripod from the computer. The hardware for this is simple, the droids board has an optional USB connector instead of the XBee module. Or we use an USB-to-XBee adapter available from that company as well. You would send some serial commands to the board, the software parses those commands and moves the camera head accordingly. No big challange, just the parser code has to be modified. And then via Nikons Camera Control software you could view the life image on the computer. There seems to be some open libraries (&lt;a href="http://www.gphoto.org/"&gt;http://www.gphoto.org/&lt;/a&gt;) as well to build an integrated solution. Or you simply use a webcam.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Apart from these enhancements there is one particular issue. The microcontroller does not know the servo's initial position. So all it can do is setting the position to central at the beginning at that results in one very quick movement. As the servos are very strong, that does not do the entire construction very good, not to mention the force on the camera. The servos do support programming and with that you can define speed or read the current servo position. And that would be all that is needed. Implementing the protocol would take a while so it will not be possible for me. Right now, I turn on the tripod, let it move to the initial position and then put the camera onto it.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Next steps:&lt;br /&gt;&lt;br /&gt;Check with a scope the servo speed implementation works flawlessly. It is not perfect yet as you can see in the video.&lt;br /&gt;&lt;br /&gt;See what needs to be done to take the GPS signal and send it to the camera.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/355411830490069516-2471130222287095668?l=wdaehn.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/355411830490069516/posts/default/2471130222287095668'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/355411830490069516/posts/default/2471130222287095668'/><link rel='alternate' type='text/html' href='http://wdaehn.blogspot.com/2008/09/motor-tripod-future-enhancements.html' title='Motor Tripod - Future Enhancements'/><author><name>wdaehn</name><uri>http://www.blogger.com/profile/11792883669228965857</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='13986123866228273391'/></author></entry><entry><id>tag:blogger.com,1999:blog-355411830490069516.post-4321424032531657785</id><published>2008-09-25T12:15:00.001-07:00</published><updated>2008-09-25T12:19:16.064-07:00</updated><title type='text'>main.c file</title><content type='html'>&lt;blockquote&gt;#include&amp;nbsp;&amp;lt;p18cxxx.h&amp;gt;&lt;br /&gt;#include&amp;nbsp;&amp;lt;delays.h&amp;gt;&lt;br /&gt;#include&amp;nbsp;&amp;lt;timers.h&amp;gt;&lt;br /&gt;#include&amp;nbsp;&amp;lt;stdlib.h&amp;gt;&lt;br /&gt;#include&amp;nbsp;&amp;lt;usart.h&amp;gt; &lt;br /&gt;#include&amp;nbsp;&amp;lt;string.h&amp;gt; &lt;br /&gt;#include&amp;nbsp;&amp;lt;stdio.h&amp;gt;&lt;br /&gt;#include&amp;nbsp;&amp;lt;math.h&amp;gt;&lt;br /&gt;#include&amp;nbsp;&amp;lt;adc.h&amp;gt;&lt;br /&gt;#include&amp;nbsp;&amp;lt;pwm.h&amp;gt;&lt;br /&gt;#include&amp;nbsp;&amp;lt;i2c.h&amp;gt;&lt;br /&gt;#include&amp;nbsp;"Tracker.h"&lt;br /&gt;&lt;br /&gt;//&amp;nbsp;config&amp;nbsp;fuse&lt;br /&gt;#pragma&amp;nbsp;config&amp;nbsp;OSC  =&amp;nbsp;HSPLL&lt;br /&gt;#pragma&amp;nbsp;config&amp;nbsp;WDT  =&amp;nbsp;OFF&lt;br /&gt;#pragma&amp;nbsp;config&amp;nbsp;PWRT  =&amp;nbsp;ON&lt;br /&gt;#pragma&amp;nbsp;config&amp;nbsp;LVP  =&amp;nbsp;OFF&lt;br /&gt;#pragma&amp;nbsp;config&amp;nbsp;BOREN =&amp;nbsp;ON&lt;br /&gt;#pragma&amp;nbsp;config&amp;nbsp;BORV  =&amp;nbsp;1&lt;br /&gt;#pragma&amp;nbsp;config&amp;nbsp;XINST =&amp;nbsp;OFF&lt;br /&gt;&lt;br /&gt;#define&amp;nbsp;pi&amp;nbsp;3.14159265359&lt;br /&gt;&lt;br /&gt;#define&amp;nbsp;LC PORTAbits.RA4    //&amp;nbsp;Led&amp;nbsp;com&lt;br /&gt;&lt;br /&gt;#define&amp;nbsp;HEIGHT_MODE_VARIABLE&amp;nbsp;0&lt;br /&gt;#define&amp;nbsp;HEIGHT_MODE_FIX&amp;nbsp;1&lt;br /&gt;&lt;br /&gt;int&amp;nbsp;PWM1,PWM2;&lt;br /&gt;int&amp;nbsp;S1,S2;&lt;br /&gt;long&amp;nbsp;S1_zero,&amp;nbsp;S2_zero,&amp;nbsp;counter,&amp;nbsp;S1_offset,&amp;nbsp;S2_offset,&amp;nbsp;S1_old,&amp;nbsp;S2_old;&lt;br /&gt;unsigned&amp;nbsp;int&amp;nbsp;last_pos_counter,&amp;nbsp;pos_counter;&lt;br /&gt;char&amp;nbsp;str[6],TXcount,valid_row,i;&lt;br /&gt;char&amp;nbsp;strcom[80];&lt;br /&gt;char&amp;nbsp;height_mode,&amp;nbsp;manual_coords;&lt;br /&gt;&lt;br /&gt;long&amp;nbsp;longitude_d,&amp;nbsp;longitude_m,&amp;nbsp;latitude_d,&amp;nbsp;latitude_m,&amp;nbsp;h;&lt;br /&gt;long&amp;nbsp;longitude_dc,&amp;nbsp;longitude_mc,&amp;nbsp;latitude_dc,&amp;nbsp;latitude_mc,&amp;nbsp;hc;&lt;br /&gt;long&amp;nbsp;dx,&amp;nbsp;dy,&amp;nbsp;dz,&amp;nbsp;cos100_longitude,&amp;nbsp;w,&amp;nbsp;w_zero,&amp;nbsp;v,&amp;nbsp;v_zero,&amp;nbsp;dw;&lt;br /&gt;char&amp;nbsp;key_pressed,&amp;nbsp;last_key_pressed;&lt;br /&gt;char&amp;nbsp;buf[20];&lt;br /&gt;char&amp;nbsp;state,&amp;nbsp;sat_in_view0,&amp;nbsp;sat_in_view1,&amp;nbsp;ind_quality;&lt;br /&gt;unsigned&amp;nbsp;char&amp;nbsp;checksum;&lt;br /&gt;char&amp;nbsp;ignore_for_checksum;&lt;br /&gt;&lt;br /&gt;#pragma&amp;nbsp;code&amp;nbsp;high_vector=0x08&lt;br /&gt;void&amp;nbsp;interrupt_at_high_vector(void)&lt;br /&gt;{&lt;br /&gt; _asm&amp;nbsp;GOTO&amp;nbsp;ISRgest&amp;nbsp;_endasm&lt;br /&gt;}&lt;br /&gt;#pragma&amp;nbsp;code&lt;br /&gt;#pragma&amp;nbsp;interrupt&amp;nbsp;ISRgest&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;void&amp;nbsp;main()&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;LATA&amp;nbsp;=&amp;nbsp;0x00;&lt;br /&gt;LATB&amp;nbsp;=&amp;nbsp;0x00;&lt;br /&gt;LATC&amp;nbsp;=&amp;nbsp;0x00;  &lt;br /&gt;&lt;br /&gt;TRISA&amp;nbsp;=&amp;nbsp;0b11101111;      //&amp;nbsp;all&amp;nbsp;input,&amp;nbsp;RA4&amp;nbsp;GPIO  &lt;br /&gt;TRISB&amp;nbsp;=&amp;nbsp;0b11111100;&amp;nbsp;&amp;nbsp;     //&amp;nbsp;6&amp;nbsp;GPIO&amp;nbsp;(RB7-RB2),&amp;nbsp;2&amp;nbsp;Servo&amp;nbsp;(RB0&amp;nbsp;&amp;&amp;nbsp;RB1)&lt;br /&gt;TRISC&amp;nbsp;=&amp;nbsp;0b11011000;      //&amp;nbsp;I2C,&amp;nbsp;Serial,&amp;nbsp;PWM&lt;br /&gt;&lt;br /&gt;ADCON1&amp;nbsp;=&amp;nbsp;0b00001111;  //&amp;nbsp;ADC&amp;nbsp;off&lt;br /&gt;ADCON2&amp;nbsp;=&amp;nbsp;0b10110010;  //&amp;nbsp;16&amp;nbsp;TAD,&amp;nbsp;Fosc/32&lt;br /&gt;ADCON0&amp;nbsp;=&amp;nbsp;0x00;    //&amp;nbsp;ADC&amp;nbsp;OFF&lt;br /&gt;&lt;br /&gt;flashLED(5);&lt;br /&gt;&lt;br /&gt;BAUDCONbits.BRG16&amp;nbsp;=&amp;nbsp;1;      //&amp;nbsp;baud&amp;nbsp;rate&amp;nbsp;generator&amp;nbsp;a&amp;nbsp;16&amp;nbsp;bit&lt;br /&gt;OpenUSART&amp;nbsp;(USART_TX_INT_OFF&amp;nbsp;&amp;  &lt;br /&gt;   USART_RX_INT_ON&amp;nbsp;&amp;          &amp;nbsp;&amp;nbsp;&lt;br /&gt;   USART_ASYNCH_MODE&amp;nbsp;&amp;&lt;br /&gt;   USART_EIGHT_BIT&amp;nbsp;&amp;&lt;br /&gt;   USART_CONT_RX&amp;nbsp;&amp;&lt;br /&gt;   USART_BRGH_HIGH,&amp;nbsp;1041); &lt;br /&gt;&lt;br /&gt;//&amp;nbsp;Timer&lt;br /&gt;OpenTimer0(&amp;nbsp;TIMER_INT_OFF&amp;nbsp;&amp;&amp;nbsp;T0_16BIT&amp;nbsp;&amp;&amp;nbsp;T0_SOURCE_INT&amp;nbsp;&amp;&amp;nbsp;T0_PS_1_1);  //&amp;nbsp;servo&amp;nbsp;frame&lt;br /&gt;OpenTimer1(TIMER_INT_ON&amp;nbsp;&amp;&amp;nbsp;T1_PS_1_1&amp;nbsp;&amp;&amp;nbsp;T1_SOURCE_INT&amp;nbsp;&amp;&amp;nbsp;T1_OSC1EN_OFF); //&amp;nbsp;Servo&amp;nbsp;pulse&amp;nbsp;1&lt;br /&gt;OpenTimer3(TIMER_INT_ON&amp;nbsp;&amp;&amp;nbsp;T3_PS_1_1&amp;nbsp;&amp;&amp;nbsp;T3_SOURCE_INT&amp;nbsp;&amp;&amp;nbsp;T3_OSC1EN_OFF&amp;nbsp;); //&amp;nbsp;Servo&amp;nbsp;Pulse&amp;nbsp;2&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;//I2C&lt;br /&gt;OpenI2C(MASTER,&amp;nbsp;SLEW_OFF); //&amp;nbsp;Activate&amp;nbsp;bus&amp;nbsp;I2C,&amp;nbsp;Master&amp;nbsp;mode&amp;nbsp;100&amp;nbsp;kbits&lt;br /&gt;SSPADD&amp;nbsp;=0x63;&amp;nbsp;    //100kHz&amp;nbsp;clock(63H)&amp;nbsp;@40MHz&amp;nbsp;(default)&lt;br /&gt;&lt;br /&gt;T0CONbits.TMR0ON&amp;nbsp;=&amp;nbsp;0;&lt;br /&gt;T1CONbits.TMR1ON&amp;nbsp;=&amp;nbsp;0;&lt;br /&gt;T3CONbits.TMR3ON&amp;nbsp;=&amp;nbsp;0;&lt;br /&gt;&lt;br /&gt;TMR3H=TMR3L=0;&lt;br /&gt;TMR1H=TMR1L=0;&amp;nbsp;&lt;br /&gt;TMR0H&amp;nbsp;=&amp;nbsp;0x3C;&amp;nbsp;//&amp;nbsp;20&amp;nbsp;ms&lt;br /&gt;TMR0L&amp;nbsp;=&amp;nbsp;0xB0;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;S1=S2=1500;&lt;br /&gt;S1_offset=S2_offset=0;&lt;br /&gt;S1_old=S2_old=1500;&lt;br /&gt;&lt;br /&gt;last_pos_counter=0;&lt;br /&gt;pos_counter=0;&lt;br /&gt;last_key_pressed=0;&lt;br /&gt;&lt;br /&gt;valid_row&amp;nbsp;=&amp;nbsp;-2;&lt;br /&gt;TXcount&amp;nbsp;=&amp;nbsp;0;&lt;br /&gt;i=0;&lt;br /&gt;height_mode&amp;nbsp;=&amp;nbsp;HEIGHT_MODE_VARIABLE;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;/*&amp;nbsp;Enable&amp;nbsp;interrupt&amp;nbsp;priority&amp;nbsp;*/&lt;br /&gt;RCONbits.IPEN&amp;nbsp;=&amp;nbsp;1;&lt;br /&gt;&lt;br /&gt;/*&amp;nbsp;Make&amp;nbsp;receive&amp;nbsp;interrupt&amp;nbsp;high&amp;nbsp;priority&amp;nbsp;*/&lt;br /&gt;IPR1bits.RCIP&amp;nbsp;=&amp;nbsp;1;&lt;br /&gt;&lt;br /&gt;//&amp;nbsp;interrupt&lt;br /&gt;INTCON&amp;nbsp;=&amp;nbsp;0;&lt;br /&gt;INTCONbits.GIE&amp;nbsp;=&amp;nbsp;1;&lt;br /&gt;INTCONbits.PEIE&amp;nbsp;=&amp;nbsp;1;&lt;br /&gt;&lt;br /&gt;LCDClearScreen();&lt;br /&gt;LCDprint2((const&amp;nbsp;rom&amp;nbsp;char&amp;nbsp;far&amp;nbsp;*)"Starting....");&lt;br /&gt;&lt;br /&gt;Servo();&lt;br /&gt;&lt;br /&gt;state=0;&lt;br /&gt;manual_coords&amp;nbsp;=&amp;nbsp;0;&lt;br /&gt;&lt;br /&gt;//&amp;nbsp;wait&amp;nbsp;until&amp;nbsp;GPS&amp;nbsp;has&amp;nbsp;acquired&amp;nbsp;the&amp;nbsp;current&amp;nbsp;position&amp;nbsp;and&amp;nbsp;then&amp;nbsp;turn&amp;nbsp;on&amp;nbsp;the&amp;nbsp;LED.&amp;nbsp;As&amp;nbsp;long&amp;nbsp;as&amp;nbsp;we&amp;nbsp;are&amp;nbsp;in&amp;nbsp;this&amp;nbsp;mode&amp;nbsp;and&amp;nbsp;a&amp;nbsp;key&amp;nbsp;was&amp;nbsp;pressed&lt;br /&gt;//&amp;nbsp;we&amp;nbsp;treat&amp;nbsp;that&amp;nbsp;as&amp;nbsp;signal&amp;nbsp;to&amp;nbsp;store&amp;nbsp;the&amp;nbsp;current&amp;nbsp;GPS&amp;nbsp;position&amp;nbsp;and&amp;nbsp;flash&amp;nbsp;the&amp;nbsp;LED&amp;nbsp;10&amp;nbsp;times&amp;nbsp;as&amp;nbsp;visual&amp;nbsp;indicator.&lt;br /&gt;//&amp;nbsp;LED&amp;nbsp;off&amp;nbsp;means&amp;nbsp;GPS&amp;nbsp;is&amp;nbsp;not&amp;nbsp;ready&amp;nbsp;yet&lt;br /&gt;//&amp;nbsp;LED&amp;nbsp;on&amp;nbsp;means&amp;nbsp;GPS&amp;nbsp;has&amp;nbsp;a&amp;nbsp;trusted&amp;nbsp;position&lt;br /&gt;while(i&amp;nbsp;==&amp;nbsp;0)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(valid_row&amp;nbsp;==&amp;nbsp;-2)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LCDClearScreen();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LCDprint2((const&amp;nbsp;rom&amp;nbsp;char&amp;nbsp;far&amp;nbsp;*)"No&amp;nbsp;Serial&amp;nbsp;Data&amp;nbsp;yet");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LCDprintc(13);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LCDprint2((const&amp;nbsp;rom&amp;nbsp;char&amp;nbsp;far&amp;nbsp;*)"program&amp;nbsp;XBee&amp;nbsp;1:&amp;nbsp;1");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LCDprintc(13);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LCDprint2((const&amp;nbsp;rom&amp;nbsp;char&amp;nbsp;far&amp;nbsp;*)"program&amp;nbsp;XBee&amp;nbsp;2:&amp;nbsp;2");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;valid_row&amp;nbsp;=&amp;nbsp;-1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;else&amp;nbsp;if&amp;nbsp;((valid_row&amp;nbsp;!=&amp;nbsp;-1)&amp;nbsp;&amp;&amp;&amp;nbsp;(state&amp;nbsp;==&amp;nbsp;0))&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LCDClearScreen();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LCDprint2((const&amp;nbsp;rom&amp;nbsp;char&amp;nbsp;far&amp;nbsp;*)"Serial&amp;nbsp;Data&amp;nbsp;received");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;state=1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;else&amp;nbsp;if&amp;nbsp;((pos_counter&amp;nbsp;!=&amp;nbsp;0)&amp;nbsp;&amp;&amp;&amp;nbsp;(ind_quality&amp;nbsp;==&amp;nbsp;'0')&amp;nbsp;&amp;&amp;&amp;nbsp;(state&amp;nbsp;!=&amp;nbsp;2))&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LCDClearScreen();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LCDprint2((const&amp;nbsp;rom&amp;nbsp;char&amp;nbsp;far&amp;nbsp;*)"GPS&amp;nbsp;Sentence&amp;nbsp;found,&amp;nbsp;no&amp;nbsp;fix&amp;nbsp;yet");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;state=2;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;else&amp;nbsp;if&amp;nbsp;((pos_counter&amp;nbsp;!=&amp;nbsp;0)&amp;nbsp;&amp;&amp;&amp;nbsp;(ind_quality&amp;nbsp;!=&amp;nbsp;'0')&amp;nbsp;&amp;&amp;&amp;nbsp;(state&amp;nbsp;&amp;lt;&amp;nbsp;3))&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LCDClearScreen();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LCDprint2((const&amp;nbsp;rom&amp;nbsp;char&amp;nbsp;far&amp;nbsp;*)"Press&amp;nbsp;5&amp;nbsp;to&amp;nbsp;lock&amp;nbsp;pos");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LCDprintc(13);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LCDprint2((const&amp;nbsp;rom&amp;nbsp;char&amp;nbsp;far&amp;nbsp;*)"Satellites:&amp;nbsp;");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;state&amp;nbsp;=&amp;nbsp;3;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;key_pressed&amp;nbsp;=&amp;nbsp;LCDKeyboardSingleChar();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(key_pressed&amp;nbsp;==&amp;nbsp;'#')&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;EnterCoords();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;state&amp;nbsp;=&amp;nbsp;2;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;else&amp;nbsp;if&amp;nbsp;(valid_row&amp;nbsp;==&amp;nbsp;-1)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(key_pressed&amp;nbsp;==&amp;nbsp;'1')&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ProgramXBee((const&amp;nbsp;rom&amp;nbsp;char&amp;nbsp;far&amp;nbsp;*)"4E3A",&amp;nbsp;(const&amp;nbsp;rom&amp;nbsp;char&amp;nbsp;far&amp;nbsp;*)"4E3B");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;else&amp;nbsp;if&amp;nbsp;(key_pressed&amp;nbsp;==&amp;nbsp;'2')&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ProgramXBee((const&amp;nbsp;rom&amp;nbsp;char&amp;nbsp;far&amp;nbsp;*)"4E3B",&amp;nbsp;(const&amp;nbsp;rom&amp;nbsp;char&amp;nbsp;far&amp;nbsp;*)"4E3A");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(last_pos_counter&amp;nbsp;!=&amp;nbsp;pos_counter&amp;nbsp;||&amp;nbsp;manual_coords)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(manual_coords&amp;nbsp;==&amp;nbsp;0)&amp;nbsp;GPSParse();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;manual_coords&amp;nbsp;=&amp;nbsp;0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LCDprintc('&amp;nbsp;');&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LCDprintc('&amp;nbsp;');&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LCDprintc(sat_in_view0);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LCDprintc(sat_in_view1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;last_pos_counter&amp;nbsp;=&amp;nbsp;pos_counter;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(ind_quality&amp;nbsp;!=&amp;nbsp;'0')&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(key_pressed&amp;nbsp;==&amp;nbsp;'5')&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;i=1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;else&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LC=1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;else&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LC=0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;latitude_d&amp;nbsp;=&amp;nbsp;latitude_dc;&lt;br /&gt;latitude_m&amp;nbsp;=&amp;nbsp;latitude_mc;&lt;br /&gt;longitude_d&amp;nbsp;=&amp;nbsp;longitude_dc;&lt;br /&gt;longitude_m&amp;nbsp;=&amp;nbsp;longitude_mc;&lt;br /&gt;h&amp;nbsp;=&amp;nbsp;hc;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;LCDClearScreen();&lt;br /&gt;LCDprint2((const&amp;nbsp;rom&amp;nbsp;char&amp;nbsp;far&amp;nbsp;*)"Waiting&amp;nbsp;for&amp;nbsp;remote&amp;nbsp;&amp;nbsp;position...");&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;cos100_longitude&amp;nbsp;=&amp;nbsp;(long)(cos((((double)latitude_d)&amp;nbsp;+&amp;nbsp;((double)latitude_m)/60000.00)&amp;nbsp;*&amp;nbsp;3.14159265f&amp;nbsp;/&amp;nbsp;180.00f)*100.00f);&lt;br /&gt;&lt;br /&gt;S1_zero&amp;nbsp;=&amp;nbsp;1500;&lt;br /&gt;S2_zero&amp;nbsp;=&amp;nbsp;1500;&lt;br /&gt;w&amp;nbsp;=&amp;nbsp;9999;&lt;br /&gt;v&amp;nbsp;=&amp;nbsp;9999;&lt;br /&gt;w_zero&amp;nbsp;=&amp;nbsp;w;&lt;br /&gt;v_zero&amp;nbsp;=&amp;nbsp;v;&lt;br /&gt;counter&amp;nbsp;=&amp;nbsp;1;&lt;br /&gt;&lt;br /&gt;key_pressed=0;&lt;br /&gt;&lt;br /&gt;T0CONbits.TMR0ON&amp;nbsp;=&amp;nbsp;1;&lt;br /&gt;T1CONbits.TMR1ON&amp;nbsp;=&amp;nbsp;1;&lt;br /&gt;T3CONbits.TMR3ON&amp;nbsp;=&amp;nbsp;1;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;//&amp;nbsp;No&amp;nbsp;we&amp;nbsp;are&amp;nbsp;in&amp;nbsp;tracking&amp;nbsp;and&amp;nbsp;offset&amp;nbsp;mode.&amp;nbsp;You&amp;nbsp;can&amp;nbsp;press&amp;nbsp;the&amp;nbsp;keys&amp;nbsp;and&amp;nbsp;move&amp;nbsp;the&amp;nbsp;servos&amp;nbsp;freely.&lt;br /&gt;//&amp;nbsp;The&amp;nbsp;first&amp;nbsp;time&amp;nbsp;the&amp;nbsp;GPS&amp;nbsp;position&amp;nbsp;is&amp;nbsp;considered&amp;nbsp;trusted&amp;nbsp;and&amp;nbsp;more&amp;nbsp;than&amp;nbsp;10&amp;nbsp;meters&amp;nbsp;away,&amp;nbsp;the&amp;nbsp;servos&lt;br /&gt;//&amp;nbsp;start&amp;nbsp;moving&amp;nbsp;automatically.&amp;nbsp;If&amp;nbsp;it&amp;nbsp;is&amp;nbsp;the&amp;nbsp;first&amp;nbsp;time&amp;nbsp;the&amp;nbsp;remote&amp;nbsp;location&amp;nbsp;is&amp;nbsp;valid,&amp;nbsp;we&amp;nbsp;initialize&lt;br /&gt;//&amp;nbsp;the&amp;nbsp;angle&amp;nbsp;offset&amp;nbsp;assuming&amp;nbsp;the&amp;nbsp;current&amp;nbsp;servo&amp;nbsp;position&amp;nbsp;already&amp;nbsp;points&amp;nbsp;to&amp;nbsp;the&amp;nbsp;remote&amp;nbsp;position.&lt;br /&gt;//&amp;nbsp;While&amp;nbsp;the&amp;nbsp;servos&amp;nbsp;try&amp;nbsp;to&amp;nbsp;follow&amp;nbsp;the&amp;nbsp;GPS&amp;nbsp;position&amp;nbsp;you&amp;nbsp;can&amp;nbsp;still&amp;nbsp;press&amp;nbsp;the&amp;nbsp;buttons&amp;nbsp;to&amp;nbsp;move&amp;nbsp;the&amp;nbsp;head&amp;nbsp;manually.&lt;br /&gt;while(1)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;if&amp;nbsp;((pos_counter&amp;nbsp;!=&amp;nbsp;last_pos_counter)&amp;nbsp;||&amp;nbsp;manual_coords)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(manual_coords&amp;nbsp;==&amp;nbsp;0)&amp;nbsp;GPSParse();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;manual_coords&amp;nbsp;=&amp;nbsp;0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;last_pos_counter&amp;nbsp;=&amp;nbsp;pos_counter;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(ind_quality&amp;nbsp;!=&amp;nbsp;'0')&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dx&amp;nbsp;=&amp;nbsp;getDeltaLongitude();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dy&amp;nbsp;=&amp;nbsp;getDeltaLatitude();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(height_mode&amp;nbsp;==&amp;nbsp;HEIGHT_MODE_VARIABLE)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dz&amp;nbsp;=&amp;nbsp;hc&amp;nbsp;-&amp;nbsp;h;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;else&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dz&amp;nbsp;=&amp;nbsp;0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LCDClearScreen();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sprintf&amp;nbsp;(buf,&amp;nbsp;"dx=%ld&amp;nbsp;&amp;nbsp;&amp;nbsp;",&amp;nbsp;dx/10);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LCDprint(buf);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sprintf&amp;nbsp;(buf,&amp;nbsp;"dy=%ld",&amp;nbsp;dy/10);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LCDprint(buf);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LCDprintc(13);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sprintf&amp;nbsp;(buf,&amp;nbsp;"dz=%ld&amp;nbsp;&amp;nbsp;&amp;nbsp;Sats:&amp;nbsp;",&amp;nbsp;dz/10);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LCDprint(buf);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LCDprintc(sat_in_view0);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LCDprintc(sat_in_view1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LCDprintc(13);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sprintf&amp;nbsp;(buf,&amp;nbsp;"counter=%d",&amp;nbsp;pos_counter);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LCDprint(buf);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LCDprintc(13);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;((dx*dx&amp;nbsp;+&amp;nbsp;dy*dy)&amp;nbsp;&amp;gt;&amp;nbsp;10000)&amp;nbsp;{&amp;nbsp;//&amp;nbsp;the&amp;nbsp;remote&amp;nbsp;position&amp;nbsp;is&amp;nbsp;more&amp;nbsp;than&amp;nbsp;10m&amp;nbsp;away,&amp;nbsp;we&amp;nbsp;start&amp;nbsp;updating&amp;nbsp;the&amp;nbsp;servo&amp;nbsp;position&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;w&amp;nbsp;=&amp;nbsp;approx_atan2(dy,&amp;nbsp;dx);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;v&amp;nbsp;=&amp;nbsp;approx_atan2(dz,&amp;nbsp;isqrt(dy*dy&amp;nbsp;+&amp;nbsp;dx&amp;nbsp;*&amp;nbsp;dx));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(w_zero&amp;nbsp;==&amp;nbsp;9999)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;w_zero&amp;nbsp;=&amp;nbsp;w;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;v_zero&amp;nbsp;=&amp;nbsp;v;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;S1_old&amp;nbsp;=&amp;nbsp;S1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;S2_old&amp;nbsp;=&amp;nbsp;S2;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dw&amp;nbsp;=&amp;nbsp;w_zero-w;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(dw&amp;nbsp;&amp;gt;&amp;nbsp;18000)&amp;nbsp;dw-=36000;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(dw&amp;nbsp;&amp;lt;&amp;nbsp;-18000)&amp;nbsp;dw+=36000;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;S1_offset=(long)((dw*86)/1000);&amp;nbsp;//&amp;nbsp;we&amp;nbsp;have&amp;nbsp;degree*100,&amp;nbsp;one&amp;nbsp;degree&amp;nbsp;is&amp;nbsp;about&amp;nbsp;7us&amp;nbsp;servo&amp;nbsp;impuls&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;S2_offset=(long)(((v-v_zero)*86)/1000);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;counter&amp;nbsp;=&amp;nbsp;1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LC=1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LCDprint2((const&amp;nbsp;rom&amp;nbsp;char&amp;nbsp;far&amp;nbsp;*)"Tracking...");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;else&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LC=0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;else&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LC&amp;nbsp;=&amp;nbsp;0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&amp;nbsp;else&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LC=0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;//&amp;nbsp;instead&amp;nbsp;of&amp;nbsp;setting&amp;nbsp;the&amp;nbsp;new&amp;nbsp;servo&amp;nbsp;position,&amp;nbsp;we&amp;nbsp;let&amp;nbsp;it&amp;nbsp;move&amp;nbsp;slowly&amp;nbsp;towards&amp;nbsp;the&amp;nbsp;S1&amp;nbsp;=&amp;nbsp;S1_zero&amp;nbsp;+&amp;nbsp;S1_offset&amp;nbsp;position&lt;br /&gt;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(INTCONbits.TMR0IF)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;T0CONbits.TMR0ON&amp;nbsp;=&amp;nbsp;0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;TMR0H&amp;nbsp;=&amp;nbsp;0x3C;&amp;nbsp;//&amp;nbsp;5&amp;nbsp;ms&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;TMR0L&amp;nbsp;=&amp;nbsp;0xB0;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;INTCONbits.TMR0IF&amp;nbsp;=&amp;nbsp;0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;T0CONbits.TMR0ON&amp;nbsp;=&amp;nbsp;1;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;key_pressed&amp;nbsp;=&amp;nbsp;LCDKeyboard();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(key_pressed&amp;nbsp;==&amp;nbsp;'6')&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;S1_zero++;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;counter&amp;nbsp;=&amp;nbsp;200;&amp;nbsp;//&amp;nbsp;to&amp;nbsp;make&amp;nbsp;sure&amp;nbsp;we&amp;nbsp;have&amp;nbsp;an&amp;nbsp;immediate&amp;nbsp;movement&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;else&amp;nbsp;if&amp;nbsp;(key_pressed&amp;nbsp;==&amp;nbsp;'4')&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;S1_zero--;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;counter&amp;nbsp;=&amp;nbsp;200;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;else&amp;nbsp;if&amp;nbsp;(key_pressed&amp;nbsp;==&amp;nbsp;'2')&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;S2_zero++;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;counter&amp;nbsp;=&amp;nbsp;200;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;else&amp;nbsp;if&amp;nbsp;(key_pressed&amp;nbsp;==&amp;nbsp;'8')&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;S2_zero--;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;counter&amp;nbsp;=&amp;nbsp;200;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;else&amp;nbsp;if&amp;nbsp;(key_pressed&amp;nbsp;==&amp;nbsp;'5')&amp;nbsp;{&amp;nbsp;//&amp;nbsp;reset&amp;nbsp;pos&amp;nbsp;to&amp;nbsp;center&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;S1_zero=1500;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;S2_zero=1500;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;w_zero&amp;nbsp;=&amp;nbsp;w;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;v_zero&amp;nbsp;=&amp;nbsp;v;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;S1_offset&amp;nbsp;=&amp;nbsp;0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;S2_offset&amp;nbsp;=&amp;nbsp;0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;counter&amp;nbsp;=&amp;nbsp;200;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;else&amp;nbsp;if&amp;nbsp;(key_pressed&amp;nbsp;==&amp;nbsp;'0'&amp;nbsp;&amp;&amp;&amp;nbsp;last_key_pressed&amp;nbsp;!=&amp;nbsp;'0')&amp;nbsp;{&amp;nbsp;//&amp;nbsp;switch&amp;nbsp;height&amp;nbsp;mode&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(height_mode&amp;nbsp;==&amp;nbsp;HEIGHT_MODE_VARIABLE)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;height_mode&amp;nbsp;=&amp;nbsp;HEIGHT_MODE_FIX;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LCDClearScreen();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LCDprint2((const&amp;nbsp;rom&amp;nbsp;char&amp;nbsp;far&amp;nbsp;*)"Height&amp;nbsp;is&amp;nbsp;constant&amp;nbsp;0");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;else&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;height_mode&amp;nbsp;=&amp;nbsp;HEIGHT_MODE_VARIABLE;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LCDClearScreen();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LCDprint2((const&amp;nbsp;rom&amp;nbsp;char&amp;nbsp;far&amp;nbsp;*)"Height&amp;nbsp;set&amp;nbsp;variable");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;flashLED(10);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;else&amp;nbsp;if&amp;nbsp;(key_pressed&amp;nbsp;==&amp;nbsp;'#')&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;EnterCoords();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(S1_zero&amp;nbsp;&amp;lt;&amp;nbsp;900)&amp;nbsp;S1_zero&amp;nbsp;=&amp;nbsp;900;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(S1_zero&amp;nbsp;&amp;gt;&amp;nbsp;2100)&amp;nbsp;S1_zero&amp;nbsp;=&amp;nbsp;2100;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(S2_zero&amp;nbsp;&amp;lt;&amp;nbsp;1250)&amp;nbsp;S2_zero&amp;nbsp;=&amp;nbsp;1250;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(S2_zero&amp;nbsp;&amp;gt;&amp;nbsp;2100)&amp;nbsp;S2_zero&amp;nbsp;=&amp;nbsp;2100;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;last_key_pressed&amp;nbsp;=&amp;nbsp;key_pressed;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;Timer0&amp;nbsp;fires&amp;nbsp;every&amp;nbsp;0.005s,&amp;nbsp;every&amp;nbsp;one&amp;nbsp;sec&amp;nbsp;we&amp;nbsp;will&amp;nbsp;know&amp;nbsp;the&amp;nbsp;new&amp;nbsp;GPS&amp;nbsp;position.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;Therefore&amp;nbsp;the&amp;nbsp;servo&amp;nbsp;should&amp;nbsp;make&amp;nbsp;the&amp;nbsp;enitre&amp;nbsp;movement&amp;nbsp;in&amp;nbsp;200&amp;nbsp;steps&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;S1&amp;nbsp;=&amp;nbsp;(int)(S1_old&amp;nbsp;-&amp;nbsp;(((S1_old&amp;nbsp;-&amp;nbsp;(S1_zero&amp;nbsp;+&amp;nbsp;S1_offset))*counter)/200));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(S1&amp;nbsp;&amp;lt;&amp;nbsp;900)&amp;nbsp;S1&amp;nbsp;=&amp;nbsp;900;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(S1&amp;nbsp;&amp;gt;&amp;nbsp;2100)&amp;nbsp;S1&amp;nbsp;=&amp;nbsp;2100;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;S2&amp;nbsp;=&amp;nbsp;(int)(S2_old&amp;nbsp;-&amp;nbsp;(((S2_old&amp;nbsp;-&amp;nbsp;(S2_zero&amp;nbsp;-&amp;nbsp;S2_offset))*counter)/200));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(S2&amp;nbsp;&amp;lt;&amp;nbsp;1200)&amp;nbsp;S2&amp;nbsp;=&amp;nbsp;1200;&amp;nbsp;//&amp;nbsp;the&amp;nbsp;z-Axis&amp;nbsp;can&amp;nbsp;move&amp;nbsp;just&amp;nbsp;little&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(S2&amp;nbsp;&amp;gt;&amp;nbsp;2100)&amp;nbsp;S2&amp;nbsp;=&amp;nbsp;2100;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;((PIR1bits.TMR1IF&amp;nbsp;==&amp;nbsp;0)&amp;nbsp;&amp;&amp;&amp;nbsp;(PIR2bits.TMR3IF&amp;nbsp;==&amp;nbsp;0)&amp;nbsp;&amp;&amp;&amp;nbsp;((counter&amp;nbsp;%&amp;nbsp;4)&amp;nbsp;==&amp;nbsp;0))&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Servo();   &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;counter++;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(counter&amp;nbsp;&amp;gt;&amp;nbsp;200)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;counter&amp;nbsp;=&amp;nbsp;1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;S1_old&amp;nbsp;=&amp;nbsp;S1_zero&amp;nbsp;+&amp;nbsp;S1_offset;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;S2_old&amp;nbsp;=&amp;nbsp;S2_zero&amp;nbsp;-&amp;nbsp;S2_offset;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(S1_old&amp;nbsp;&amp;lt;&amp;nbsp;900)&amp;nbsp;S1_old&amp;nbsp;=&amp;nbsp;900;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(S1_old&amp;nbsp;&amp;gt;&amp;nbsp;2100)&amp;nbsp;S1_old&amp;nbsp;=&amp;nbsp;2100;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(S2_old&amp;nbsp;&amp;lt;&amp;nbsp;1250)&amp;nbsp;S2_old&amp;nbsp;=&amp;nbsp;1250;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(S2_old&amp;nbsp;&amp;gt;&amp;nbsp;2100)&amp;nbsp;S2_old&amp;nbsp;=&amp;nbsp;2100;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&amp;nbsp;//&amp;nbsp;while&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;long&amp;nbsp;approx_atan2(long&amp;nbsp;dist_y,&amp;nbsp;long&amp;nbsp;dist_x)&amp;nbsp;{&amp;nbsp;//&amp;nbsp;returns&amp;nbsp;degree&amp;nbsp;times&amp;nbsp;100,&amp;nbsp;so&amp;nbsp;the&amp;nbsp;number&amp;nbsp;6234&amp;nbsp;means&amp;nbsp;62.34°&lt;br /&gt;&amp;nbsp;&amp;nbsp;//&amp;nbsp;Watchout,&amp;nbsp;it&amp;nbsp;is&amp;nbsp;rotated&amp;nbsp;so&amp;nbsp;that&amp;nbsp;north=0°,&amp;nbsp;east=90°,&amp;nbsp;west=-90°&lt;br /&gt;&amp;nbsp;&amp;nbsp;long&amp;nbsp;rad100;&lt;br /&gt;&amp;nbsp;&amp;nbsp;long&amp;nbsp;offset;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(dist_x&amp;nbsp;==&amp;nbsp;0)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(dist_y&amp;nbsp;&amp;gt;&amp;nbsp;0)&amp;nbsp;return&amp;nbsp;0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else&amp;nbsp;return&amp;nbsp;18000;&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&amp;nbsp;else&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;rad100&amp;nbsp;=&amp;nbsp;dist_y*100/dist_x;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(rad100&amp;nbsp;&amp;lt;&amp;nbsp;0)&amp;nbsp;rad100&amp;nbsp;=&amp;nbsp;-rad100;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(rad100&amp;nbsp;&amp;gt;&amp;nbsp;100)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;atan&amp;nbsp;=&amp;nbsp;(PI()/2-r/(0,28+r*r))/pi*180&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;offset&amp;nbsp;=&amp;nbsp;((5700*rad100/(28+(rad100*rad100/100))))/100;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;offset&amp;nbsp;=&amp;nbsp;((5700*rad100/(28+(rad100*rad100/100))));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;else&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;offset&amp;nbsp;=&amp;nbsp;9000-((rad100*570000)/(10000+(28*rad100*rad100/100)));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;((dist_x&amp;nbsp;&amp;gt;&amp;nbsp;0)&amp;nbsp;&amp;&amp;&amp;nbsp;(dist_y&amp;nbsp;&amp;gt;=&amp;nbsp;0))&amp;nbsp;return&amp;nbsp;offset;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else&amp;nbsp;if&amp;nbsp;((dist_x&amp;nbsp;&amp;lt;&amp;nbsp;0)&amp;nbsp;&amp;&amp;&amp;nbsp;(dist_y&amp;nbsp;&amp;gt;=&amp;nbsp;0))&amp;nbsp;return&amp;nbsp;-offset;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else&amp;nbsp;if&amp;nbsp;((dist_x&amp;nbsp;&amp;gt;&amp;nbsp;0)&amp;nbsp;&amp;&amp;&amp;nbsp;(dist_y&amp;nbsp;&amp;lt;&amp;nbsp;0))&amp;nbsp;return&amp;nbsp;18000-offset;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else&amp;nbsp;return&amp;nbsp;offset-18000;&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;long&amp;nbsp;isqrt(long&amp;nbsp;x)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;long&amp;nbsp;&amp;nbsp;&amp;nbsp;squaredbit,&amp;nbsp;remainder,&amp;nbsp;root;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(x&amp;lt;1)&amp;nbsp;return&amp;nbsp;0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;/*&amp;nbsp;Load&amp;nbsp;the&amp;nbsp;binary&amp;nbsp;constant&amp;nbsp;01&amp;nbsp;00&amp;nbsp;00&amp;nbsp;...&amp;nbsp;00,&amp;nbsp;where&amp;nbsp;the&amp;nbsp;number&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;of&amp;nbsp;zero&amp;nbsp;bits&amp;nbsp;to&amp;nbsp;the&amp;nbsp;right&amp;nbsp;of&amp;nbsp;the&amp;nbsp;single&amp;nbsp;one&amp;nbsp;bit&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;is&amp;nbsp;even,&amp;nbsp;and&amp;nbsp;the&amp;nbsp;one&amp;nbsp;bit&amp;nbsp;is&amp;nbsp;as&amp;nbsp;far&amp;nbsp;left&amp;nbsp;as&amp;nbsp;is&amp;nbsp;consistant&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;with&amp;nbsp;that&amp;nbsp;condition.)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;squaredbit&amp;nbsp;&amp;nbsp;=&amp;nbsp;(long)&amp;nbsp;((((unsigned&amp;nbsp;long)&amp;nbsp;~0L)&amp;nbsp;&amp;gt;&amp;gt;&amp;nbsp;1)&amp;nbsp;&amp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;~(((unsigned&amp;nbsp;long)&amp;nbsp;~0L)&amp;nbsp;&amp;gt;&amp;gt;&amp;nbsp;2));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;/*&amp;nbsp;This&amp;nbsp;portable&amp;nbsp;load&amp;nbsp;replaces&amp;nbsp;the&amp;nbsp;loop&amp;nbsp;that&amp;nbsp;used&amp;nbsp;to&amp;nbsp;be&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;here,&amp;nbsp;and&amp;nbsp;was&amp;nbsp;donated&amp;nbsp;by&amp;nbsp;&amp;nbsp;legalize@xmission.com&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*/&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;/*&amp;nbsp;Form&amp;nbsp;bits&amp;nbsp;of&amp;nbsp;the&amp;nbsp;answer.&amp;nbsp;*/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;remainder&amp;nbsp;=&amp;nbsp;x;&amp;nbsp;&amp;nbsp;root&amp;nbsp;=&amp;nbsp;0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;while&amp;nbsp;(squaredbit&amp;nbsp;&amp;gt;&amp;nbsp;0)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(remainder&amp;nbsp;&amp;gt;=&amp;nbsp;(squaredbit&amp;nbsp;|&amp;nbsp;root))&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;remainder&amp;nbsp;-=&amp;nbsp;(squaredbit&amp;nbsp;|&amp;nbsp;root);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;root&amp;nbsp;&amp;gt;&amp;gt;=&amp;nbsp;1;&amp;nbsp;root&amp;nbsp;|=&amp;nbsp;squaredbit;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;else&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;root&amp;nbsp;&amp;gt;&amp;gt;=&amp;nbsp;1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;squaredbit&amp;nbsp;&amp;gt;&amp;gt;=&amp;nbsp;2;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;root;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void&amp;nbsp;flashLED(char&amp;nbsp;times)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;for&amp;nbsp;(i=0;i&amp;lt;times;i++)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LC=!LC;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;DelayMilliSeconds(500);&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;long&amp;nbsp;getDeltaLatitude(void)&amp;nbsp;{&amp;nbsp;//&amp;nbsp;returns&amp;nbsp;the&amp;nbsp;distance&amp;nbsp;in&amp;nbsp;0.1m&lt;br /&gt;&amp;nbsp;&amp;nbsp;//&amp;nbsp;return&amp;nbsp;((latitude_m&amp;nbsp;-&amp;nbsp;atol(str_latitude_minute))*pi*&amp;nbsp;6378137/180/60000&amp;nbsp;+&amp;nbsp;(latitude_d&amp;nbsp;-&amp;nbsp;atol(str_latitude_degree))&amp;nbsp;*&amp;nbsp;pi&amp;nbsp;*&amp;nbsp;6378137&amp;nbsp;/&amp;nbsp;180)&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;return&amp;nbsp;((latitude_m&amp;nbsp;-&amp;nbsp;latitude_mc)*186&amp;nbsp;+&amp;nbsp;(latitude_d&amp;nbsp;-&amp;nbsp;latitude_dc)&amp;nbsp;*&amp;nbsp;11131949)/100;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;long&amp;nbsp;getDeltaLongitude(void)&amp;nbsp;{&amp;nbsp;//&amp;nbsp;returns&amp;nbsp;the&amp;nbsp;distance&amp;nbsp;in&amp;nbsp;0.1m&lt;br /&gt;&amp;nbsp;&amp;nbsp;//&amp;nbsp;return&amp;nbsp;((longitude_m&amp;nbsp;-&amp;nbsp;atol(str_longitude_minute))*pi*&amp;nbsp;dist/180/60000&amp;nbsp;+&amp;nbsp;(longitude_d&amp;nbsp;-&amp;nbsp;atol(str_longitude_degree))&amp;nbsp;*&amp;nbsp;pi&amp;nbsp;*&amp;nbsp;dist&amp;nbsp;/&amp;nbsp;180)&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;return&amp;nbsp;((longitude_m&amp;nbsp;-&amp;nbsp;longitude_mc)*186&amp;nbsp;+&amp;nbsp;(longitude_d&amp;nbsp;-&amp;nbsp;longitude_dc)&amp;nbsp;*&amp;nbsp;11131949)&amp;nbsp;*&amp;nbsp;cos100_longitude&amp;nbsp;/&amp;nbsp;10000;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void&amp;nbsp;Servo&amp;nbsp;(void)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;TMR1H&amp;nbsp;=&amp;nbsp;(65536&amp;nbsp;-&amp;nbsp;S1*10)&amp;nbsp;&amp;gt;&amp;gt;&amp;nbsp;8;&lt;br /&gt;&amp;nbsp;&amp;nbsp;TMR1L&amp;nbsp;=&amp;nbsp;(65536&amp;nbsp;-&amp;nbsp;S1*10);&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;LATBbits.LATB0&amp;nbsp;=&amp;nbsp;1;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;TMR3H&amp;nbsp;=&amp;nbsp;(65536&amp;nbsp;-&amp;nbsp;S2*10)&amp;nbsp;&amp;gt;&amp;gt;&amp;nbsp;8;&lt;br /&gt;&amp;nbsp;&amp;nbsp;TMR3L&amp;nbsp;=&amp;nbsp;(65536&amp;nbsp;-&amp;nbsp;S2*10);&lt;br /&gt;&amp;nbsp;&amp;nbsp;LATBbits.LATB1&amp;nbsp;=&amp;nbsp;1;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;T1CONbits.TMR1ON&amp;nbsp;=&amp;nbsp;1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;T3CONbits.TMR3ON&amp;nbsp;=&amp;nbsp;1;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;void&amp;nbsp;ISRgest(void)&amp;nbsp;{  //&amp;nbsp;I.S.R.&lt;br /&gt;&amp;nbsp;&amp;nbsp;char&amp;nbsp;data;    //&amp;nbsp;buffer&lt;br /&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(PIR1bits.TMR1IF)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LATBbits.LATB0&amp;nbsp;=&amp;nbsp;0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;T1CONbits.TMR1ON&amp;nbsp;=&amp;nbsp;0;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PIR1bits.TMR1IF&amp;nbsp;=&amp;nbsp;0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(PIR2bits.TMR3IF)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LATBbits.LATB1&amp;nbsp;=&amp;nbsp;0;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;T3CONbits.TMR3ON&amp;nbsp;=&amp;nbsp;0;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PIR2bits.TMR3IF&amp;nbsp;=&amp;nbsp;0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(PIR1bits.RCIF)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;data&amp;nbsp;=&amp;nbsp;RCREG;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(data&amp;nbsp;==&amp;nbsp;'$')&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;TXcount&amp;nbsp;=&amp;nbsp;0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;valid_row&amp;nbsp;=&amp;nbsp;1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;checksum&amp;nbsp;=&amp;nbsp;0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ignore_for_checksum&amp;nbsp;=&amp;nbsp;0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;else&amp;nbsp;if&amp;nbsp;(valid_row&amp;nbsp;==&amp;nbsp;1)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(TXcount&amp;nbsp;==&amp;nbsp;4)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;((strcom[0]&amp;nbsp;!=&amp;nbsp;'G')&amp;nbsp;||&amp;nbsp;(strcom[1]&amp;nbsp;!=&amp;nbsp;'P')&amp;nbsp;||&amp;nbsp;(strcom[2]&amp;nbsp;!=&amp;nbsp;'G')&amp;nbsp;||&amp;nbsp;(strcom[3]&amp;nbsp;!=&amp;nbsp;'G')&amp;nbsp;||&amp;nbsp;(data&amp;nbsp;!=&amp;nbsp;'A'))&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;valid_row&amp;nbsp;=&amp;nbsp;0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;else&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;strcom[TXcount]&amp;nbsp;=&amp;nbsp;data;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;checksum&amp;nbsp;^=&amp;nbsp;data;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;TXcount++;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;else&amp;nbsp;if&amp;nbsp;((data&amp;nbsp;==&amp;nbsp;'\n')&amp;nbsp;||&amp;nbsp;(data&amp;nbsp;==&amp;nbsp;'\r'))&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;valid_row&amp;nbsp;=&amp;nbsp;0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;((((strcom[TXcount-2]&amp;nbsp;-&amp;nbsp;'0')&amp;nbsp;&amp;lt;&amp;lt;&amp;nbsp;4)&amp;nbsp;|&amp;nbsp;(strcom[TXcount-1]&amp;nbsp;-&amp;nbsp;'0'))&amp;nbsp;==&amp;nbsp;checksum)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pos_counter++;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;else&amp;nbsp;if&amp;nbsp;(data&amp;nbsp;==&amp;nbsp;'*')&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ignore_for_checksum&amp;nbsp;=&amp;nbsp;1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;else&amp;nbsp;{&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;strcom[TXcount]&amp;nbsp;=&amp;nbsp;data;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(ignore_for_checksum&amp;nbsp;==&amp;nbsp;0)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;checksum&amp;nbsp;^=&amp;nbsp;data;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;TXcount++;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(&amp;nbsp;TXcount&amp;nbsp;&amp;gt;&amp;nbsp;79&amp;nbsp;)&amp;nbsp;valid_row&amp;nbsp;=&amp;nbsp;0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;else&amp;nbsp;{&amp;nbsp;&amp;nbsp;//&amp;nbsp;this&amp;nbsp;is&amp;nbsp;used&amp;nbsp;to&amp;nbsp;capture&amp;nbsp;input&amp;nbsp;received,&amp;nbsp;e.g.&amp;nbsp;during&amp;nbsp;XBee&amp;nbsp;programming&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;strcom[TXcount]&amp;nbsp;=&amp;nbsp;data;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;TXcount++;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(&amp;nbsp;TXcount&amp;nbsp;&amp;gt;&amp;nbsp;79&amp;nbsp;)&amp;nbsp;valid_row&amp;nbsp;=&amp;nbsp;79;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp; /*&amp;nbsp;Clear&amp;nbsp;the&amp;nbsp;interrupt&amp;nbsp;flag&amp;nbsp;*/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PIR1bits.RCIF&amp;nbsp;=&amp;nbsp;0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;void&amp;nbsp;I2CW(char&amp;nbsp;ADDS,&amp;nbsp;char&amp;nbsp;N1,&amp;nbsp;char&amp;nbsp;d1,&amp;nbsp;char&amp;nbsp;d2,&amp;nbsp;char&amp;nbsp;d3)&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;&amp;nbsp;//&amp;nbsp;N1..... Bytes&amp;nbsp;to&amp;nbsp;send&lt;br /&gt;&amp;nbsp;//&amp;nbsp;ADDS... I2C&amp;nbsp;Address&lt;br /&gt;&amp;nbsp;//&amp;nbsp;d1..... High&amp;nbsp;byte&lt;br /&gt;&amp;nbsp;//&amp;nbsp;d2..... Low&amp;nbsp;byte&lt;br /&gt;&amp;nbsp;//&amp;nbsp;d3..... ???&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(N1&amp;nbsp;==&amp;nbsp;1)&lt;br /&gt;&amp;nbsp;&amp;nbsp;{&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;EEByteWrite(ADDS,&amp;nbsp;0,d2);  //&amp;nbsp;Write&amp;nbsp;byte&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;EEAckPolling(ADDS);   //&amp;nbsp;attende&amp;nbsp;per&amp;nbsp;ACK&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;if&amp;nbsp;(N1&amp;nbsp;==&amp;nbsp;2)&lt;br /&gt;&amp;nbsp;&amp;nbsp;{&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;EEByteWrite(ADDS,&amp;nbsp;d1,d2); //&amp;nbsp;Write&amp;nbsp;byte&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;EEAckPolling(ADDS);   //&amp;nbsp;attende&amp;nbsp;per&amp;nbsp;ACK&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;if&amp;nbsp;(N1&amp;nbsp;==&amp;nbsp;3)&lt;br /&gt;&amp;nbsp;&amp;nbsp;{&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;EEByteWrite(ADDS,d1,d2);  //&amp;nbsp;Write&amp;nbsp;byte&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;EEAckPolling(ADDS);   //&amp;nbsp;attende&amp;nbsp;per&amp;nbsp;ACK&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;EEByteWrite(ADDS,(d1+1),d2); //&amp;nbsp;Write&amp;nbsp;byte&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;EEAckPolling(ADDS);   //&amp;nbsp;attende&amp;nbsp;per&amp;nbsp;ACK&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void&amp;nbsp;LCDprint(char&amp;nbsp;*&amp;nbsp;string)&lt;br /&gt;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;char&amp;nbsp;char_pos;&lt;br /&gt;&amp;nbsp;&amp;nbsp;for&amp;nbsp;(char_pos=0;&amp;nbsp;(string[char_pos]&amp;nbsp;!=&amp;nbsp;0)&amp;nbsp;&amp;&amp;&amp;nbsp;(char_pos&amp;nbsp;&amp;lt;&amp;nbsp;80);&amp;nbsp;char_pos++)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;I2CW(0xc6,&amp;nbsp;1,&amp;nbsp;0,&amp;nbsp;string[char_pos],&amp;nbsp;0);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;void&amp;nbsp;LCDprint2(const&amp;nbsp;rom&amp;nbsp;char&amp;nbsp;far&amp;nbsp;*&amp;nbsp;string)&lt;br /&gt;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;char&amp;nbsp;char_pos;&lt;br /&gt;&amp;nbsp;&amp;nbsp;for&amp;nbsp;(char_pos=0;&amp;nbsp;(string[char_pos]&amp;nbsp;!=&amp;nbsp;0)&amp;nbsp;&amp;&amp;&amp;nbsp;(char_pos&amp;nbsp;&amp;lt;&amp;nbsp;80);&amp;nbsp;char_pos++)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;I2CW(0xc6,&amp;nbsp;1,&amp;nbsp;0,&amp;nbsp;string[char_pos],&amp;nbsp;0);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;void&amp;nbsp;LCDprintc(char&amp;nbsp;string)&lt;br /&gt;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;I2CW(0xc6,&amp;nbsp;1,&amp;nbsp;0,&amp;nbsp;string,&amp;nbsp;0);&lt;br /&gt;&amp;nbsp;}&lt;br /&gt;void&amp;nbsp;LCDClearScreen()&lt;br /&gt;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;I2CW(0xc6,&amp;nbsp;1,&amp;nbsp;0,&amp;nbsp;12,&amp;nbsp;0);&amp;nbsp;//&amp;nbsp;clear&amp;nbsp;screen&lt;br /&gt;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;char&amp;nbsp;LCDKeyboard()&lt;br /&gt;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;unsigned&amp;nbsp;char&amp;nbsp;let_b[16];&lt;br /&gt;&amp;nbsp;&amp;nbsp;EESequentialRead(0xC6,1,let_b,2);&lt;br /&gt;&amp;nbsp;&amp;nbsp;EEAckPolling(0xC6);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(let_b[0]&amp;nbsp;&amp;&amp;nbsp;0b10000000)&amp;nbsp;return&amp;nbsp;'8';&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else&amp;nbsp;if&amp;nbsp;(let_b[0]&amp;nbsp;&amp;&amp;nbsp;0b01000000)&amp;nbsp;return&amp;nbsp;'7';&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else&amp;nbsp;if&amp;nbsp;(let_b[0]&amp;nbsp;&amp;&amp;nbsp;0b00100000)&amp;nbsp;return&amp;nbsp;'6';&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else&amp;nbsp;if&amp;nbsp;(let_b[0]&amp;nbsp;&amp;&amp;nbsp;0b00010000)&amp;nbsp;return&amp;nbsp;'5';&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else&amp;nbsp;if&amp;nbsp;(let_b[0]&amp;nbsp;&amp;&amp;nbsp;0b00001000)&amp;nbsp;return&amp;nbsp;'4';&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else&amp;nbsp;if&amp;nbsp;(let_b[0]&amp;nbsp;&amp;&amp;nbsp;0b00000100)&amp;nbsp;return&amp;nbsp;'3';&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else&amp;nbsp;if&amp;nbsp;(let_b[0]&amp;nbsp;&amp;&amp;nbsp;0b00000010)&amp;nbsp;return&amp;nbsp;'2';&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else&amp;nbsp;if&amp;nbsp;(let_b[0]&amp;nbsp;&amp;&amp;nbsp;0b00000001)&amp;nbsp;return&amp;nbsp;'1';&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else&amp;nbsp;if&amp;nbsp;(let_b[1]&amp;nbsp;&amp;&amp;nbsp;0b00000001)&amp;nbsp;return&amp;nbsp;'9';&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else&amp;nbsp;if&amp;nbsp;(let_b[1]&amp;nbsp;&amp;&amp;nbsp;0b00000100)&amp;nbsp;return&amp;nbsp;'0';&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else&amp;nbsp;if&amp;nbsp;(let_b[1]&amp;nbsp;&amp;&amp;nbsp;0b00001000)&amp;nbsp;return&amp;nbsp;'#';&lt;br /&gt;//&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else&amp;nbsp;if&amp;nbsp;(let_b[1]&amp;nbsp;&amp;&amp;nbsp;0b00000010)&amp;nbsp;return&amp;nbsp;'*';&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else&amp;nbsp;return&amp;nbsp;0;&lt;br /&gt;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;char&amp;nbsp;LCDKeyboardSingleChar()&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;key_pressed&amp;nbsp;=&amp;nbsp;LCDKeyboard();&lt;br /&gt;&amp;nbsp;&amp;nbsp;if&amp;nbsp;((key_pressed&amp;nbsp;!=&amp;nbsp;0)&amp;nbsp;&amp;&amp;&amp;nbsp;(key_pressed&amp;nbsp;!=&amp;nbsp;last_key_pressed))&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;last_key_pressed&amp;nbsp;=&amp;nbsp;key_pressed;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;key_pressed;&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&amp;nbsp;else&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;last_key_pressed&amp;nbsp;=&amp;nbsp;key_pressed;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void&amp;nbsp;I2CR()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;char&amp;nbsp;ADDS,N1,d1,d2,i;&lt;br /&gt;&amp;nbsp;unsigned&amp;nbsp;char&amp;nbsp;let_b[16];&lt;br /&gt;&lt;br /&gt;&amp;nbsp;N1&amp;nbsp;=&amp;nbsp;strcom[3];&amp;nbsp; //&amp;nbsp;numero&amp;nbsp;byte&amp;nbsp;da&amp;nbsp;leggere&lt;br /&gt;&amp;nbsp;ADDS&amp;nbsp;=&amp;nbsp;strcom[2];&amp;nbsp; //&amp;nbsp;I2C&amp;nbsp;Address&lt;br /&gt;&amp;nbsp;d1&amp;nbsp;=&amp;nbsp;strcom[4]; //&amp;nbsp;option&lt;br /&gt;&lt;br /&gt;&amp;nbsp;EESequentialRead(ADDS,d1,let_b,N1);&lt;br /&gt;&amp;nbsp;EEAckPolling(ADDS);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;TXREG&amp;nbsp;=&amp;nbsp;'@';&lt;br /&gt;&amp;nbsp;while(!TXSTAbits.TRMT);&amp;nbsp;&lt;br /&gt;&amp;nbsp;TXREG&amp;nbsp;=&amp;nbsp;'I';&lt;br /&gt;&amp;nbsp;while(!TXSTAbits.TRMT);&amp;nbsp;&lt;br /&gt;&amp;nbsp;TXREG&amp;nbsp;=&amp;nbsp;ADDS;&lt;br /&gt;&amp;nbsp;while(!TXSTAbits.TRMT);&amp;nbsp;&lt;br /&gt;&lt;br /&gt;for&amp;nbsp;(i=0;i&amp;lt;N1;i++)&lt;br /&gt;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;TXREG&amp;nbsp;=&amp;nbsp;let_b[i];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;while(!TXSTAbits.TRMT);&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;char&amp;nbsp;GPIO_read(void)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;return&amp;nbsp;PORTB;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void&amp;nbsp;GPIO_write(char&amp;nbsp;v)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;LATB&amp;nbsp;=&amp;nbsp;v;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;void&amp;nbsp;EnterCoords()&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;char&amp;nbsp;c;&lt;br /&gt;&amp;nbsp;&amp;nbsp;char&amp;nbsp;pos;&lt;br /&gt;&amp;nbsp;&amp;nbsp;char&amp;nbsp;bufpos;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;LCDClearScreen();&lt;br /&gt;&amp;nbsp;&amp;nbsp;LCDprint2((const&amp;nbsp;rom&amp;nbsp;char&amp;nbsp;far&amp;nbsp;*)"Lat:&amp;nbsp;");&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;c&amp;nbsp;=&amp;nbsp;LCDKeyboard();&lt;br /&gt;&amp;nbsp;&amp;nbsp;while&amp;nbsp;(c&amp;nbsp;==&amp;nbsp;'#')&amp;nbsp;{&amp;nbsp;//&amp;nbsp;if&amp;nbsp;the&amp;nbsp;#&amp;nbsp;key&amp;nbsp;is&amp;nbsp;still&amp;nbsp;pressed,&amp;nbsp;wait&amp;nbsp;until&amp;nbsp;it&amp;nbsp;is&amp;nbsp;released&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;DelayMilliSeconds(100);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;c&amp;nbsp;=&amp;nbsp;LCDKeyboard();&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;pos&amp;nbsp;=&amp;nbsp;0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;bufpos&amp;nbsp;=&amp;nbsp;0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;while(c&amp;nbsp;!=&amp;nbsp;'*')&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(c&amp;nbsp;!=&amp;nbsp;0)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(pos&amp;nbsp;==&amp;nbsp;0)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LCDprintc(c);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;buf[bufpos++]&amp;nbsp;=&amp;nbsp;c;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;else&amp;nbsp;if&amp;nbsp;(pos&amp;nbsp;==&amp;nbsp;1)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LCDprintc(c);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;buf[bufpos]&amp;nbsp;=&amp;nbsp;c;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;buf[bufpos+1]&amp;nbsp;=&amp;nbsp;0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;latitude_dc&amp;nbsp;=&amp;nbsp;atol(buf);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LCDprintc('&amp;nbsp;');&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;bufpos&amp;nbsp;=&amp;nbsp;0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;else&amp;nbsp;if&amp;nbsp;((pos&amp;nbsp;&amp;gt;=&amp;nbsp;2)&amp;nbsp;&amp;&amp;&amp;nbsp;(pos&amp;nbsp;&amp;lt;&amp;nbsp;7))&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;buf[bufpos++]&amp;nbsp;=&amp;nbsp;c;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LCDprintc(c);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(pos&amp;nbsp;==&amp;nbsp;3)&amp;nbsp;LCDprintc('.');&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;else&amp;nbsp;if&amp;nbsp;(pos&amp;nbsp;==&amp;nbsp;7)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LCDprintc(c);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;buf[bufpos]&amp;nbsp;=&amp;nbsp;c;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;buf[bufpos+1]&amp;nbsp;=&amp;nbsp;0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;latitude_mc&amp;nbsp;=&amp;nbsp;atol(buf);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;bufpos&amp;nbsp;=&amp;nbsp;0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;else&amp;nbsp;if&amp;nbsp;(pos&amp;nbsp;==&amp;nbsp;8)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(c&amp;nbsp;==&amp;nbsp;'2')&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LCDprintc('N');&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;else&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LCDprintc('S');&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;latitude_dc&amp;nbsp;=&amp;nbsp;-latitude_dc;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;latitude_mc&amp;nbsp;=&amp;nbsp;-latitude_mc;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;bufpos&amp;nbsp;=&amp;nbsp;0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LCDprintc(13);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LCDprint2((const&amp;nbsp;rom&amp;nbsp;char&amp;nbsp;far&amp;nbsp;*)"Lon:");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;else&amp;nbsp;if&amp;nbsp;((pos&amp;nbsp;&amp;gt;=&amp;nbsp;9)&amp;nbsp;&amp;&amp;&amp;nbsp;(pos&amp;nbsp;&amp;lt;&amp;nbsp;11))&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LCDprintc(c);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;buf[bufpos++]&amp;nbsp;=&amp;nbsp;c;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;else&amp;nbsp;if&amp;nbsp;(pos&amp;nbsp;==&amp;nbsp;11)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LCDprintc(c);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;buf[bufpos]&amp;nbsp;=&amp;nbsp;c;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;buf[bufpos+1]&amp;nbsp;=&amp;nbsp;0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;longitude_dc&amp;nbsp;=&amp;nbsp;atol(buf);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LCDprintc('&amp;nbsp;');&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;bufpos&amp;nbsp;=&amp;nbsp;0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;else&amp;nbsp;if&amp;nbsp;((pos&amp;nbsp;&amp;gt;=&amp;nbsp;12)&amp;nbsp;&amp;&amp;&amp;nbsp;(pos&amp;nbsp;&amp;lt;&amp;nbsp;17))&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LCDprintc(c);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;buf[bufpos++]&amp;nbsp;=&amp;nbsp;c;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(pos&amp;nbsp;==&amp;nbsp;13)&amp;nbsp;LCDprintc('.');&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;else&amp;nbsp;if&amp;nbsp;(pos&amp;nbsp;==&amp;nbsp;17)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LCDprintc(c);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;buf[bufpos]&amp;nbsp;=&amp;nbsp;c;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;buf[bufpos+1]&amp;nbsp;=&amp;nbsp;0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;longitude_mc&amp;nbsp;=&amp;nbsp;atol(buf);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;bufpos&amp;nbsp;=&amp;nbsp;0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;else&amp;nbsp;if&amp;nbsp;(pos&amp;nbsp;==&amp;nbsp;18)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(c&amp;nbsp;==&amp;nbsp;'6')&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LCDprintc('E');&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;longitude_mc&amp;nbsp;=&amp;nbsp;-longitude_mc;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;longitude_dc&amp;nbsp;=&amp;nbsp;-longitude_dc;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;else&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LCDprintc('W');&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LCDprintc(13);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LCDprint2((const&amp;nbsp;rom&amp;nbsp;char&amp;nbsp;far&amp;nbsp;*)"Height:");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;else&amp;nbsp;{&amp;nbsp;//&amp;nbsp;Height&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LCDprintc(c);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;buf[bufpos++]&amp;nbsp;=&amp;nbsp;c;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(pos&amp;nbsp;==&amp;nbsp;23)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;buf[bufpos]&amp;nbsp;=&amp;nbsp;'0';&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;buf[bufpos+1]&amp;nbsp;=&amp;nbsp;0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;hc&amp;nbsp;=&amp;nbsp;atol(buf);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ind_quality&amp;nbsp;=&amp;nbsp;'1';&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sat_in_view0='X';&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sat_in_view1='X';&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;valid_row&amp;nbsp;=&amp;nbsp;0;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;manual_coords&amp;nbsp;=&amp;nbsp;1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pos++;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;c&amp;nbsp;=&amp;nbsp;LCDKeyboardSingleChar();&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;void&amp;nbsp;ProgramXBee(const&amp;nbsp;rom&amp;nbsp;char&amp;nbsp;far&amp;nbsp;*&amp;nbsp;local_address,&amp;nbsp;const&amp;nbsp;rom&amp;nbsp;char&amp;nbsp;far&amp;nbsp;*&amp;nbsp;remote_address)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;char&amp;nbsp;c;&lt;br /&gt;&amp;nbsp;&amp;nbsp;LCDClearScreen();&lt;br /&gt;&amp;nbsp;&amp;nbsp;LCDprint2((const&amp;nbsp;rom&amp;nbsp;char&amp;nbsp;far&amp;nbsp;*)"Are&amp;nbsp;you&amp;nbsp;sure?\r&amp;nbsp;press&amp;nbsp;#&amp;nbsp;for&amp;nbsp;yes");&lt;br /&gt;&amp;nbsp;&amp;nbsp;c&amp;nbsp;=&amp;nbsp;LCDKeyboardSingleChar();&lt;br /&gt;&amp;nbsp;&amp;nbsp;while&amp;nbsp;(c&amp;nbsp;==&amp;nbsp;0)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;c&amp;nbsp;=&amp;nbsp;LCDKeyboardSingleChar();&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(c&amp;nbsp;==&amp;nbsp;'#')&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;write_s_UART2((const&amp;nbsp;rom&amp;nbsp;char&amp;nbsp;far&amp;nbsp;*)"Programming...");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;DelayMilliSeconds(4000);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(XBeeProcessCommand("+++",&amp;nbsp;0,&amp;nbsp;0))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(XBeeProcessCommand("ATMY",&amp;nbsp;local_address,&amp;nbsp;13))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(XBeeProcessCommand("ATDH",&amp;nbsp;"0000",&amp;nbsp;13))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(XBeeProcessCommand("ATDL",&amp;nbsp;remote_address,&amp;nbsp;13))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(XBeeProcessCommand("ATWR",&amp;nbsp;0,&amp;nbsp;13))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(XBeeProcessCommand("ATCN",&amp;nbsp;0,&amp;nbsp;13))&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LCDprint2((const&amp;nbsp;rom&amp;nbsp;char&amp;nbsp;far&amp;nbsp;*)"XBEE&amp;nbsp;programmed!");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&amp;nbsp;else&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LCDClearScreen();&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;char&amp;nbsp;XBeeProcessCommand(const&amp;nbsp;rom&amp;nbsp;char&amp;nbsp;far&amp;nbsp;*&amp;nbsp;command1,&amp;nbsp;const&amp;nbsp;rom&amp;nbsp;char&amp;nbsp;far&amp;nbsp;*&amp;nbsp;command2,&amp;nbsp;char&amp;nbsp;command3)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;write_s_UART2(command1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(command2&amp;nbsp;!=&amp;nbsp;0)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;write_s_UART2(command2);&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(command3&amp;nbsp;!=&amp;nbsp;0)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;write_c_UART(command3);&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;switch&amp;nbsp;(XBeeResponse())&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case&amp;nbsp;1:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LCDprint2((const&amp;nbsp;rom&amp;nbsp;char&amp;nbsp;far&amp;nbsp;*)"Command&amp;nbsp;");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LCDprint2(command1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(command2&amp;nbsp;!=&amp;nbsp;0)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LCDprint2(command2);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LCDprint2((const&amp;nbsp;rom&amp;nbsp;char&amp;nbsp;far&amp;nbsp;*)"&amp;nbsp;okay\r");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case&amp;nbsp;2:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LCDprintc(13);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LCDprint2((const&amp;nbsp;rom&amp;nbsp;char&amp;nbsp;far&amp;nbsp;*)"XBEE&amp;nbsp;said:&amp;nbsp;ERROR");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case&amp;nbsp;0:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LCDprintc(13);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LCDprint2((const&amp;nbsp;rom&amp;nbsp;char&amp;nbsp;far&amp;nbsp;*)"XBEE&amp;nbsp;did&amp;nbsp;not&amp;nbsp;respond");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break;&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;return&amp;nbsp;0;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;char&amp;nbsp;XBeeResponse()&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;int&amp;nbsp;i;&lt;br /&gt;&amp;nbsp;&amp;nbsp;DelayMilliSeconds(1200);&amp;nbsp;//&amp;nbsp;check&amp;nbsp;if&amp;nbsp;the&amp;nbsp;XBee&amp;nbsp;responds&amp;nbsp;after&amp;nbsp;one&amp;nbsp;second&lt;br /&gt;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(TXcount&amp;nbsp;!=&amp;nbsp;0)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(strcom[0]&amp;nbsp;==&amp;nbsp;'O'&amp;nbsp;&amp;&amp;&amp;nbsp;strcom[1]&amp;nbsp;==&amp;nbsp;'K')&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;TXcount&amp;nbsp;=&amp;nbsp;0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;else&amp;nbsp;if&amp;nbsp;(strcom[0]&amp;nbsp;==&amp;nbsp;'E'&amp;nbsp;&amp;&amp;&amp;nbsp;strcom[1]&amp;nbsp;==&amp;nbsp;'R'&amp;nbsp;&amp;&amp;&amp;nbsp;strcom[2]&amp;nbsp;==&amp;nbsp;'R'&amp;nbsp;&amp;&amp;&amp;nbsp;strcom[3]&amp;nbsp;==&amp;nbsp;'O'&amp;nbsp;&amp;&amp;&amp;nbsp;strcom[3]&amp;nbsp;==&amp;nbsp;'R')&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;TXcount&amp;nbsp;=&amp;nbsp;0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;2;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;TXcount&amp;nbsp;=&amp;nbsp;0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;return&amp;nbsp;0;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void&amp;nbsp;write_c_UART(char&amp;nbsp;c)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;TXREG&amp;nbsp;=&amp;nbsp;c;&lt;br /&gt;&amp;nbsp;while(!TXSTAbits.TRMT);&amp;nbsp;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void&amp;nbsp;write_s_UART(char&amp;nbsp;*&amp;nbsp;c)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;int&amp;nbsp;pos;&lt;br /&gt;&amp;nbsp;for(pos=0;&amp;nbsp;(pos&amp;nbsp;&amp;lt;&amp;nbsp;10)&amp;nbsp;&amp;&amp;&amp;nbsp;(c[pos]&amp;nbsp;!=&amp;nbsp;0);&amp;nbsp;pos++)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;write_c_UART(c[pos]);&lt;br /&gt;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void&amp;nbsp;write_s_UART2(const&amp;nbsp;rom&amp;nbsp;char&amp;nbsp;far&amp;nbsp;*&amp;nbsp;c)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;int&amp;nbsp;pos;&lt;br /&gt;&amp;nbsp;&amp;nbsp;for(pos=0;&amp;nbsp;(pos&amp;nbsp;&amp;lt;&amp;nbsp;10)&amp;nbsp;&amp;&amp;&amp;nbsp;(c[pos]&amp;nbsp;!=&amp;nbsp;0);&amp;nbsp;pos++)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;write_c_UART(c[pos]);&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void&amp;nbsp;DelayMilliSeconds(int&amp;nbsp;ms)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;int&amp;nbsp;x;&lt;br /&gt;&amp;nbsp;&amp;nbsp;for(x=0;&amp;nbsp;x&amp;nbsp;&amp;lt;&amp;nbsp;ms;&amp;nbsp;x++)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Delay10KTCYx(1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void&amp;nbsp;GPSParse()&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;char&amp;nbsp;FLDcounter;&lt;br /&gt;&amp;nbsp;&amp;nbsp;char&amp;nbsp;curr_pos;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;char&amp;nbsp;FLDpos;&lt;br /&gt;&amp;nbsp;&amp;nbsp;curr_pos&amp;nbsp;=&amp;nbsp;6;&lt;br /&gt;&amp;nbsp;&amp;nbsp;FLDcounter=1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;for&amp;nbsp;(curr_pos=6;&amp;nbsp;curr_pos&amp;nbsp;&amp;lt;&amp;nbsp;76;&amp;nbsp;curr_pos++)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(strcom[curr_pos]&amp;nbsp;==&amp;nbsp;',')&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;switch&amp;nbsp;(FLDcounter)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case&amp;nbsp;2:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;buf[2]&amp;nbsp;=&amp;nbsp;strcom[curr_pos-4];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;buf[3]&amp;nbsp;=&amp;nbsp;strcom[curr_pos-3];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;buf[4]&amp;nbsp;=&amp;nbsp;strcom[curr_pos-2];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;buf[5]&amp;nbsp;=&amp;nbsp;strcom[curr_pos-1];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;buf[6]&amp;nbsp;=&amp;nbsp;0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;latitude_mc&amp;nbsp;=&amp;nbsp;atol(buf);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case&amp;nbsp;3:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(strcom[curr_pos-1]&amp;nbsp;==&amp;nbsp;'S')&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;latitude_dc&amp;nbsp;=&amp;nbsp;-latitude_dc;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;latitude_mc&amp;nbsp;=&amp;nbsp;-latitude_mc;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case&amp;nbsp;4:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;buf[2]&amp;nbsp;=&amp;nbsp;strcom[curr_pos-4];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;buf[3]&amp;nbsp;=&amp;nbsp;strcom[curr_pos-3];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;buf[4]&amp;nbsp;=&amp;nbsp;strcom[curr_pos-2];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;buf[5]&amp;nbsp;=&amp;nbsp;strcom[curr_pos-1];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;buf[6]&amp;nbsp;=&amp;nbsp;0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;longitude_mc&amp;nbsp;=&amp;nbsp;atol(buf);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case&amp;nbsp;5:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(strcom[curr_pos-1]&amp;nbsp;==&amp;nbsp;'E')&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;longitude_dc&amp;nbsp;=&amp;nbsp;-longitude_dc;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;longitude_mc&amp;nbsp;=&amp;nbsp;-longitude_mc;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case&amp;nbsp;6:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ind_quality&amp;nbsp;=&amp;nbsp;strcom[curr_pos-1];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case&amp;nbsp;7:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sat_in_view0&amp;nbsp;=&amp;nbsp;strcom[curr_pos-2];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sat_in_view1&amp;nbsp;=&amp;nbsp;strcom[curr_pos-1];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case&amp;nbsp;9:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(FLDpos&amp;nbsp;&amp;lt;&amp;nbsp;10)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;buf[FLDpos]&amp;nbsp;=&amp;nbsp;'0';&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;buf[FLDpos+1]&amp;nbsp;=&amp;nbsp;0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;hc&amp;nbsp;=&amp;nbsp;atol(buf);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;curr_pos&amp;nbsp;=&amp;nbsp;99;&amp;nbsp;//&amp;nbsp;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!&amp;nbsp;exit&amp;nbsp;loop&amp;nbsp;!!!!!!!!!!!!!!!!!!!&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;FLDcounter++;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;FLDpos&amp;nbsp;=&amp;nbsp;0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;else&amp;nbsp;if&amp;nbsp;(strcom[curr_pos]&amp;nbsp;==&amp;nbsp;'.')&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;switch&amp;nbsp;(FLDcounter)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case&amp;nbsp;2:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;buf[0]&amp;nbsp;=&amp;nbsp;strcom[curr_pos-4];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;buf[1]&amp;nbsp;=&amp;nbsp;strcom[curr_pos-3];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;buf[2]&amp;nbsp;=&amp;nbsp;0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;latitude_dc&amp;nbsp;=&amp;nbsp;atol(buf);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;buf[0]&amp;nbsp;=&amp;nbsp;strcom[curr_pos-2];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;buf[1]&amp;nbsp;=&amp;nbsp;strcom[curr_pos-1];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case&amp;nbsp;4:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;buf[0]&amp;nbsp;=&amp;nbsp;strcom[curr_pos-5];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;buf[1]&amp;nbsp;=&amp;nbsp;strcom[curr_pos-4];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;buf[2]&amp;nbsp;=&amp;nbsp;strcom[curr_pos-3];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;buf[3]&amp;nbsp;=&amp;nbsp;0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;longitude_dc&amp;nbsp;=&amp;nbsp;atol(buf);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;buf[0]&amp;nbsp;=&amp;nbsp;strcom[curr_pos-2];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;buf[1]&amp;nbsp;=&amp;nbsp;strcom[curr_pos-1];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case&amp;nbsp;9:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;buf[FLDpos]&amp;nbsp;=&amp;nbsp;strcom[curr_pos+1];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;buf[FLDpos+1]&amp;nbsp;=&amp;nbsp;0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;FLDpos&amp;nbsp;=&amp;nbsp;10;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;FLDpos++;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;else&amp;nbsp;if&amp;nbsp;(FLDcounter&amp;nbsp;==&amp;nbsp;9)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;buf[FLDpos]&amp;nbsp;=&amp;nbsp;strcom[curr_pos];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;FLDpos++;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/355411830490069516-4321424032531657785?l=wdaehn.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/355411830490069516/posts/default/4321424032531657785'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/355411830490069516/posts/default/4321424032531657785'/><link rel='alternate' type='text/html' href='http://wdaehn.blogspot.com/2008/09/mainc-file.html' title='main.c file'/><author><name>wdaehn</name><uri>http://www.blogger.com/profile/11792883669228965857</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='13986123866228273391'/></author></entry><entry><id>tag:blogger.com,1999:blog-355411830490069516.post-1673693264525983265</id><published>2008-09-25T12:14:00.001-07:00</published><updated>2008-09-25T12:14:56.581-07:00</updated><title type='text'>Tracker.h File</title><content type='html'>&lt;blockquote&gt;void GPSParse(void);&lt;br /&gt;char XBeeResponse(void);&lt;br /&gt;void DelayMilliSeconds(int);&lt;br /&gt;void write_s_UART(char *);&lt;br /&gt;void write_s_UART2(const rom char far *);&lt;br /&gt;void LCDprint2(const rom char far *);&lt;br /&gt;char LCDKeyboard(void);&lt;br /&gt;char LCDKeyboardSingleChar(void);&lt;br /&gt;void ISRgest(void);     // I.S.R.&lt;br /&gt;void Servo(void);    &lt;br /&gt;char GPIO_read(void);    // GPIO&lt;br /&gt;void init_sys(void);    // init    &lt;br /&gt;void I2CW(char, char, char, char, char);&lt;br /&gt;void I2CR(void);     // I2C generic read&lt;br /&gt;void flashLED(char);&lt;br /&gt;long getDeltaLatitude(void);&lt;br /&gt;long getDeltaLongitude(void);&lt;br /&gt;long getHeight(void);&lt;br /&gt;long approx_atan2(long, long);&lt;br /&gt;long isqrt(long);&lt;br /&gt;void LCDprintc(char);&lt;br /&gt;void LCDprint(char *);&lt;br /&gt;void LCDClearScreen(void);&lt;br /&gt;void EnterCoords(void);&lt;br /&gt;void ProgramXBee(const rom char far *, const rom char far *);&lt;br /&gt;char XBeeProcessCommand(const rom char far *, const rom char far *, char);&lt;br /&gt;void write_c_UART(char);&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/355411830490069516-1673693264525983265?l=wdaehn.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/355411830490069516/posts/default/1673693264525983265'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/355411830490069516/posts/default/1673693264525983265'/><link rel='alternate' type='text/html' href='http://wdaehn.blogspot.com/2008/09/trackerh-file.html' title='Tracker.h File'/><author><name>wdaehn</name><uri>http://www.blogger.com/profile/11792883669228965857</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='13986123866228273391'/></author></entry><entry><id>tag:blogger.com,1999:blog-355411830490069516.post-3867227233315105836</id><published>2008-09-25T08:52:00.000-07:00</published><updated>2008-09-25T12:11:03.530-07:00</updated><title type='text'>Motor Tripod Part II</title><content type='html'>The last test was finally a successful one. I still will need to check the distance the wireless connection can work with and the test site I used is not wide enough, just 20m away causes the GPS errors to add up a lot. And the site does not have great visibility to the sky either with trees and hills around. So much about the excuses.&lt;br /&gt;&lt;br /&gt;So what is working? Let me show you the video first. I place the GPS receiver next to the tripod and power up both. After a few seconds, the tripod electronic will show on the LCD that it found 6 or 7 satellites so you can be sure the position to be accurate. You press "5" on the keyboard and the tripod will store this position as its own.&lt;br /&gt;Next I placed the GPS receiver 15m away so the controller can lock on the remote position. Back at the tripod I then use the keyboard to pan/tilt the video head until the camera looks straight at the position where the GPS receiver is lying on the ground. And that is where the video starts...&lt;br /&gt;&lt;br /&gt;&lt;object width="320" height="266" class="BLOG_video_class" id="BLOG_video-26c12a82f68dd8c9" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"&gt;&lt;param name="movie" value="http://www.blogger.com/img/videoplayer.swf?videoUrl=http%3A%2F%2Fvp.video.google.com%2Fvideodownload%3Fversion%3D0%26secureurl%3DqAAAAO3T1daHheEeH3ZcEQIwEb9pxBXKDUb7KK8YvLC_tObBgTJ6B6wm3dI71c1CCmTLzzr-dsCTqqAFABzLdZV5y5tofacccH71R6WZChW1fVJUecZXIR3U4vWMoHvwI-GqRQe3PyjYD8f_fAPcKuP1Q991b1Ez0OqgljGtX61KVhqfBP1X30ART_tIbRzEdcPaD4tWe8AOq3WCS9MTHQco_D-Ji6xfInQxqvXCxHDctKXJ%26sigh%3D8BOjxoipJi09H5xEZpWKTGCpTiE%26begin%3D0%26len%3D86400000%26docid%3D0&amp;amp;nogvlm=1&amp;amp;thumbnailUrl=http%3A%2F%2Fvideo.google.com%2FThumbnailServer2%3Fapp%3Dblogger%26contentid%3D26c12a82f68dd8c9%26offsetms%3D5000%26itag%3Dw320%26sigh%3DQloyfStxsm3jRYtkURncwAcylfE&amp;amp;messagesUrl=video.google.com%2FFlashUiStrings.xlb%3Fframe%3Dflashstrings%26hl%3Den"&gt;&lt;param name="bgcolor" value="#FFFFFF"&gt;&lt;embed width="320" height="266" src="http://www.blogger.com/img/videoplayer.swf?videoUrl=http%3A%2F%2Fvp.video.google.com%2Fvideodownload%3Fversion%3D0%26secureurl%3DqAAAAO3T1daHheEeH3ZcEQIwEb9pxBXKDUb7KK8YvLC_tObBgTJ6B6wm3dI71c1CCmTLzzr-dsCTqqAFABzLdZV5y5tofacccH71R6WZChW1fVJUecZXIR3U4vWMoHvwI-GqRQe3PyjYD8f_fAPcKuP1Q991b1Ez0OqgljGtX61KVhqfBP1X30ART_tIbRzEdcPaD4tWe8AOq3WCS9MTHQco_D-Ji6xfInQxqvXCxHDctKXJ%26sigh%3D8BOjxoipJi09H5xEZpWKTGCpTiE%26begin%3D0%26len%3D86400000%26docid%3D0&amp;amp;nogvlm=1&amp;amp;thumbnailUrl=http%3A%2F%2Fvideo.google.com%2FThumbnailServer2%3Fapp%3Dblogger%26contentid%3D26c12a82f68dd8c9%26offsetms%3D5000%26itag%3Dw320%26sigh%3DQloyfStxsm3jRYtkURncwAcylfE&amp;amp;messagesUrl=video.google.com%2FFlashUiStrings.xlb%3Fframe%3Dflashstrings%26hl%3Den" type="application/x-shockwave-flash"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;As said, I will post another video when I have the chance to test it on open ground.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Details...&lt;br /&gt;The program consists basically of two phases. One is where all the setup takes place and the tripod position is locked in. And the second phase is the tracking mode with the option to manually control the head to maintain the offsets.&lt;br /&gt;&lt;br /&gt;In the first phase the controller will carefully print its current state onto the LCD. Did it receive any serial data yet? Did it receive a valid GPS sentence? Does the GPS sentence tell that we have a satellite fix? And finally, if all is true it will tell you can press "5" at any time and start printing the number of satellites we have in view.&lt;br /&gt;In order to get a serial connection via the XBee modules, they need to be programmed first. So I had to by a prototype board with which you can connect the XBee to the USB port of the computer and using a terminal emulation (Windows Hyperterminal) you can bring the module in the programming state by typing "+++" with two seconds lead and lag time where no data is sent. Then using some commands like "ATDL0202" you can tell it to which module it should send the data to - the one with the number 0x0202, what its own address is and save all of that into the XBee memory. To simplify that task for you, when no serial data is received you can press "1" or "2" to program either the local or the remote module. It does not matter which one is what, all I do is in "1" I set the XBee module address to one value and the the remote to another, when you press "2" I do the same but now the former remote address is the local. So all you have to do is insert the first XBee module, power up the controller, wait until it says "no data received, press 1 or 2" and then you press "1". Power down the controller, remove the XBee and place it into the socket of the GPS receiver. And the other XBee is now placed into the controller and programmed with "2". From now on you have a transparent serial connection between those two XBee's and when the GPS receiver is turned on, data should be received.&lt;br /&gt;&lt;br /&gt;Once the local position is locked in, the controller goes into the second phase, the locking and aligning. To avoid erratic movement, the tracking is only done if the GPS module is more that 10m away. The first time the tracking starts, the current video head position is used as reference zero point. So at first, the head will not move at all and then start following you. If you walked away along where the camera looked to, the position would be correct already. But very likely it is off by a bid. So you place the GPS receiver somewhere remote and leave it there, then you walk back to the tripod and using the keys "4"-"6" and "2"-"8" you can move the zero-point until the camera looks directly at the GPS device. And from now on, the camera should keep the GPS always in the same position of the viewfinder - more or less.&lt;br /&gt;&lt;br /&gt;Another option to provide a GPS position is to manually type it in. This is only useful if no GPS data is received at that time! For example, I might not trust the home position, I want the enter it by myself. So I power up the tripod but leave the GPS unit off. At any time you can press the "#" button and then using the keyboard enter the coordinates manually. At first, you type the digits for the latitude in the format 50° 20.2342N. So you just type the number sequence 5-0-2-0-2-3-4-2-2, the last "2" stands for north. Then the latitude 004° 43.2341E and finally the height in meter 000123. This manual entry is interpreted as a first valid GPS sentence, so you can press "5" to lock it in.&lt;br /&gt;More important, instead of placing the GPS unit somewhere remote and then adjust the camera to it, you can switch it off then and manually enter the coords of any landmark in view. This will be used as the remote position and using the keyboard you then turn the head towards this location to zero it in. Turn on the GPS device again and as soon you are 10m away the head will look straight to you.&lt;br /&gt;This feature was particularily cool during testing and calibrating the code. Sitting at the computer, entered the GPS position taken from google earth and the head started to move.&lt;br /&gt;&lt;br /&gt;Another feature built in is to freeze the height. This is particularily useful if the camera and the object is on the same level the entire time anyway - Windsurfing, yes? - or like in my testing the GPS is close and does not have a good fix. In this case the height information keeps wandering by 10m within minutes.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Another change I made recently was to implement servo speed. Before, the GPS did send a new position every second. As a result, the head did jump to the new angle and then remained there for the reminder of the second to jump by another degree then. The result was no smooth movement, not at all. What I do now is calculating the degrees to be moved, divide that by one second and that is the rotation speed. So we are up to one second behind the actual position but that is good enough. Some fine tuning will be in order later.&lt;br /&gt;&lt;br /&gt;The one step that is still missing is programming the GPS. By default it sends different GPS sentences, more than we are interested in. The XBee has a buffer of 100 characters which are sent at once and one GPS position sentence fits perfectly into that. So even without flowcontrol, we have a very reliable connection. Would we send more data every second, much more sentences would be lost. So I told the GPS I am interested in the GPGGA sentences only. The other thing, by default the SIRF chip is set to static movement and track smoothing, both good for higher speed movements but not for walking - so I disabled both. To do that you have to send a command to the GPS bringing it into binary mode where no ASCII data istransferred but binary data and then you can set those advanced options. Found that too dangerous to try via the XBee so I rather used a tool called SIRFdemo. But for this the GPS has to be connected to the computer directly or you have to make sure the binary mode is using 9600Baud as well. The first time I did that wrong and the result was the XBee couldn't talk to the GPS anymore due to different baud rates. So I had to program both XBees to 57kbit rate, then bring the GPS back into ASCII mode at 9600baud and reprogram the XBees again.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/355411830490069516-3867227233315105836?l=wdaehn.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='enclosure' type='video/mp4' href='http://www.blogger.com/video-play.mp4?contentId=26c12a82f68dd8c9&amp;type=video%2Fmp4' length='0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/355411830490069516/posts/default/3867227233315105836'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/355411830490069516/posts/default/3867227233315105836'/><link rel='alternate' type='text/html' href='http://wdaehn.blogspot.com/2008/09/motor-tripod-part-ii.html' title='Motor Tripod Part II'/><author><name>wdaehn</name><uri>http://www.blogger.com/profile/11792883669228965857</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='13986123866228273391'/></author></entry><entry><id>tag:blogger.com,1999:blog-355411830490069516.post-4372377185495077286</id><published>2008-09-17T12:36:00.000-07:00</published><updated>2008-09-17T14:06:30.523-07:00</updated><title type='text'>Motorized Tripod with GPS</title><content type='html'>The idea came during a Windsurfing trip. I'd like somebody to video tape me while windsurfing. Trouble is you cannot find anybody, it is windy at the beach, nobody wants to film for an hour or more. And you need a tripod as the wind blows  so strong  you cannot hold the camera steady enough. What if you have a motorized pan-tilt head mounted on the tripod which receives the GPS coordinates wireless and translates that into the correct angles to keep  the GPS receiver in the center of the view finder.&lt;br /&gt;&lt;br /&gt;Given my experience with GPS you can assume - good reception given - to get the correct position from the GPS with an error margin of about 5 meters in distance, height is worse, I would expect the position wandering +-10meters. So the first limitation is, you cannot expect to follow objects very close to the camera. If the camera position is off by five meters and the GPS receiver another 5 meters in the other direction you need to be at least 20m away to make sure the camera points somewhat into your direction. For Windsufing no problem.&lt;br /&gt;&lt;br /&gt;So the entire project can be split into the following components:&lt;br /&gt;1. Receive GPS data wireless over a good distance&lt;br /&gt;2. Microcontroller and its software&lt;br /&gt;3. The pan-tilt mechanic&lt;br /&gt;&lt;br /&gt;Typical GPS receivers have either an USB, a bluetooth or a serial connection to the computer. Bluetooth would be just perfect but its range is  10meter. In theory bluetooth can span up to 100meter but even that is not far enough for this application nor do you find bluetooth class2 enabled GPS recievers prebuilt. All common microcontrollers support a serial connection, the easiest method would be to go for a serial GPS receiver and some wireless replacement for a serial cable. The most current standard for that is &lt;a href="http://en.wikipedia.org/wiki/ZigBee"&gt;ZigBee or XBee&lt;/a&gt;. Low-Cost, Low-Power, free 2.4GHz band and distances up to 1.5km.&lt;br /&gt;&lt;br /&gt;Next question was how to connect the XBee module with the GPS receiver on one side and on the other end, XBee connected to the microcontroller. Guess what, there are controllers available already that have a plug for XBee modules built in.&lt;br /&gt;&lt;br /&gt;Deciding on the mechanical components took the longest time. Basically I had two options. Either use a stepper motor or RC servos. Stepper motors are very precise, slower but that  would be okay. And I would need to make the mechanics all by myself. A standard RC servo on the other hand is all I really needed. It is fast, cheap, it is a +-180 degree rotating movement already. But for a heavy D-SLR camera they might not be strong enough. And the question still was, how to attach the camera to the servos.&lt;br /&gt;&lt;br /&gt;At the end I bought the following components (bought in Germany but I am sure you find equivalent offerings anywhere else).&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.amazon.de/Navilock-NL-501ETTL-Sirf3-TTL-Modul/dp/B0011E5B8U/ref=sr_1_5?ie=UTF8&amp;s=ce-de&amp;qid=1221683163&amp;sr=8-5"&gt;Navilock NL-501ETTL Sirf3 TTL Modul&lt;/a&gt;: A GPS receiver with 3V UART interface and the SIRFIII low power chipset, costs just 30EUR.&lt;br /&gt;&lt;a href="http://www.nodna.com/xtc/product_info.php?info=p980_XBee-wireless-Zigbee-PRO-Modul-mit-Drahtantenne.html"&gt;XBee PRO Module with wire antenna&lt;/a&gt;: Need two items, 45EUR each.&lt;br /&gt;&lt;a href="http://www.nodna.com/xtc/product_info.php?info=p868_Droids-XBee-Simple-Board.html"&gt;Droids XBee Simple Board&lt;/a&gt;: The board connecting the GPS unit to the XBee module. As it has an integrated voltage regulator it will power both, the XBee and the GPS.&lt;br /&gt;&lt;a href="http://www.nodna.com/xtc/product_info.php?info=p867_Droids-Multi-Interface-Board-PIC18F2520.html"&gt;Droids Multi Interface Board PIC18F2520&lt;/a&gt;: A PIC microprocessor based development board with Servo output, XBee enabled and ICSP interface for programming.&lt;br /&gt;The PICKit2 programmer to transfer the compiled software into the microcontroller. In theory you can do that via other ways as well, but if anything goes wrong or you need to debug the code you have to have such a thing anyway. (see &lt;a href="http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&amp;nodeId=1406&amp;dDocName=en023805"&gt;microchip web site&lt;/a&gt;) Software is available there free of charge including  the C compiler I used, it is called C18. If you search for "Clone Microchip  Programmer" or "pic kit clone" in some variations at e.g. ebay you get this for 30EUR or so.&lt;br /&gt;&lt;a href="http://www.robot-electronics.co.uk/htm/Lcd03tech.htm"&gt;LCD03 display and keyboard&lt;/a&gt;: Used to interact with the user. Search for LCD03, seems to be a standard component found everywhere.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.nodna.com/xtc/product_info.php?info=p676_GIANT-Aluminium-Servohalterung--Paar.html"&gt;Servo bracket&lt;/a&gt;: With these you can screw multiple servos together and build the pan-tilt head. This bracket will hold the servo body.&lt;br /&gt;&lt;a href="http://www.nodna.com/xtc/product_info.php?info=p952_GIANT-Aluminium--C--Servohalterung-lang--Paar.html"&gt;Servo C-bracket&lt;/a&gt;: The other half of the bracket, this time for the servo head.&lt;br /&gt;&lt;a href="http://www.nodna.com/xtc/product_info.php?info=p286_Hitec-Spline-Metal-Servo-Horn--mit-Gewinde-.html"&gt;Metal Servo Horn&lt;/a&gt;: Required component for the two brackets, two pieces needed.&lt;br /&gt;&lt;a href="http://www.amazon.de/gp/product/B000JLK5PU"&gt;Manfrotto Quick release plate&lt;/a&gt;: Two items, one is used to attach the camera to the servo bracket, the other is between servo and tripod.&lt;br /&gt;Hitec HS-5745MG servos: Again, two pieces required. I tried with analog servos first but they kept trembling even in a static position. Digital servos are much better and do not cost that much more.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;...more to come...&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_trZeScPDm6Q/SNFwrfjL4vI/AAAAAAAAAB0/MYPTRYgT6-k/s1600-h/20080910_104912.jpg"&gt;&lt;img src="http://4.bp.blogspot.com/_trZeScPDm6Q/SNFwrfjL4vI/AAAAAAAAAB0/MYPTRYgT6-k/s400/20080910_104912.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5247098933369103090" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_trZeScPDm6Q/SNFwrualiNI/AAAAAAAAAB8/z1zQijYVsAs/s1600-h/20080910_105022.jpg"&gt;&lt;img src="http://3.bp.blogspot.com/_trZeScPDm6Q/SNFwrualiNI/AAAAAAAAAB8/z1zQijYVsAs/s400/20080910_105022.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5247098937359567058" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_trZeScPDm6Q/SNFwr6V7v3I/AAAAAAAAACE/YsDRJuINg4A/s1600-h/20080910_105041.jpg"&gt;&lt;img src="http://2.bp.blogspot.com/_trZeScPDm6Q/SNFwr6V7v3I/AAAAAAAAACE/YsDRJuINg4A/s400/20080910_105041.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5247098940561276786" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_trZeScPDm6Q/SNFwsPQTLwI/AAAAAAAAACM/W5UK--x-YSo/s1600-h/20080910_105105.jpg"&gt;&lt;img src="http://3.bp.blogspot.com/_trZeScPDm6Q/SNFwsPQTLwI/AAAAAAAAACM/W5UK--x-YSo/s400/20080910_105105.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5247098946174791426" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_trZeScPDm6Q/SNFwsgioypI/AAAAAAAAACU/cEGJVI4CbBY/s1600-h/20080914_133532.jpg"&gt;&lt;img src="http://2.bp.blogspot.com/_trZeScPDm6Q/SNFwsgioypI/AAAAAAAAACU/cEGJVI4CbBY/s400/20080914_133532.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5247098950815107730" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/355411830490069516-4372377185495077286?l=wdaehn.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/355411830490069516/posts/default/4372377185495077286'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/355411830490069516/posts/default/4372377185495077286'/><link rel='alternate' type='text/html' href='http://wdaehn.blogspot.com/2008/09/motorized-tripod-with-gps.html' title='Motorized Tripod with GPS'/><author><name>wdaehn</name><uri>http://www.blogger.com/profile/11792883669228965857</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='13986123866228273391'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_trZeScPDm6Q/SNFwrfjL4vI/AAAAAAAAAB0/MYPTRYgT6-k/s72-c/20080910_104912.jpg' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-355411830490069516.post-4574931654524955999</id><published>2008-09-16T13:59:00.000-07:00</published><updated>2008-09-16T14:23:12.134-07:00</updated><title type='text'>Lego Mindstorms NXT and Power Functions</title><content type='html'>Lego recently came out with the &lt;a href="http://technic.lego.com/en-US/powerfunctions/default.aspx"&gt;Power Functions system&lt;/a&gt;, strong and yet small enough motors to be used nicely. You can even remote control them given you bought their IR receiver. But to connect them to Mindstorms NXT robotic system, nothing is available yet. The suggestion is to create IR signals with the NXT device to control them!?!?&lt;br /&gt;&lt;br /&gt;The power functions connector cable is very simple, there is GND and +V on one end each and the middle two cables are used to control the motors. If there is a voltage difference of +9V it rotates at full speed in one direction, -9V the other direction and everything inbetween controls the speed. Like in any other simple motor.&lt;br /&gt;&lt;br /&gt;So what we need is a standard H-drive for any analog motors, I picked the one from &lt;a href="http://www.mindsensors.com/index.php?module=pagemaster&amp;PAGE_user_op=view_page&amp;PAGE_id=58"&gt;mindsensors.com&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.mindsensors.com/images/pagemaster/MTRMXNx.gif"&gt;&lt;img src="http://www.mindsensors.com/images/pagemaster/MTRMXNx.gif" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Originally designed to connect RCX motors to it, it has two small soldering holes at each of the four motor drives. From the official lego web shop I bought some more spare power function cables, cut them in half and soldered them to the motor ports. And one cable is connected to the battery box.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_trZeScPDm6Q/SNAjHEJxlZI/AAAAAAAAABs/bjeFR3rJY5A/s1600-h/IMGP0356.JPG"&gt;&lt;img src="http://4.bp.blogspot.com/_trZeScPDm6Q/SNAjHEJxlZI/AAAAAAAAABs/bjeFR3rJY5A/s400/IMGP0356.JPG" border="0" alt="" id="BLOGGER_PHOTO_ID_5246732170167424402" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;As the device was designed to drive motors, the NXT-G building block is just perfect. You specify the rotation direction and speed - that's it. Works very well.&lt;br /&gt;And yes, I did not connect the reference voltage so I cannot daisy-chain components. Why would I want to?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/355411830490069516-4574931654524955999?l=wdaehn.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/355411830490069516/posts/default/4574931654524955999'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/355411830490069516/posts/default/4574931654524955999'/><link rel='alternate' type='text/html' href='http://wdaehn.blogspot.com/2008/09/lego-mindstorms-nxt-and-power-functions.html' title='Lego Mindstorms NXT and Power Functions'/><author><name>wdaehn</name><uri>http://www.blogger.com/profile/11792883669228965857</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='13986123866228273391'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_trZeScPDm6Q/SNAjHEJxlZI/AAAAAAAAABs/bjeFR3rJY5A/s72-c/IMGP0356.JPG' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-355411830490069516.post-6845043100181960538</id><published>2008-09-16T09:29:00.001-07:00</published><updated>2008-09-16T13:58:40.842-07:00</updated><title type='text'>Update: Nikon D300 and bluetooth</title><content type='html'>Still very happy with the GPS solution, still sticking to the original GPS receiver. The XAiOX iTrackU did work  as well, but did not provide the advantages I was hoping for. I thought I will be notified when the battery is low and yes, it does. With a loud and scratching voice. You can turn down the volume but just in three steps and it is still very loud. So I returned it.&lt;br /&gt;&lt;br /&gt;For the summer holidays at the windy beach of &lt;a href="http://www.rene-egli.com/"&gt;Fuerteventura&lt;/a&gt; I installed a 18mm O-ring seal you can get at any DiY shop. The Mini-USB connector I sealed with an adhesive tape, on the image you see a white one.&lt;br /&gt;&lt;br /&gt;In the first image you see the bluetooth adapter mounted...&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_trZeScPDm6Q/SNAbzikKUHI/AAAAAAAAABU/GyZw7q63sJo/s1600-h/IMGP0351.JPG"&gt;&lt;img src="http://3.bp.blogspot.com/_trZeScPDm6Q/SNAbzikKUHI/AAAAAAAAABU/GyZw7q63sJo/s400/IMGP0351.JPG" border="0" alt="" id="BLOGGER_PHOTO_ID_5246724138152382578" /&gt;&lt;br /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Second image shows the backside of the adapter with the O-ring seal...&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_trZeScPDm6Q/SNAbz4hdySI/AAAAAAAAABc/1D6o3H51mEE/s1600-h/IMGP0352.JPG"&gt;&lt;img src="http://3.bp.blogspot.com/_trZeScPDm6Q/SNAbz4hdySI/AAAAAAAAABc/1D6o3H51mEE/s400/IMGP0352.JPG" border="0" alt="" id="BLOGGER_PHOTO_ID_5246724144046655778" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;And from a different perspective&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_trZeScPDm6Q/SNAb0UmpsPI/AAAAAAAAABk/MbMoWV7udp8/s1600-h/IMGP0354.JPG"&gt;&lt;img src="http://1.bp.blogspot.com/_trZeScPDm6Q/SNAb0UmpsPI/AAAAAAAAABk/MbMoWV7udp8/s400/IMGP0354.JPG" border="0" alt="" id="BLOGGER_PHOTO_ID_5246724151584600306" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/355411830490069516-6845043100181960538?l=wdaehn.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/355411830490069516/posts/default/6845043100181960538'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/355411830490069516/posts/default/6845043100181960538'/><link rel='alternate' type='text/html' href='http://wdaehn.blogspot.com/2008/09/update-nikon-d300-and-bluetooth.html' title='Update: Nikon D300 and bluetooth'/><author><name>wdaehn</name><uri>http://www.blogger.com/profile/11792883669228965857</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='13986123866228273391'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_trZeScPDm6Q/SNAbzikKUHI/AAAAAAAAABU/GyZw7q63sJo/s72-c/IMGP0351.JPG' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-355411830490069516.post-6953808538486160200</id><published>2008-04-28T07:46:00.000-07:00</published><updated>2008-04-29T04:07:43.708-07:00</updated><title type='text'>Nikon D300 Bluetooth GPS</title><content type='html'>&lt;p&gt;After thinking about it for a longer time I finally decided to try GPS together with the D300. A cable based solution was out of the question. Not only would it be bulky to use but the choice of GPS devices with serial connectivity is very limited too. By far the most GPS receivers use bluetooth and the others USB connections. Today I am aware of two bluetooth solutions for the Nikon. One is the &lt;a href="https://ecommerce.redhensystems.com/pc-47-2-blue2can.aspx"&gt;blue2can&lt;/a&gt;, a device built by a professional company with support and the like, the other is this: &lt;a href="http://www.foolography.com/"&gt;Foolography Unleashed&lt;/a&gt; built by a one-person company, the one I settled for.&lt;/p&gt;&lt;a href="http://2.bp.blogspot.com/_trZeScPDm6Q/SBYugh-f01I/AAAAAAAAAAM/AMHCU5mOSx8/s1600-h/IMGP0240.jpg"&gt;&lt;/a&gt;&lt;a href="http://4.bp.blogspot.com/_trZeScPDm6Q/SBY41B-f04I/AAAAAAAAAAk/G5gGhNp9y_c/s1600-h/IMGP0240.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5194401703933236098" style="CURSOR: hand" alt="" src="http://4.bp.blogspot.com/_trZeScPDm6Q/SBY41B-f04I/AAAAAAAAAAk/G5gGhNp9y_c/s400/IMGP0240.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;span style="font-size:130%;"&gt;Let me first introduce how all of that works before going into the details.&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;The Unleashed module comes with a special usb-to-serial cable which is used to program it. As usual the first thing is to install the device driver - done in a minute - then you plugin the cable to the computer, the installed drivers will be recongnized and you end up with an additional com port. Now you plug in the Unleashed module to the other end of the cable and start the Unleashed configuration program to search for all available Bluetooth devices and pair it with the GPS device. Once this step is done, you unplug the module and insert it to the 10 pin port of the camera. Turn on the camera, and two seconds later the GPS symbol is shown telling that a GPS device was found and is sending correct positional data.&lt;/p&gt;&lt;a href="http://2.bp.blogspot.com/_trZeScPDm6Q/SBYu8h-f02I/AAAAAAAAAAU/cVzIQ0zN8JA/s1600-h/IMGP0235.jpg"&gt;&lt;/a&gt;&lt;a href="http://3.bp.blogspot.com/_trZeScPDm6Q/SBY0Sx-f03I/AAAAAAAAAAc/VMLV4SsM7BE/s1600-h/gps.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5194396717476205426" style="CURSOR: hand" alt="" src="http://3.bp.blogspot.com/_trZeScPDm6Q/SBY0Sx-f03I/AAAAAAAAAAc/VMLV4SsM7BE/s400/gps.JPG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;This ease of use is really something that I was amazed a lot. I expected that ... I don't know, you have to turn on the GPS receiver first and then the camera or nonsense like that. Or that it takes a minute until the camera is ready. Nothing like that!&lt;br /&gt;The next step was to go to the GPS menu of the camera and tell it to enable the "auto meter off". When you click on AF-S or press the shutter halfway, the 10 pin port gets power, and....if you don't give the GPS unit its five seconds to connect, you will get a picture but without the GPS coordinates. To prevent that, this menu item keeps the exposure meter "On" all the time the camera is turned on and(!) a GPS unit is connected. The second menu item is to view the live GPS coordinates the camera receives. So I was able to see I am 50° North, 0° 23' E and 60m high. Excuse me? 0° 23' East? Very unlikely. By connecting the GPS mouse to the computer and running an excellent tool called GPSDiag (e.g. &lt;a href="http://www.download.com/GPSDiag/3000-2130_4-10055902.html"&gt;found here&lt;/a&gt;) I could validate that the GPS receiver is working fine and tells we are 007°. Just to make sure, the degrees are wrong, not the minutes &amp;amp; seconds! It was when I started to add pictures to google maps and wanted to correct them manually that I figured, the problem was with viewing the GPS coordinates. The values inside the EXIF GPS fields have been correct anyway! Oh dear. I could even see from which position of the tennis court the picture was taken! I would give it an accurancy of about 2 meters? Reporting this problem to Foolography we had been able to confirm that this bug in the D300 View GPS Coordinates screen is common to all GPS receivers, it was just overlooked by now. So don't get scared if the coords are off, it is just the viewing. The one place where it really matters are the EXIF fields and there all is in order. Nevertheless I have reported the bug to Nikon.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;What is particularily neat about the Skytraq100+ GPS receiver is its power management. If you turn off the camera (the bluetooth connection), it will go into a standby mode five minutes later. Turn on the camera again and it will take 5 seconds until the camera is connected to the GPS receiver, and then another n-seconds until it receives a valid GPS position - the TimeToFirstFix (short TTFF) which is between 1 second and 10 seconds from what I have seen. Depends on your GPS receiver obviously but all modern ones should be similar.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;span style="font-size:130%;"&gt;Why spend that much money? Doesn't a GPS Logger do the same job?&lt;/span&gt;&lt;/p&gt;&lt;p&gt;GPS Loogers are devices that contiously record the current position in memory and later you can read that file(s) and given the timestamp of the GPS signal and the time value the camera stored in the EXIF and some software you can merge the two pieces into a geotagged jpeg. Those GPS loggers are cheap, they record the position either every n seconds or whenever moved a certain distance. They have enough memory to store a lot of records and the software that merges the information is supposed to be easy to use too. It is the handling and the numerous things that could go wrong. You plugin the logger and download the location files via some software. Then you disconnect, connect the camera, download its images. Then you start the software to merge the two. You won't see if the GPS logger stopped working for whatever reason, whereas at the camera display you will look whenever you turn it on. The camera time might be off a few seconds or even a minute (or an hour because of daylight saving time?) and you will have no chance to correct that, whereas the bluetooth solution has all at once, it even shows the camera time plus the GPS time with atomic clock precision in the EXIF data.&lt;/p&gt;&lt;p&gt;When I put all that together, how many hours of manual work it will take to sync that data over the months and years, and assign labor "costs" to that, I'd say the bluetooth solution is cheaper. Might not be worth it but cheaper.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;span style="font-size:130%;"&gt;What are the differences between the two bluetooth products?&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Bluetooth supports multiple pairing methods, methods to make sure that e.g. your headphone doesn't suddenly receive somebody else's calls. The Blue2Can device pairs with the next available bluetooth device supporting the SPP (serial line protocol) which very likely will be a GPS unit. Of course you could say that "stealing" the coordinates information from somebody else's GPS unit who is 10m away is no big deal. But now imagine that GPS device you are connected is moving out of range. You end up with no GPS data until you turn off the camera and turn it on again. Not too nice, is it? Another issue could be, you connect to the GPS receiver but it is used by some other computer, e.g. your handheld is using one GPS mouse, the camera is supposed to use the other. You cannot control which device the camera connects to and if it is the used one, the bluetooth error "cannot open serial port" is returned as it is used by the other device already. And that's it - no GPS data. No reconnect. Just no data and no clue why.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;With the Unleashed module the GPS device is really bound to it. Yes, you can choose the other connection mode also but why would you? And this was really the key reason for myself - less troubles. Just turn on the camera and you are ready.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;The concern I had however was, can you trust a one man shop? What if the programming cable has no driver for Longhorn or whatever operating system I will use in five years? Or the configuration software? Actually, the Unleashed module is using components from well established companies, just tied those together and made it work. So both software components will likely have full support, more support than a small company somewhere. The downside of this approach are higher costs. That bluetooth to serial converter used is likely this one &lt;a href="http://www.sena.com/products/industrial_bluetooth/esd.php"&gt;http://www.sena.com/products/industrial_bluetooth/esd.php&lt;/a&gt; and it costs 50EUR already. Add the programming cable, the housing etc and just the material costs get to 150EUR or more I guess. So the price is okay, I'd say. And both products cost about the same anyway.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;span style="font-size:130%;"&gt;Usability&lt;/span&gt;&lt;/p&gt;&lt;p&gt;One concern raised often is the battery drain caused by the bluetooth plug. I do not want to argue that it does not consume much according to the specs, I rather say: First, if you turn off the camera the module gets disconnected from power and hence does not change anything from before. And second, the battery of the camera still lasts for four to five days usage. Actually, I can't see any difference compared to before.&lt;/p&gt;&lt;p&gt;The other thing I have read was the question how tight the plug sits. The camera would have a screw thread, but the Unleashed module does not. It just plugs in. And frankly, I would have no idea how to use the screw thread given the small dimensions of the device. It sits tight, it cannot fall off by itself, it is well protected by the camera body so no way it can dangle itself and get ripped off. And still you can unplug it with some force but without the fear of breaking something. So in that respect it is really well balanced.&lt;/p&gt;&lt;p&gt;And before I forget, the flash popup button is fully accessible, its control button below good enough. Given I never changed the flash setting via this lower button I wouldn't even care.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;span style="font-size:130%;"&gt;Wishlist&lt;/span&gt;&lt;/p&gt;&lt;p&gt;It seems to be sort of a personal thing, maybe my German attitude, but everything should be made perfect. No matter what it costs, no matter if there is not even reasoning behind. It is just a philosophy. Same thing with the Unleashed module - I would love to see it getting perfect. The one thing I can certainly not live with is, the camera is no longer resistant to spray water. Geotagging just sounds like synonym to exposing the camera to not-so-good weather. The plug body itself is sealed, however it has the mini-USB and the remote shutter connectors open, what makes it worse they are on the upper side. Fixing that is simple, in worst case an adhesive tape will do the trick. Or I find some plastic pieces from other devices to seal them. But the 10-pin connector to the camera is exposed. I will put some gasket around, the module will create enough pressure on to seal it without sliding slowly out over the time I am sure.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;And then there are more features one can think of. I considered if having the compass heading would be important to me. Not the GPS heading which is generated by the direction the GPS receiver was being moved but the real magnetic compass heading. There are a few GPS receivers out there, one I found neat is the &lt;a href="http://www.wintec.com.tw/en/product_detail.php?pro_id=78%20style="&gt;Wintec WSG-1000&lt;/a&gt; (note, no SIRF III chip so if it works or not is unknown at the time!). But thinking about it, the heading only makes sense if the GPS receiver points into the same direction as the camera does. But that forfeits the entire idea of putting the GPS in the pocket and never look at it. So I had to say, given that restriction, what good for is the compass heading then? On the other hand, if the Unleashed module would have a magnetic sensor and mix its information into the GPS stream of data,......yeah, yeah, just dreaming. Sounds like a hell of development work, might get jammed by the camera electronics anyway and for this feature I would not spend a lot of money. But...dreaming...making something perfect.... But actually, who cares.&lt;/p&gt;&lt;p&gt;The other thing is the remote shutter. You have something that connects to the pins that operate the remote shutter, that thing has a wireless connection, so, can't that be used then? Would be kind of cool to open an application on the cell phone and operate the shutter from there, wouldn't it? I am not particularily sure it would make a lot of sense, certainly not for my needs but, well, you guessed it probably, ...making things perfect...philosophy...just for the sake of it. Development wise again I would guess it is rather difficult. The chip used right now is a serial to bluetooth converter. It will not support two bluetooth devices at the same time so you would need to build the bluetooth converter yourself, add some microcontroller, the module would probably grow in dimensions and price. Or we build a GPS unit with a release button, but then the advantage of using any new GPS module is gone.&lt;/p&gt;&lt;p&gt;Both features would be nice to have but for me, no thank you, not worth any additional costs.&lt;/p&gt;&lt;p&gt;Right now I am absolutely happy with the money spent, next thing I will look at is the &lt;a href="http://www.xaiox.com/itracku_sirf3.htm"&gt;XAiOX iTrackU DATALOGGER SiRF III&lt;/a&gt;. And hopefully even the GPS display on the camera will be perfect soon.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/355411830490069516-6953808538486160200?l=wdaehn.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/355411830490069516/posts/default/6953808538486160200'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/355411830490069516/posts/default/6953808538486160200'/><link rel='alternate' type='text/html' href='http://wdaehn.blogspot.com/2008/04/after-thinking-about-it-for-longer-time.html' title='Nikon D300 Bluetooth GPS'/><author><name>wdaehn</name><uri>http://www.blogger.com/profile/11792883669228965857</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='13986123866228273391'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_trZeScPDm6Q/SBY41B-f04I/AAAAAAAAAAk/G5gGhNp9y_c/s72-c/IMGP0240.jpg' height='72' width='72'/></entry></feed>