;******************************************************************* ; NMEAPIC.ASM ; PIC NMEA TO DASHPIC FOR BOAT ;******************************************************************* ;CLK=16MHZ ; ;******************************************************************* ;Sends NMEA DATA to Dashpic ;Timing is as follows ;Startbit Send 11 uS ;High after SB 9 uS ;clock low 1.2uS ;clock high 2.5 uS ;min high, byte clk end to next byte clk start 9.8 uS ;CLK active is on hi>lo ; ;+++ DUAL INPUT VERSION V.1.2 ;TIMEOUT 8 SECS ON SECONDARY PORT (ra,1)HAS PRIORTY 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 DATBUF EQU 0X0A ;DASHPIC BYTE SEND BUFFER*ONLY* MPOINT EQU 0X0B ;MEMORY POINTER FOR DATA RX'D STEPBUF EQU 0X0C ;TO KEEP TRACK OF SEND STEPS *ONLY* 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 ;NMEA CRC TIMEOUT0 EQU 0X12 ; ROTCNT EQU 0X13 ;COUNT ROTATES OF NMEA *ONLY* TIMEOUT1 EQU 0X14 ; ; **********************NO SLEEP FOR NOW!******************* ; MAY BE SET TO WAKE ON AN INPUT, BUT WILL WAIT FOR NEXT ; MAIN ROUTINE IS WAIT, THEN TRANSLATE, THEN SEND.... ; NMEAIN AND STARTBIT ARE SECONDARY ROUTINES ; *CRC TO DASHPIC IS ALL DATA (RAM$35+) EXCEPT AND CRC(OF COURSE) ORG 07FF ;POWER UP NOP ORG 0000 GOTO START ;IS IN 0100 SO... ORG 0100 START MOVLW B'00010001' OPTION MOVLW 0XFF ;ALL INPUT PORTB RB5=DAT RB6=CLK, ADD PULL UPS!!! TRIS PORTB TRIS PORTC MOVLW 0X0F ;ALL INPUT ON PORT A, RA0=NMEA0,RA1=NMEA1 TRIS PORTA ;RA0'S PULLED UP, PULL UP RA1'S!!! CLRF SSTATUS ;0=STARTBIT FLAG-SET AFTER SB, CLRD BY ;1=DATA TO SEND FLAG-SET BY (OR) ;2=STOPBIT FLAG ;3=VALID SENTENCE FLAG.RESET BY ;4=READY TO SEND (rts)CLR'D BY SENDDONE ;5=TMR-NMEARX-set by startbit,clr'd by end of byte ;6 ;7=data on port A,1 flag: switch to it.clr'd by dashpic rout 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) CLRF STEPBUF CLRF ROTCNT ;BSF STATUS,5;***TEMP ;GOTO DASHPIC ;****TEMP WAIT ;SITS HERE WHEN NO ACTIVITY, AND STARTBIT FLAG RESET BTFSC SSTATUS,5 ;SKIP IF NO DATA COMING IN CALL TMR BTFSC SSTATUS,2 ;CHECK FOR STOP[BIT CALL STOPBIT BTFSS SSTATUS,0 ;CHECK FOR STARTBIT YES:SS,0 SET CALL STARTBIT ;ONCE A (BEFOR) START TO SEND DATA, SET SS,1 ;IF SS,1 SET THEN SEND DATA ONE BYTE AT A TIME ;RTS FLAG:STAYS SET UNTIL ALL DATA SENT. SENDS 1 BYTE THEN CHECKS STARTBIT BTFSC SSTATUS,4 ;rEADY TO SEND FLAG UP?(RESET BY DONE) CALL DASHPIC ;**NOTE** KEEP THIS BEFORE ENCODE CALL BTFSC SSTATUS,1 ;DATA TO SEND IF SET GOTO ENCODEJ ENCRET GOTO WAIT STORE ;THIS ROUTINE STORES DATA TO $30,$50,$70 VIA FSR 5&6 AND ;MEMORY POINTER (MPOINT) MPOINT BITS 5&6 ARE FSR 5&6 ;THIS GIVES MAX 48 BYTES RX. MOVF MPOINT,W ;GET LOWER NIBBLE OF MEM POINTER ANDLW 0X0F MOVWF FSR BSF FSR,4 ;MUST BE SET FOR UPPER HALF OF RAM PAGE BTFSC MPOINT,4 BSF FSR,5 BTFSC MPOINT,5 BSF FSR,6 MOVF ROTBUF,W MOVWF INDF ;MOVE LAST RX'ED BYTE TO MPOINT'S ADDRESS BCF FSR,5 BCF FSR,6 INCF MPOINT ;THIS GETS RESET BY ,, OR CRC?? BTFSC MPOINT,6 ;OUT OF MEMORY?!! GOTO FULL MOVLW 0X0D ;..SECOND LAST BYTE? XORWF ROTBUF,W BTFSC STATUS,2 ;SKIP IF NOT GOTO SENTENCEDONE ;BYTE DONE, IS END MARKER GOTO STORERET CHECKFIRST ;70+ CYC 17 uS MOVLW .10 MOVWF DCRC ;TEMP USE CFLP BTFSS PORTB,5 GOTO BUSY BTFSS PORTB,6 GOTO BUSY DECFSZ DCRC ;DCRC CLEARED GOTO CFLP GOTO CFRET ;NOT BUSY, SEND ORG 0002 ;----------0002----- TMR ;-------------------------------------- ; This routine keeps PIC in sync with the ; NMEA stream if active. Isn't used until ; a SS,0 set (startbit done) but before STOPBIT ; MNEA timing 208.3 uS, BUT 208 CLOSE ENUFF ; SS,7 IS ALT INPUT(RA,1) MOVLW .208 SUBWF TMR0,W ;TEST FIRST BTFSS STATUS,0 RETLW 0X00 BTFSC SSTATUS,7 ;PORTA,1 ACTIVE FLAG GOTO TMRJ RRF ROTBUF ;rrf,LSB FRST BTFSS PORTA,0 BCF ROTBUF,7 ;opto REVERSED*** BTFSC PORTA,0 BSF ROTBUF,7 ;opto REVERSED*** INCF ROTCNT ;1-8 TMR400RET ;RETURN FROM SECOND NMEA INPUT BTFSS ROTCNT,3 ;8?DONE? GOTO STORERET ;NOPE CLRF ROTCNT BSF SSTATUS,2 ;WAIT FOR STOPBIT FLAG BCF SSTATUS,5 ;DISABLE TMR UNTIL NEXT STARTBIT BTFSC SSTATUS,3 ;SETS ONCE VALID GOTO SENCON VALID ;CHECK TO SEE IF STARTS WITH "$" ($24) MOVLW 0X24 XORWF ROTBUF,W BTFSS STATUS,2 ;SKIP IF MATCHES GOTO NOGO BSF SSTATUS,3 ;VALID FLAG GOTO STORERET ;SKIP STORING "$" SENCON ;VALID,CONTINUE WITH BYTES GOTO STORE SENTENCEDONE MOVLW 0X10 ;BOTTOM ($30) RESET MPOINT MOVWF MPOINT ;GOES FROM = 0 TO 3F ($30-3F,50-5F,70-7F) BCF SSTATUS,3 ;INCOMING DATA NO LONGER VALID BSF SSTATUS,1 ;DATA TO SEND GOTO NOGO ;TO SET WAIT FOR STOPBIT STORERET ;NOW SYNC SYNC SYNC! MOVLW .208 SUBWF TMR0,1 ;DO "RESET" NOW RETLW 0X00 NOGO ;NOT A STARTING BYTE BSF SSTATUS,2 ;STILL WAIT FOR STOPBIT RETLW 0X00 TMRJ BSF STATUS,6 GOTO TMR400 STARTBIT; ******---------------------------------******* ;**SB IS LOW ; the first char. is $24 ("$") ; ;CHECKS FOR A STARTBIT, IF ACTIVITY THEN WAITS ;NORMAL BIT BEFORE RESETTING TMR0 AND MODIFIERS BTFSS SSTATUS,7 BTFSS PORTA,1 ;PORTA,1 NMEA FLAG GOTO STBITJ BTFSC PORTA,0 RETLW 0X00 STBITRET BSF SSTATUS,0 ;STARTBIT HAPPENED FLAG BSF SSTATUS,5 ;ENABLE TMR ROUT MOVLW .104 ;TEMP DELAY 1/2 BITWIDTH MOVWF TIMER0 DL1 DECFSZ TIMER0 GOTO DL1 CLRF TMR0 ;SET START OF BYTE TO THIS POSITION GOTO WAIT STBITJ BSF STATUS,6 GOTO STBIT400 STOPBIT MOVLW .208 SUBWF TMR0,W ;TEST FIRST BTFSS STATUS,0 ; SKIP IF>208 RETLW 0X00 ;NOT YET STOPLP ;IN CASE THINGS REALLY MESSED UP! BTFSC SSTATUS,7 GOTO STOPJ BTFSS PORTA,0 ;SHOULD BE BACK HI NOW (QUIESCENT STATE) GOTO STOPLP BCF SSTATUS,0 ;RESET BCF SSTATUS,2 ;STOPBIT DONE RETLW 0X00 STOPJ BSF STATUS,6 GOTO STOP400 ENCODEJ BSF STATUS,5;0200 GOTO ENCODEC DASHPIC ;SEND FILTERED DATA TO DASHPIC ;TRIP CLK LOW (RB6) AND ;ADD A CRC WHILE SENDING THEN POP IT INTO LAST BYTE ;--MAY NEED A FLAG FOR LAST BYTE TO SEND...PRESERVE "*" THO.. ;..OR WRITE ROUTINE TO COUNT BEFORE HAND... ;MOVF STEPBUF,W ;ADDWF PCL BCF SSTATUS,7 ;NMEA DONE, RESET A,1 FLAG.... GOTO CHECKFIRST ;CHECK FOR ACTIVITY ;GOTO DPREADY ;OBSOLETE(REDUNDANT) ;GOTO SEND BUSY RETLW 0X00 CFRET MOVLW B'10111111' TRIS PORTB BCF PORTB,6 ;CLK LOW TO ALERT DASHPIC INCF STEPBUF ;FLOWS THRU HERE NOW MOVLW .10 MOVWF DCRC CLKLOWLP ;MAKE CLOCK START BIT >10uS NOP DECFSZ DCRC GOTO CLKLOWLP DPREADY ;DASHPIC READY? ; BTFSC PORTB,5 ;REMOVED PERMAN FOR NEW "SPIRT" FORMAT ; RETLW 0X00 BSF PORTB,6 ;RAISE CLK, ACTIVE EDGE= FALLING CLRF DCRC ;CRC COUNTER READY NOP ;TIME TO REACT FOR DASHPIC MOVLW B'10011111' ;BOTH OUTPUTS NOW TRIS PORTB MOVLW 0X15 ;POINTER FOR SEND INITIATE MOVWF DPOINT INCF STEPBUF ;RETLW 0X00 ;SETUP CNTRS ETC HERE SO SEND IS RAW BYTE OUTPUT ROUT ;timer0 is rotbuf, timer1 is rot count SEND ;=================================================== NOP NOP ;ADDS SOME TIME FOR PROCESSING NOP ;STARTS AT RAM $35 NOP CLRF TIMER1 MOVF DPOINT,W ;GET LOWER NIBBLE OF MEM POINTER ANDLW 0X0F MOVWF FSR BSF FSR,4 ;MUST BE SET BTFSC DPOINT,4 BSF FSR,5 BTFSC DPOINT,5 BSF FSR,6 MOVF INDF,W MOVWF TIMER0 ;ROTBUFF. MSB FIRST!! BCF FSR,5 BCF FSR,6 MOVLW 0X0D ;CHECK FOR DON'T SEND ANY AFTER XORWF TIMER0,W BTFSC STATUS,2 GOTO SENDDONE MOVF TIMER0,W ;GET BEFORE rLF'ED! ADDWF DCRC ;FOR CHECKSUM BYTE AT END*ADDAFTER SENDLP BTFSS TIMER0,7 BCF PORTB,5 BTFSC TIMER0,7 BSF PORTB,5 NOP NOP BCF PORTB,6 RLF TIMER0 INCF TIMER1 NOP NOP BSF PORTB,6 BTFSS TIMER1,3 GOTO SENDLP MOVF DPOINT,W ;DUMMY FOR STATUS ZERO TEST BTFSC STATUS,2 ;SKIP IF WASN'T ZERO RETLW 0X00 ;RETURN TO SEND DONE INCF DPOINT BTFSC DPOINT,6 GOTO SENDDONE ;END OF RAM, xxCOULD BE MORE DATA COMING IN ;RETLW 0X00 GOTO SEND DELAYSEND ;40 CYC (10uS)TO ALLOW TIME FOR PROCESSING MOVLW .11 MOVWF TIMER1 DLSLP DECFSZ TIMER1 GOTO DLSLP RETLW 0X00 SENDDONE BCF SSTATUS,4 ;CLR READY TO SEND FLAG CLRF DPOINT ;SO IT'LL RETURN HERE FROM NEXT 2 CALLS MOVLW 0X0D ; INSERT(*NOT IN CRC YET) MOVWF TIMER0 ADDWF DCRC ;ADDED HERE(IN CASE RAM END) CALL DELAYSEND ;10uS CLRF TIMER1 ;NEW ROT COUNT CALL SENDLP MOVF DCRC,W ;CRC ..-LAST BYTE- AFTER BYTE SENT MOVWF TIMER0 ; CALL DELAYSEND ;10uS CLRF TIMER1 ;NEW ROT CALL SENDLP ;SEND CRC MOVLW B'11111111' ;BACK TO INPUTS TRIS PORTB MOVLW 0X15 ;POINTER FOR NEXT SEND INITIATE MOVWF DPOINT RETLW 0X00 ;** crc WAS ADDED TO END OF DATA SENT. CRC INCLUDES____ FULL ;OVERFOW CONDITION: =48 BYTES ; SET A FLAG TO TELL MAIN ROUTINE TO SEND ALL DATA ;TO DASH PIC AS RXED, START DUMPING IT NOW...BEFORE NEXT BYTE? ;++CHECK ENCODE ROUTINE MAX LENGTH, IF LONGER THE 208uS, THEN ;A DEDICATED "RRF INTO ROTBUF" ROUTINE MUST BE PERFORMED MOVLW 0X10 ;RESET MPOINT BECAUSE MEM FULL! BIT 4 ALWAYS SET MOVWF MPOINT ;FOR UPPER HALF OF RAM ($30-3F,50-5F,70-7F) BSF SSTATUS,1 ;DATA TO SEND (BECAUSE FULL) GOTO STORERET ;_________________________________________________________________ ORG 0200 ;---0200---------------------------------- ;_________________________________________________________________ ENCODEC CALL ENCODE BCF STATUS,5 GOTO ENCRET ENCODE ;------------------------------------------------------------------ ;- <48 SO WILL BE CHOPPED) RETLW "G" RETLW "A" RETLW B'00000001' RETLW "R" ;Minimum Navigation Information RETLW "M" RETLW "B" RETLW B'00000010' RETLW "R" ;Minimum Specific GPS/TRANSIT Data RETLW "M" RETLW "C" RETLW B'00000011' RETLW "H" ;Heading, True RETLW "D" RETLW "T" RETLW B'00000100' RETLW "R" ;3D Velocity Information RETLW "M" RETLW "V" RETLW B'00000101' RETLW "A" ;WAYPOINT ARRIVAL ALARM RETLW "A" RETLW "M" RETLW B'00000110' RETLW "X" ;DATA VALID (V NO A YES) + CROSSTRACK ERROR RETLW "T" RETLW "E" RETLW B'00000111' RETLW "Z" ;UTC Date / Time and Local Time Zone Offset (FROM GPS) RETLW "D" RETLW "A" RETLW B'00001000' RETLW "V" ;TRACK MADE GOOD/GROUND SPEED RETLW "T" RETLW "G" RETLW B'00001001' RETLW "W" ;WAYPOINT LOCATION...NOT SURE HOW WKS ON ZENSTAR RETLW "P" RETLW "L" RETLW B'00001010' RETLW "M" ;Wind Speed and Angle(360) ---------WIND RETLW "W" RETLW "V" RETLW B'00001011 RETLW "V" ;Wind Speed TRUE RETLW "W" RETLW "T" RETLW B'00001100' RETLW "V" ;Wind Speed RELATIVE RETLW "W" RETLW "R" RETLW B'00001101' RETLW "V" ;.possibly data from water RETLW "P" RETLW "W" RETLW B'00001110' RETLW "T" ;.possibly data water-B? RETLW "K" RETLW "W" RETLW B'00001111' RETLW "T" ;DEPTH INFO(?) AND WATER TEMP-------WATER RETLW "K" RETLW "V" RETLW B'00010000' RETLW "D" ;Depth - RETLW "P" RETLW "T" RETLW B'00010001' RETLW "D" ;Depth Below Transducer RETLW "B" RETLW "T" RETLW B'00010010' RETLW "V" ;Water Speed and Heading RETLW "H" RETLW "W" RETLW B'00010011' RETLW "V" ;Distance Traveled through the Water RETLW "L" RETLW "W" RETLW B'00010100' RETLW "H" ;Heading, Deviation & Variation(COMPASS) RETLW "D" RETLW "G" RETLW B'00010101' ;THERE MAY BE MORE, OF SOME OF THESE N/A. CODES SHORTEN ;DATA BY 5. NUMERIC COULD STILL BE IN NIBBLES..... ;ONLY SEARCHES TO 15 TYPES FOR NOW ORG 0400 ;-------------------0400--------------- TMR400 RRF ROTBUF ;rrf,LSB FRST BTFSS PORTA,1 BCF ROTBUF,7 ;opto REVERSED*** BTFSC PORTA,1 BSF ROTBUF,7 ;opto REVERSED*** INCF ROTCNT ;1-8 BCF STATUS,6 GOTO TMR400RET STBIT400 BTFSC PORTA,1 ;MAKE SURE GOTO STBNO BSF SSTATUS,7 ;PORTA,1 NMEA FLAG. CAN ONLY BE RESET ;BY A COMPLETE SENTENCE(DEFINED)AT DASHPIC ;OR BY A TIMEOUT (8.8SEC) OF NO ACTIV ON ra,1 CLRF TIMEOUT0 ;RESET TIMEOUTS FOR NEXT TIME MOVLW 0XFF ;OVER 8 SECONDS DELAY MOVWF TIMEOUT1 BCF STATUS,6 GOTO STBITRET STBNO BTFSC TMR0,7 GOTO RA1TIMEOUT STBNO2 BCF STATUS,6 RETLW 0X00 STOP400 ;IN CASE THINGS REALLY MESSED UP! BTFSS PORTA,1 ;SHOULD BE BACK HI NOW (QUIESCENT STATE) GOTO STOP400 BCF SSTATUS,0 ;RESET BCF SSTATUS,2 ;STOPBIT DONE BCF STATUS,6 RETLW 0X00 RA1TIMEOUT CLRF TMR0 DECFSZ TIMEOUT0 GOTO STBNO2 DECFSZ TIMEOUT1 GOTO STBNO2 BCF SSTATUS,7 ;NO ACTIVE FOR 8 SEC, RETURN TO PORT A,0 GOTO STBNO2 END