'****************************************************************
' *
' Filename: GPS_LED.bas *
' Date: 11/20/2008 *
' File Version: 0.01 *
' *
' Author: Peter Putnam *
' email: peter@ni6e.com *
' *
'****************************************************************
'
'This project decodes the RS-232 output from a GPS receiver, using
' a sofware UART, and determines if the fix is valid.
'
'If the GPS data is valid, denoted by the character "A" in string
' $GPRMC, position 14, the "OK Fix" pin is set high to illuminate
' a green LED.
'
'If the receiver is providing serial data, but has not yet declared
' it valid or if a valid fix changes to invalid, a yellow "No Fix"
' warning LED is illuminated.
'If the serial data stream is lost for more than two seconds, the
' watchdog timer resets the chip, setting the "No Data" pin to
' illuminate a red LED.
'
'Compiled with SourceBoost BASIC for the PIC 12F629 microprocessor.
'
' GPIO.5 (pin 2) is used as the serial data input.
' GPIO.0 (pin 7) is used as the "No Data" LED output pin.
' GPIO.1 (pin 6) is used as the "No Fix" LED output pin.
' GPIO.2 (pin 5) is used as the "OK Fix" LED output pin.
'
'****************************************************************
' *
' 12F629 *
' +---------+ *
' 1 | | 8 *
' +5.0 V ----+ +---- GND *
' 2 | | 7 *
' Serial In GP5 >---+ +---> GP0 "No Data" LED Out *
' 3 | | 6 *
' GP4 <---+ +---> GP1 "No Fix" LED Out *
' 4 | | 5 *
' GP3 >---+ +---> GP2 "OK Fix" LED Out *
' | | *
' +---------+ *
' *
'****************************************************************
'Connect the anodes of the LEDs through 1K ohm resistors. The
' cathodes go to ground.
'
'Use of an input inverter such as an MC1489 or MAX232 is required
' if true bipolar RS232 data is supplied.
'
' The simple inverter below provides that function.
'
'****************************************************************
' *
' | +5 VDC __ __ +5 *
' __ > | | *
' | | +V > 22K ohms |__| 0V *
' | |<- 0V > *
' __| |__ -V |--------> to GP5 (pin 2) *
' 10K ohms |/ c *
' RS232 From >-----^^^^--.----| *
' GPS RX | b |\ e 2N3904 or Generic NPN *
' |-->|--| | *
' | 1N914 | *
' | | *
' Gnd Gnd *
' *
' *
'****************************************************************
'
'
'
#pragma DATA 0x2007, _INTRC_OSC_NOCLKOUT & _WDT_ON & _MCLRE_OFF
#pragma CLOCK_FREQ 4000000
Sub main()
' 'Each PIC processor has a unique
' ' oscillator calibration byte.
' 'This routine retrieves that byte
' ' to assure 1% clock accuracy.
asm
{
call 0x3ff
movwf _osccal
}
dim i as byte 'Array pointer
dim v(15) as byte 'Data array
option_reg.7 = 0 'Enable Global Weak Pull-Ups
gpio = 00000001b 'Start with "No Data" Red LED on
cmcon = 0x07 'Set GPIO<2:0> to digital IO
trisio = 00101000b 'Set GPIO<5,3> as inputs
loop1:
v(0) = (call rs232_getch()) 'Take any character into array
' 'Clear watchdog timer, data is flowing
asm
{
clrwdt
}
if v(0) = 36 then 'Search for "$" at beginning of string
for i = 1 to 14 ' take next 14 characters if it is
v(i) = (call rs232_getch())
next i
else goto loop1 'Start over if first character is not "$"
end if
' ' Only "P" and "R" are tested
if v(2) = 80 and v(3)= 82 then 'If this string is "GPRMC" and if
if v (14) = 65 then ' array element 14 contains "A" the fix is valid
gpio = 00000100b ' for a valid fix, turn on the "OK Fix" Green LED
else gpio=00000010b ' for an invalid fix, turn on the "No Fix" Yellow LED
end if
else goto loop1 'Start over if string is not "GPRMC"
end if
goto loop1
End Sub