;******************************************************************* ; NMEAPIC.ASM ; NMEA RECODE TEST DECODER FOR BOAT ;******************************************************************* ;CLK=16MHZ ; ;******************************************************************* ;PRIMARY TARGET:TO VERIFY&DECODE INCOMING DATA FROM NMEA PIC(S) ;AND DISPLAY IT SOME HOW LIST p=16F57 ; PIC16F57 is the target processor INDF EQU 0X00 TMR0 EQU 0X01 PCL EQU 0X02 STATUS EQU 0X03 FSR EQU 0X04 PORTA EQU 0X05 PORTB EQU 0X06 PORTC EQU 0X07 ROTBUF EQU 0X08 ;NMEA ROTATE BUFFER *ONLY* TIMER1 EQU 0X09 LEDBUF EQU 0X0A ;LEDBUFFER MPOINT EQU 0X0B ;MEMORY POINTER FOR DATA RX'D ROTCNT EQU 0X0C ;COUNT ROTATES SSTATUS EQU 0X0D ; TIMER0 EQU 0X0E ;CAN ALSO BE USED IN TEMP ROUTINES DPOINT EQU 0X0F ;MEMORY POINTER FOR DPSEND *ONLY* DCRC EQU 0X10 ;DASHPIC CRC OF ALL DATA SENT TEMP EQU 0X11 ; TIMER2 EQU 0X12 ; XXX EQU 0X13 ; ; ; **********************NO SLEEP FOR NOW!******************* ; MAY BE SET TO WAKE ON AND INPUT, BUT WILL WAIT FOR NEXT ; MAIN ROUTINE IS WAIT, THEN TRANSLATE, THEN SEND.... ; NMEAIN AND STARTBIT ARE SECONDARY ROUTINES ;Description: ;if SSTATUS,0 is clear. then first byte is read to decide if (GGA) ;data.(ENC byt01) if not then remaining data is read but not DISPLAYED ;waiting for code (&0D) which resets SS,0 ;...once SS,0 is set, the ENC search rout is bypassed ORG 07FF ;POWER UP NOP ORG 0000 START MOVLW B'00010001' OPTION MOVLW 0XF0 ;ALL INPUT PORTB RB5=DAT RB6=CLK, ADD PULL UPS!!! TRIS PORTB CLRF PORTB MOVLW B'11100001' ;RC1=MSB LED,0 RLF MUST PRECEDE TRIS PORTC ;ALL LED DATA CLRF PORTC MOVLW 0X0F ; TRIS PORTA ; CLRF SSTATUS ;0= MOVLW 0X10 ;BOTTOM ($30) RAM,TOP NIB RLF'D 1 FOR FSR MOVWF MPOINT ;GOES FROM = 0 TO 3F ($30-3F,50-5F,70-7F) ;ONCE FULL, STOPS('74 HAS MORE MEM) CLRF ROTCNT CALL DELAY1 ;STARTUP DELAY ;GOTO DONE MAIN ;THE LOOPS IN THE "REAL" CHIP(16F74) SHOULD HAVE TIMEOUTS ;-SO SHOULD THE MAINLP RX ROUTINE INCASE DOESN'T HAPPEN ;DUE TO AN NMEA SHUTDOWN( ALL OFF) SO '74 DOESN'T LOCK UP!! BTFSC PORTA,0 ;CLK IN, NORMALLY WILL SEND READY SIG ON DAT GOTO MAIN ;BUT MUST BE QUICK TO CAPT. DATA IN TEST! MOVLW .2 ;>1uS IS OK BUT WE'LL GO 3.5uS MOVWF TIMER0 ;5*2+4/4 MAINSB BTFSC PORTA,0 ;MUST STAY LOW FOR 10uS GOTO MAIN ;LESS THAN 10,ABORT DECFSZ TIMER0 GOTO MAINSB MAIN2 BTFSS PORTA,0 ;WAIT FOR "ACK RETURN"L-H GOTO MAIN2 ;HERE IS AT LEAST 14uS IN HIGH STATE BEFORE DATA ;SETUP BUFFERS ETC MAINLP ;WAITING FOR FIRST CLK H-L TRANSITION, ;CLK LO ONLY FOR 8 CYC!!! RLF ROTBUF MAINLP2 BTFSC PORTA,0 ;ACTIVE ON DOWN CLK GOTO MAINLP2 BTFSS PORTA,1 BCF ROTBUF,0 BTFSC PORTA,1 BSF ROTBUF,0 INCF ROTCNT BTFSS ROTCNT,3 ;8 BITS? GOTO MAINLP ;------------PROCESS IN<15uS!! CLRF ROTCNT BTFSC SSTATUS,2 ;LAST BYTE?SS,2 FLAG=LB(CRC) IS GOTO DONE ;IN ROTBUF BTFSC SSTATUS,0 ;FIRST BYTE FLAG GOTO CRCHECK ; IS END BSF SSTATUS,0 ;FIRST BYTE UNDERWAY MOVLW 0X01 ;IS GGA DATA?(GLL NOT IN DGPS...) XORWF ROTBUF,W BTFSC STATUS,2 ;MATCH? BSF SSTATUS,1 ;SS,1 FLAG=DISPLAY DATA AFTER CRCHECK MOVLW 0X0D ;? IF SO ONE MORE BYTE(CRC) XORWF ROTBUF,W BTFSC STATUS,2 ;SKIP NOT BSF SSTATUS,2 ;SS,2 FLAG=LAST BYTE NEXT SAVE ;SAVE DATA TO RAM BSF PORTB,0 ;+++++FIRST LED MOVF MPOINT,W ANDLW 0X0F MOVWF FSR BSF FSR,4 BTFSC MPOINT,4 BSF FSR,5 BTFSC MPOINT,5 BSF FSR,6 MOVF ROTBUF,W MOVWF INDF BCF FSR,5 BCF FSR,6 INCF MPOINT BTFSS MPOINT,6 GOTO MAINLP FULL ;STAY AT 7f BSF PORTB,1 ;++++++SECOND LED "full" DECF MPOINT GOTO MAINLP DONE BSF PORTB,2;+++++++++LED3: HAPPENED MOVLW 0X10 ;BOTTOM ($30) RAM,TOP NIB RLF'D 1 FOR FSR MOVWF MPOINT CLRF ROTCNT BCF SSTATUS,0 BCF SSTATUS,2 BTFSS SSTATUS,1 ;FLAG=SHOULD THIS DATA BE DISPLAYED? GOTO MAIN ;DON'T DISPLAY THIS, WAIT FOR NEXT DISPLAYIT ;DISPLAY TIME(utc) DATA(BEFORE DECIMAL) ;ALSO BEEP BUZZER IF DGPS IS ACTIVE INCF MPOINT ;SKIP ENC DATA DISPLP MOVF MPOINT,W ANDLW 0X0F MOVWF FSR BSF FSR,4 BTFSC MPOINT,4 BSF FSR,5 BTFSC MPOINT,5 BSF FSR,6 MOVF INDF,W MOVWF LEDBUF ;RAW DATA SO SUB 48 BCF FSR,5 BCF FSR,6 MOVLW .48 SUBWF LEDBUF ;ASCII48 = "0" RLF LEDBUF,W ; PORTC,1 IS D0 FOR 7447 LED DRIVEL MOVWF PORTC CALL DELAY1 MOVLW 0XFF MOVWF PORTC MOVLW .3 ;SPACE(BLANK) MOVWF TIMER2 CALL DELAY1B INCF MPOINT BTFSC MPOINT,6 GOTO DISDONE MOVLW 0X17 ;STOP BEFORE UTC'S DECIMAL XORWF MPOINT,W BTFSS STATUS,2 GOTO DISPLP DISDONE BCF SSTATUS,1 MOVLW 0X10 ;BOTTOM ($30) RAM,TOP NIB RLF'D 1 FOR FSR MOVWF MPOINT CALL DELAY1 CALL DELAY1 CALL DELAY1 GOTO MAIN DELAY1 ;1 SECOND(4 M CYC)(1.000000)SEC INCLUDING CALL&RETLW MOVLW .16 MOVWF TIMER2 DELAY1B MOVLW .59 MOVWF TIMER1 MOVLW .152 MOVWF TIMER0 DLLP1 ;4 CYC PER NOP DECFSZ TIMER0 GOTO DLLP1 DECFSZ TIMER1 GOTO DLLP1 DECFSZ TIMER2 GOTO DLLP1 NOP RETLW 0X00 END