' ========================================================================= ' ' File...... GPS_ALTITUDE.BS2 ' Purpose... Extracts altitude from NMEA0183 $GPGGA string ' Author.... Jon Williams ' E-mail.... jwilliams@parallax.com ' Started... ' Updated... 04 DEC 2003 ' ' {$STAMP BS2} ' {$PBASIC 2.5} ' ' ========================================================================= ' -----[ Program Description ]--------------------------------------------- ' ' $GPGGA,hhmmss.ss,ddmm.mmmm,n,dddmm.mmmm,e,q,ss,y.y,a.a,z,g.g,z,t.t,iii*CC ' | | | | | | | | | | | | | | | ' 0 1 2 3 4 5 6 ' 0123456789012345678901234567890123456789012345678901234567890123456789012 ' ' a.a = altitude in meters ' -----[ Revision History ]------------------------------------------------ ' -----[ I/O Definitions ]------------------------------------------------- GpsIn PIN 0 ' -----[ Constants ]------------------------------------------------------- #SELECT $STAMP #CASE BS2, BS2E, BS2PE T1200 CON 813 T2400 CON 396 T4800 CON 188 T9600 CON 84 T19K2 CON 32 T38K4 CON 6 #CASE BS2SX, BS2P T1200 CON 2063 T2400 CON 1021 T4800 CON 500 T9600 CON 240 T19K2 CON 110 T38K4 CON 45 #ENDSELECT Inverted CON $4000 Open CON $8000 Baud CON T4800 ' -----[ Variables ]------------------------------------------------------- gpsData VAR Byte(6) idx VAR Nib char VAR Byte altM VAR Word ' altitude in 0.1 meters ' -----[ EEPROM Data ]----------------------------------------------------- ' -----[ Initialization ]-------------------------------------------------- ' -----[ Program Code ]---------------------------------------------------- Main: DO ' get with tenths SERIN GpsIn, Baud, [WAIT("GPGGA,"), SKIP 40, WAIT(","), STR gpsData\6\","] GOSUB Text_To_Alt10 DEBUG HOME, DEC altM / 10, ".", DEC1 altM, " M", CLREOL, CR ' get only whole value SERIN GpsIn, Baud, [WAIT("GPGGA,"), SKIP 40, WAIT(","), DEC altM] DEBUG DEC altM, CLREOL LOOP END ' -----[ Subroutines ]----------------------------------------------------- ' Convert "xxxx.x" to tenths of meters value Text_To_Alt10: idx = 0 altM = 0 DO WHILE (idx < 6) char = gpsData(idx) IF (char = 0) THEN EXIT ' end of string? IF (char <> ".") THEN ' if not "." then digit altM = altM * 10 + (char - "0") ' shift and add digit ENDIF idx = idx + 1 ' point to next char LOOP RETURN