There has been some interest in the Picaxe GPS NMEA-0183 Decoder which I use to time the keying of my wpsr beacon.
The Picaxe chip decodes the time data in the $GPGGA sentence from the GPS unit and then print the UTC time on the lcd display. In addition it set a output at the start of every even minute for keying the wspr beacon. That’s all it do with the current 18X chip.
I am planning an upgrade to the 18M2 chip which is a lot more powerful and has got more functions then the current 18X chip.
With the 18M2 I am planning to display some of the other GPS information, like position, signal strength, number of satellites, etc. It’s not that the 18X chip can’t do this extra information bit. But these task will put a lot more strain on processing and communication so I fear the accuracy of the keying will suffer.
 >> Download full size scheme <<
; ************************* Picaxe Project ************************
; *****************************************************************
; Filename: GPSDO Display unit v0.4.bas
; Date: 25.02.2012
; File Version: 0
; Written by: LA6TPA Geir Aarnes
; Function: Decode NMEA data from GPS unit
; Last Revision: 4
; Target PICAXE: 18X
; *****************************************************************
;
; Revision history
;
; Intitial code GPSDO Display unit v0.1.bas
; First working version GPSDO Display unit v0.2.bas
; WSPR trigger added GPSDO Display unit v0.3.bas
; Code cleanup GPSDO Display unit v0.4.bas
; *****************************************************************
#Picaxe 18X
SETFREQ m8
symbol GPS_RxD = 0 ;NMEA data from GPS module
symbol GPS_1PPS = pin7 ;1PPS signal from GPS
symbol GPS_TxD = B.0 ;NMEA data to GPS module
symbol WSPRtrig = B.1 ;Triger output for WSPR tx start
symbol tByte00 = b0 ;Byte for temorary data
symbol LcdByte1 = b1 ;Byte used by LCD routine
symbol LcdByte2 = b2 ;Byte used by LCD routine
symbol tByte03 = b3 ;Byte used by LCD routine
symbol tByte04 = b4 ;Byte for temorary data
gosub init ;initialise LCD
pause 10000 ;wait for GPS to boot
serout GPS_TxD,T4800_8,(13)
serout GPS_TxD,T4800_8,("$PRWIILOG,???,V,,,",13,10) ;turn off all GPS output
serout GPS_TxD,T4800_8,("$PRWIILOG,GGA,A,T,1,0",13,10) ;activate GGA sentence
let LcdByte1 = 1 ;set b1 to ‘clear display’ instruction
gosub wrins ;send instruction to LCD
main: serin GPS_RxD,T4800_8,("$GPGGA,"),B8,B9,B10,B11,B12,B13 ;wait for $GPGGA then receive 6 bytes into B8..B13
;debug
IF b13 <> "0" THEN GOTO LBL01 ;Check lower part of seconds, skip if not == 9
IF b12 <> "0" THEN GOTO LBL01 ;Check upper part of seconds, skip if not == 5
tByte00 = B11 - 48 ;Read lower part of minute and convert ASCII to binary
tByte00 = tByte00 & %00000001 ;Mask bit 0 which indicates an ODD minute
IF tByte00 <> 0 THEN GOTO LBL01
high WSPRtrig
pause 500
low WSPRtrig
LBL01: LcdByte1 = 1
gosub wrins
LcdByte1 = "U"
gosub wrchr
LcdByte1 = "T"
gosub wrchr
LcdByte1 = "C"
gosub wrchr
LcdByte1 = " "
gosub wrchr
LcdByte1 = b8
gosub wrchr
LcdByte1 = b9
gosub wrchr
LcdByte1 = ":"
gosub wrchr
LcdByte1 = b10
gosub wrchr
LcdByte1 = b11
gosub wrchr
LcdByte1 = ":"
gosub wrchr
LcdByte1 = b12
gosub wrchr
LcdByte1 = b13
gosub wrchr
goto main
init: let pins = 0 ;Clear all output lines
let b4 = 0 ;Reset variable b4
pause 200 ;Wait 200 ms for LCD to reset.
let pins = 48 ;Set to 8-bit operation.
pulsout 3,1 ;Send data by pulsing ‘enable’
pause 10 ;Wait 10 ms
pulsout 3,1 ;Send data again
pulsout 3,1 ;Send data again
let pins = 32 ;Set to 4-bit operation.
pulsout 3,1 ;Send data.
pulsout 3,1 ;Send data again.
let pins = 128 ;Set to two line operation
pulsout 3,1 ;Send data.
let b1 = 12 ;Screen on, cursor off instruction
gosub wrins ;Write instruction to LCD
return
wrchr: let pins = b1 & 240 ;Mask the high nibble of b1 into b2.
high 2 ;Make sure RS is high
pulsout 3,1 ;Pulse the enable pin to send data.
let b2 = b1 * 16 ;Put low nibble of b1 into b2.
let pins = b2 & 240 ;Mask the high nibble of b2
high 2 ;Make sure RS is high
pulsout 3,1 ;Pulse enable pin to send data.
return
wrins: let pins = b1 & 240 ;Mask the high nibble of b1 into b2.
pulsout 3,1 ;Pulse the enable pin to send data.
let b2 = b1 * 16 ;Put low nibble of b1 into b2.
let pins = b2 & 240 ;Mask the high nibble of b2
pulsout 3,1 ;Pulse enable pin to send data.
high 2 ;Back to character mode
return