Schematics
GPS data logger code:
;------------------------------------------------- 12.05.2006 ;------------------------------------------------------------ ; configure programmer list p=16f628;f=inhx8m __CONFIG _PWRTE_ON & _WDT_OFF & _XT_OSC & _BODEN_OFF & _LVP_OFF & _CP_OFF & _MCLRE_OFF ;------------------------------------------------------------ ; www.bertys.ro ;------------------------------------------------------------ org 0x00 goto init org 0x04 ;------------------------------------------------------------ #INCLUDE P16F628.INC ;------------------------------------------------------------ ; cpu init cblock 0x20 ; Beginn General Purpose-Register ;------------------------------------------------------------ count1 count2 count3 count4 count5 ;-------------------------- registrii transfer transo transl ranso ransl ;-------------------------- registrii date rmc orah oral minh minl fix lat1 lat2 lat3 lat4 lat5 lat6 lat7 lat8 log1 log2 log3 log4 log5 log6 log7 log8 c_hi c_lo ;------------------------------------------------------------ endc ;------------------------------------------------------------ #DEFINE en PORTB,4 #DEFINE rw PORTB,5 #DEFINE rs PORTB,6 #DEFINE rsrx PORTA,3 #DEFINE spi_sda PORTA,0 #DEFINE spi_clk PORTA,1 #DEFINE spi_cs PORTA,2 #DEFINE spi_so PORTA,4 #DEFINE rset PORTA,5 ;------------------------------------------------------------ ;------------------------------------------------------------ org 0x00 ; goto init org 0x04 ;------------------------------------------------------------ init clrf PORTA clrf PORTB movlw 0x07 ; Turn comparators off and enable pins for I/O movwf CMCON bcf STATUS,RP1 bsf STATUS,RP0 ; switch to bank 1 movlw 0xF8 movwf TRISA clrf TRISB bcf STATUS,RP0 ; switch back to bank 0 movlw 0x0F movwf count5 ;*************************************************** start call haltd movlw 0x02 call lcdcmd call haltd ; movlw 0x02 call lcdcmd movlw 0x08 call lcdcmd call haltd ; movlw 0x00 call lcdcmd movlw 0x0C call lcdcmd call haltd ; movlw 0x00 call lcdcmd movlw 0x01 call lcdcmd call haltd ; call linia1 btfsc rset call adr_reset call read_adr ;-------------------------- asteapta $GPRMC homa call ser_rx sublw 0x24 btfss STATUS,Z goto homa call ser_rx sublw 0x47 btfss STATUS,Z goto homa call ser_rx sublw 0x50 btfss STATUS,Z goto homa call ser_rx sublw 0x52 btfss STATUS,Z goto homa call ser_rx sublw 0x4D btfss STATUS,Z goto homa call ser_rx sublw 0x43 btfss STATUS,Z goto homa ;-------------------------- asteapta virgula si timp call wartv call ser_rx movwf orah call ser_rx movwf oral call ser_rx movwf minh call ser_rx movwf minl ;-------------------------- asteapta virgula si validare sateliti call wartv call ser_rx movwf fix ;-------------------------- asteapta virgula si latitudine call wartv call ser_rx movwf lat1 call ser_rx movwf lat2 call ser_rx movwf lat3 call ser_rx movwf lat4 call ser_rx call ser_rx movwf lat5 call ser_rx movwf lat6 call ser_rx movwf lat7 call ser_rx movwf lat8 ;-------------------------- asteapta virgula si longitudine call wartv call ser_rx call wartv call ser_rx call ser_rx movwf log1 call ser_rx movwf log2 call ser_rx movwf log3 call ser_rx movwf log4 call ser_rx call ser_rx movwf log5 call ser_rx movwf log6 call ser_rx movwf log7 call ser_rx movwf log8 ;-------------------------- afiseaza movf orah,W call scrie movf oral,W call scrie movlw 0x3A call scrie movf minh,W call scrie movf minl,W call scrie movlw 0x20 call scrie movlw 0x20 call scrie movlw 0x20 call scrie movf fix,W call scrie call linia2 ; linia2 movf lat1,W call scrie movf lat2,W call scrie movf lat3,W call scrie movf lat4,W call scrie movlw 0x2E call scrie movf lat5,W call scrie movf lat6,W call scrie movf lat7,W call scrie movf lat8,W call scrie movlw 0x20 call scrie movlw 0x4E call scrie call linia3 ; linia3 movf log1,W call scrie movf log2,W call scrie movf log3,W call scrie movf log4,W call scrie movlw 0x2E call scrie movf log5,W call scrie movf log6,W call scrie movf log7,W call scrie movf log8,W call scrie movlw 0x20 call scrie movlw 0x45 call scrie call linia4 ; linia4 ;-------------------------- verifica punct fix movf fix,W sublw 0x41 btfss STATUS,Z goto no_memory ;-------------------------- delay 1' decfsz count5,F goto no_memory ;--------------------------------------- call vren ; enable write to spi ram bcf spi_clk bcf spi_cs ; spi write movlw 0x02 call send_spi movf c_hi,W call send_spi movf c_lo,W call send_spi movf orah,W call send_spi movf oral,W call send_spi movlw 0x3A call send_spi movf minh,W call send_spi movf minl,W call send_spi movlw 0x20 call send_spi movf lat1,W call send_spi movf lat2,W call send_spi movf lat3,W call send_spi movf lat4,W call send_spi movlw 0x2E call send_spi movf lat5,W call send_spi movf lat6,W call send_spi movf lat7,W call send_spi movf lat8,W call send_spi movlw 0x20 call send_spi movlw 0x4E call send_spi movf log1,W call send_spi movf log2,W call send_spi movf log3,W call send_spi movf log4,W call send_spi movlw 0x2E call send_spi movf log5,W call send_spi movf log6,W call send_spi movf log7,W call send_spi movf log8,W call send_spi movlw 0x20 call send_spi movlw 0x45 call send_spi bsf spi_cs ;--------------------------------------- adress increment movf c_lo,W sublw 0xE3 btfss STATUS,C incf c_hi,F movlw 0x1C addwf c_lo,F ;------------------------------------------- write last adress call vren ; enable write to spi ram bcf spi_clk bcf spi_cs ; spi write adress movlw 0x02 call send_spi movlw 0x7F call send_spi movlw 0xF0 call send_spi movf c_hi,W call send_spi movf c_lo,W call send_spi bsf spi_cs ;------------------------------------------- delay 1' movlw 0x18 movwf count5 ;--------------------------------------- display current adress no_memory movf c_hi,W call schr movf c_lo,W call schr call pause call linia1 ; linia1 ;*************************************************** goto homa ;*************************************************** scrie movwf transo andlw 0x0F movwf transl rrf transo,F rrf transo,F rrf transo,F rrf transo,W andlw 0x0F call lcddta movf transl,W call lcddta return ;*************************************************** schr movwf ranso andlw 0x0F movwf ransl rrf ranso,F rrf ranso,F rrf ranso,F rrf ranso,W andlw 0x0F movwf ranso movlw 0x0A subwf ranso,W btfsc STATUS,C goto op1 movlw 0x30 goto op2 op1 movlw 0x37 op2 addwf ranso,W call scrie movlw 0x0A subwf ransl,W btfsc STATUS,C goto op3 movlw 0x30 goto op4 op3 movlw 0x37 op4 addwf ransl,W call scrie return ;*************************************************** ;-------------------------- asteapta virgula wartv call ser_rx sublw 0x2C btfss STATUS,Z goto wartv return ;*************************************************** linia1 movlw 0x08 call lcdcmd movlw 0x02 call lcdcmd return ;*************************************************** linia2 movlw 0x08 call lcdcmd movlw 0x0C call lcdcmd return ;*************************************************** linia3 movlw 0x0C call lcdcmd movlw 0x00 call lcdcmd return ;*************************************************** linia4 movlw 0x0C call lcdcmd movlw 0x0C call lcdcmd return ;*************************************************** lcdcmd bcf rw nop bcf rs nop movwf PORTB nop bsf en nop nop bcf en call haltd return ;*************************************************** lcddta bcf rw nop bsf rs nop addlw 0x40 movwf PORTB nop bsf en nop nop bcf en call haltd return ;********************************************************************** ; Subrutine protocol serial ;********************************************************************** ;-------------------------- citeste seriala si stocheaza in W ser_rx clrf transo wart1 btfsc rsrx goto wart1 call haltb ; asteapta 101 us .5*Bst movlw 0x08 movwf count4 wdh2 call halta ; asteapta 202 us bcf STATUS,C btfsc rsrx bsf STATUS,C rrf transo,F decfsz count4,F goto wdh2 call halta ; asteapta 202 us 1*Bsp movf transo,W return ;-------------------------- ramtron fram spi send_spi movwf transo movlw 0x08 movwf count4 txbit bcf spi_clk btfss transo,7 ;bit0 bcf spi_sda btfsc transo,7 ;bit0 bsf spi_sda nop bsf spi_clk rlf transo,F decfsz count4,F goto txbit bcf spi_clk return ;-------------------------- vren bcf spi_clk bcf spi_cs movlw 0x06 call send_spi bsf spi_cs return ;-------------------------- rx_spi movlw 0x08 movwf count1 sbit bcf spi_clk bcf STATUS,C btfsc spi_so bsf STATUS,C rlf transo,F bsf spi_clk decfsz count1,F goto sbit movf transo,W return ;-------------------------- adr_reset call vren bcf spi_clk bcf spi_cs ; spi write adress movlw 0x02 call send_spi movlw 0x7F call send_spi movlw 0xF0 call send_spi movlw 0x00 call send_spi movlw 0x00 call send_spi bsf spi_cs return ;-------------------------- read_adr bcf spi_clk bcf spi_cs ; spi write adress movlw 0x03 call send_spi movlw 0x7F call send_spi movlw 0xF0 call send_spi call rx_spi ;read data movwf c_hi call rx_spi movwf c_lo bsf spi_cs return ;************************************************************************ ; Subrutine de intarziere * ;************************************************************************ ;********************************************************************** halta movlw 0x43 ; 207us movwf count1 q0 decfsz count1,F goto q0 nop retlw 0x00 ;______________________________________________________________________ haltb movlw 0x20 ; 101us movwf count1 q1 decfsz count1,F goto q1 retlw 0x00 ;________________________________________________________________________ haltd movlw 0xFA movwf count2 r2 nop nop nop nop nop nop nop nop nop nop nop nop nop nop decfsz count2,F goto r2 return ;________________________________________________________________________ pause movlw 0x10 ; cca. 4s hopa movwf count3 d3 movlw 0xFA movwf count1 d1 movlw 0xFA movwf count2 d2 nop decfsz count2,F goto d2 decfsz count1,F goto d1 decfsz count3,F goto d3 retlw 0x00 ;************************************************************************ ;------------------------------------------------------------ end ;============================================================Fram memory:Ramtron