'****************************************************************** '* NearSys GPS Simulator V.2.2.5 * '* * '* Note: Define the mission by setting the first ten parameters * '* Six GPS sentences transmitted every second * '* Ascent rate after knee = 80% of initial ascent rate * '* Wind heading at 135 degrees, speed varies based on altitude * '* PIN0 determines when launch takes place * '* PIN1 determines status of GPS lock * '* GPS lock LED * '* Lock: LED = green * '* Lost of lock: LED = red * '* Launch LED * '* On the ground: LED = off * '* Ascent: LED = green * '* Descent: LED = red * '* Floating: LED blinks between red and green * '* Sentences transmitted are: GGA, GGL, GSA, GSV, RMC, VTG * '* GPZDA was dropped to keep sentence update to once per second * '* Current altitude is displayed over programming port at 9600 * '* LPV 18 June 2011 * '****************************************************************** '** Set these parameters for each simulation ** symbol StartHour = 14 ' hour (UTC) at beginning of simulation symbol Day = 13 ' day of the simulation symbol Month = 06 ' month of the simulation symbol Year = 11 ' last two digits of year of the simulation symbol LaunchAltitude = 290 ' altitude of launch site in meters - can't launch from higher than Mt. Everest symbol AscentRate = 1200 ' ascent rate in feet/minute symbol FloatAltitude = 35000 ' floating altitude of balloon, if burst 12500 then ' if altitude > 40,000 ft WorkByte = WorkByte * 8/10 ' adjust ft/s above 40,000 to 80% endif WorkWord = WorkWord + WorkByte ' update ascent altitude if WorkWord > FloatAltitude then ' if current altitude > float altitude Float = 1 ' now floating elseif WorkWord > BurstAltitude then ' if current altitude > burst altitude high 6 ' change launch LED to red low 7 ' change launch LED to red Descent = 1 ' set to descent phase Ascent = 0 ' set to descent phase endif else ' if in descending phase WorkByte = WorkWord/5500*3/2 ' calculate descent speed based altitude if WorkByte = 0 then WorkByte = 1 endif WorkByte = WorkByte * DescentRate/60*5/16 WorkWord = WorkWord - WorkByte ' update descent altitude if WorkWord < RecoveryAltitude then ' if below landing altitude WorkWord = RecoveryAltitude ' current altitude = recovery altitude Landed = 1 ' status is now landed Speed = 0 ' no horizontal speed low 6 ' turn off launch LED low 7 ' turn off launch LED endif endif GPSAlt1 = WorkWord/10000 ' change current altitude into individual digits WorkSpace = GPSAlt1 * 10 ' change current altitude into individual digits GPSAlt2 = WorkWord/1000 ' change current altitude into individual digits GPSAlt2 = GPSAlt2 - WorkSpace ' change current altitude into individual digits WorkSpace = WorkSpace + GPSAlt2 ' change current altitude into individual digits WorkSpace = WorkSpace * 10 ' change current altitude into individual digits GPSAlt3 = WorkWord/100 ' change current altitude into individual digits GPSAlt3 = GPSAlt3 - WorkSpace ' change current altitude into individual digits WorkSpace = WorkSpace + GPSAlt3 ' change current altitude into individual digits WorkSpace = WorkSpace * 10 ' change current altitude into individual digits GPSAlt4 = WorkWord/10 ' change current altitude into individual digits GPSAlt4 = GPSAlt4 - WorkSpace ' change current altitude into individual digits WorkSpace = WorkSpace + GPSAlt4 ' change current altitude into individual digits WorkSpace = WorkSpace * 10 ' change current altitude into individual digits GPSAlt5 = WorkWord - WorkSpace ' change current altitude into individual digits UpdateSpeed: if Landed = 1 then ' if on the ground Speed = 0 ' no speed goto CalcKMPH else ' if in the air if WorkWord < 9000 then ' and altitude > 9 km Speed = WorkWord/1000 ' calculate air speed (no wind < 1 km) else if WorkWord < 12000 then ' if current altitude between 9 km and 12 km WorkWord = WorkWord - 9000 ' calculate air speed between 9-12 km Speed = WorkWord/1000*9+9 ' calculate air speed between 9-12 km else if WorkWord < 15000 then ' calculate air speed between 12-15 km WorkWord = 15000 - WorkWord ' calculate air speed between 12-15 km Speed = WorkWord/1000*9+9 ' calculate air speed between 12-15 km else Speed = 6 ' air speed above 15km = 6 m/s endif endif endif endif UpdateLatLong: if Float = 1 then ' if floating toggle 6,7 ' then toggle launch LED endif WorkWord = GPSLatDecMin1*10 + GPSLatDecMin2*10 + GPSLatDecMin3*10 + GPSLatDecMin4 WorkByte = Speed * 6 ' calculate amount of change in lat/long if WorkWord > WorkByte then ' decrease in lat/long does not cause underflow WorkWord = WorkWord - WorkByte ' update decimal of lat/long else ' decrease in lat/long does cause overflow WorkWord = 9999 - WorkByte ' update decimal of lat/long GPSLatMin2 = GPSLatMin2 - 1 ' decrement decimal 2 of lat/long if GPSLatMin2 > 9 then ' was there an underflow of digit s? GPSLatMin2 = 9 ' make decimal 2 = 9 GPSLatMin1 = GPSLatMin1 - 1 ' decrement decimal 1 of lat/ong if GPSLatMin1 > 9 then ' was there an underflow of decimal 1? GPSLatMin1 = 9 ' make decimal 1 = 9 GPSLatDeg = GPSLatDeg - 1 ' decrement degrees of lat/long endif endif endif GPSLatDecMin1 = WorkWord/1000 ' change current decimal min into individual digits WorkSpace = GPSLatDecMin1 * 10 ' change current decimal min into individual digits GPSLatDecMin2 = WorkWord/100 ' change current decimal min into individual digits GPSLatDecMin2 = GPSLatDecMin2 - WorkSpace ' change current decimal min into individual digits WorkSpace = WorkSpace + GPSLatDecMin2 ' change current decimal min into individual digits WorkSpace = WorkSpace * 10 ' change current decimal min into individual digits GPSLatDecMin3 = WorkWord/10 ' change current decimal min into individual digits GPSLatDecMin3 = GPSLatDecMin3 - WorkSpace ' change current decimal min into individual digits WorkSpace = WorkSpace + GPSLatDecMin3 ' change current decimal min into individual digits WorkSpace = WorkSpace * 10 ' change current decimal min into individual digits GPSLatDecMin4 = WorkWord - WorkSpace ' change current decimal min into individual digits Speed = Speed * 2 ' convert speed to knots CalcKMPH: KMPH = Speed * 7/5 ' calculate km/hr from knots AddJitter: ' flucuation in altitude poke 28,GPSAlt5 ' store last digit of altitude random RandomAmount ' by a random amount GPSAlt5 = RandomAmount/7300 ' that's no larger than 9 DisplayGPS: if FIX = 3 then ' display sentences with GPS fic serout 1,baud,("$GPGGA,",#GPSHour,#GPSMinute1,#GPSMinute2,#GPSSecond1,#GPSSecond2,".00,3",#GPSLatDeg,#GPSLatMin1,#GPSLatMin2,".",#GPSLatDecMin1,#GPSLatDecMin2,#GPSLatDecMin3,#GPSLatDecMin4,",N,09",#GPSLatDeg,#GPSLatMin1,#GPSLatMin2,".",#GPSLatDecMin1,#GPSLatDecMin2,#GPSLatDecMin3,#GPSLatDecMin4,",",Hemisphere,",1,06,01.5,",#GPSAlt1,#GPSAlt2,#GPSAlt3,#GPSAlt4,#GPSAlt5,".0,M,0016.3,M,,*5C",CR,LF) serout 1,baud,("$GPGLL,3",#GPSLatDeg,#GPSLatMin1,#GPSLatMin2,".",#GPSLatDecMin1,#GPSLatDecMin2,#GPSLatDecMin3,#GPSLatDecMin4,",N,09",#GPSLatDeg,#GPSLatMin1,#GPSLatMin2,".",#GPSLatDecMin1,#GPSLatDecMin2,#GPSLatDecMin3,#GPSLatDecMin4,",W,1",#GPSHour,#GPSMinute1,#GPSMinute2,#GPSSecond1,#GPSSecond2,"00,A,A*65",CR,LF) serout 1,baud,("$GPGSA,A,3,1,2,3,4,5,6,1.8,1.5,1.6*07",CR,LF) serout 1,baud,("$GPGSV,0,0,06,26,50,016,40,09,50,173,39,21,43,316,38,17,41,144,42*7C",CR,LF) serout 1,baud,("$GPRMC,",#GPSHour,#GPSMinute1,#GPSMinute2,#GPSSecond1,#GPSSecond2,".00,A,3",#GPSLatDeg,#GPSLatMin1,#GPSLatMin2,".",#GPSLatDecMin1,#GPSLatDecMin2,#GPSLatDecMin3,#GPSLatDecMin4,",N,09",#GPSLatDeg,#GPSLatMin1,#GPSLatMin2,".",#GPSLatDecMin1,#GPSLatDecMin2,#GPSLatDecMin3,#GPSLatDecMin4,",",Hemisphere,",",#Speed,".0,140.0,",#Day,#Month,#Year,",005.0,W,A*22",CR,LF) serout 1,baud,("$GPVTG,135.0,T,140.0,M,",#SPEED,".0,N,",#KMPH,".0,K,A*1F",CR,LF) 'serout 1,baud,("$GPZDA,",#GPSHour,#GPSMinute1,#GPSMinute2,#GPSSecond1,#GPSSecond2,".00",Day,",",Month,",20",Year,",*6C",CR,LF) else ' display sentences without GPS fix serout 1,baud,("$GPGGA,000000.00,0000.0000,N,00000.0000,W,0,00,10.5,00000.0,M,0016.3,M,,*5C",CR,LF) serout 1,baud,("$GPGLL,3000.0000,N,00000.0000,W,1,000000.00,A,A*65",CR,LF) serout 1,baud,("$GPGSA,A,1,,,,,6*07",CR,LF) serout 1,baud,("$GPGSV,0,0,00,,,,,42*7C",CR,LF) serout 1,baud,("$GPRMC,000000.00,V,0000.0000,N,00000.0000,W,000.0,,,,,,W,N*22",CR,LF) serout 1,baud,("$GPVTG,135.0,T,140.0,M,000,N,000.0,K,A*1F",CR,LF) 'serout 1,baud,("$GPZDA,000000.00,,,,,,,*6C",CR,LF) endif sertxd ("Alt: ",#GPSAlt1,#GPSAlt2,#GPSAlt3,#GPSAlt4,#GPSAlt5, "m",CR,LF) ' this will slow down the GPS ~ 10% peek 28,GPSAlt5 ' replace true last digit next next next next next end