Then you can do some pretty cool stuff!
Like find the bearing to and distance to a lat-lon waypoint (solving for latitude adjustment of Longitude!)
Here is my ugly code. Needs to be cleaned up ... but it works for waypoints that are within 3.2000 degrees of eachother (200 miles or so). Angle still needs to be corrected depending which quadrant the waypoint lies.
Code:DEFINE __16F877A 1 ; list directive to define processor DEFINE OSC 20 ' Define Oscillator Speed DEFINE LOADER_USED 1 ' Shutdown comparators ADCON1 = 7 ; Turn of all A/D CMCON = 7 ' Set the port directions ' 0=output 1=input TRISA=%00000011 ' Set PORTA 0-1-3 used for AD TRISB=%11011100 ' Set PortB TRISC=%10000000 TRISD=%00000000 ' Set PortC USART RX as an input porta.2 = 0 porta.3 = 0 X_ var word Y_ var word Z_ var word X_H VAR byte X_L VAR byte Y_H VAR byte Y_L VAR byte Z_H VAR byte Z_L VAR byte X_TMP_H VAR byte X_TMP_L VAR byte Y_TMP_H VAR byte Y_TMP_L VAR byte ITERAT_TMP VAR byte ITERATION VAR byte Di VAR byte COSCH VAR byte COSCL VAR byte Counter1 VAR byte SHIFT VAR byte x var word y var word z var word i var word lon_dif var word lat_dif var word angle var word angle_deg var word distance var word j var word ;---------[change these to match your hardware]------------------------------ DEFINE LCD_DREG PORTD ; Set LCD Data port B C D DEFINE LCD_DBIT 0 ; Set starting Data bit (0 or 4) 4 0 DEFINE LCD_RSREG PORTA ; Set LCD Register Select port A A DEFINE LCD_RSBIT 3 ; Set LCD Register Select bit 3 2 DEFINE LCD_EREG PORTA ; Set LCD Enable port A A DEFINE LCD_EBIT 1 ; Set LCD Enable bit 1 5 DEFINE LCD_BITS 4 ; Set LCD bus size (4 or 8 bits) 4 4 DEFINE LCD_LINES 2 ; Set number of lines on LCD 2 2 '---------------------------------------------------------------------------- clear lcdout $FE,1 pause 500 lcdout $FE,1,"Test" ' to convert degrees to radians Z_ * 256 / 90 ' to convert radians to degrees Z_ * 90 / 256 Start: x = 0 y = 0 z = 37 'input current latitude 37.xxx for longitude correction (lon smaller at higher latitude) lat_dif = 11881 'difference between current position and waypoint in latitude 1.1881 deg lon_dif = 15816 'difference between current position and waypoint in longitude 1.5816 deg i = z * 256 / 90 'changes z to the right format +256 to -256 'each 1/3 degree should equal about 1 radian need to figure out how to get this accuracy...... if (z*256)//90 >= 45 then i = i +1 'if answer is .5 or more, go to next highest integer (round number) Z_ = i 'put result in Z_ Call sincos i = X_ * lon_dif ' X_ = cos(lat_current) lon_dif = div32 10000 ' get the value of lon_dif * the fraction for lon correction (reduces lon_dif) X_ = lon_dif 'load lon_dif into X_ , prepare for ATAN function Y_ = lat_dif 'load lat_dif into Y_ , prepare for ATAN function call atan 'perform ATAN assembly function angle = Z_ angle_deg = Z_ *90/256 'puts angle in degrees into the variable 'Below code computes distance between waypoints 'Z_ is already loaded with angle from above result call sincos i = lon_dif * 10000 'get lon_dif ready to divide by fraction distance = div32 X_ 'divide by cos(Z_)gives latitude distance in d.dddd or really ddddd distance = distance * 69 'get miles units distance = div32 100 'hundreths of miles xx.xx miles lcdout $FE,1,#distance lcdout $FE,$C0,#angle_deg 'not corrected for quadrant, ie. + 180, or + 90, etc. only bare triangle angle end '***********************************




Bookmarks