I am working on a GPS receiving routine, based on the NMEA module written by Dave on the wiki. However, I've modified it significantly and am now having problems with the interrupt. At intervals, text on my GLCD gets corrupted and I'm assuming that it is because I have not context-saved someting in the interrupt. I've tried all things I can think of and looked through the ASM, but cannot spot what I've missed. I would be extremely grateful if anyone else could help. I'm using a 18F4620.
Basic code:
Code: Select all
Interrupt OnNMEAData()
Dim Data As Char
Dim WREGHold, BSRHold As Byte
// If a byte receive has triggered the interrupt, then context save
// FSR0, FSR1, INF0, INDF1 and process the data byte...
BSRHold = BSR
WREGHold = WREG
Save(0, INDF0, INDF1, STATUS, PRODL, PRODH, TABLEPTR, TABLAT)
If PIR1.5 = 1 Then
PIE1.5 = 0
Data = RCREG
// start reading a sentence
If Data = "$" Then
FReadingSentence = True
FIndexIn = 0
EndIf
// are we reading a sentence? if so, set the buffer data...
If FReadingSentence Then
If false Then'(FIndexIn = 3 And Data <> "G") Or (FIndexIn = 4 And Data <> "G") Or (FIndexIn = 5 And Data <> "A") Then
FReadingSentence = False
Else
If Data < " " Then
// if end-of-sentence <CR><LF> - terminate sentence reading...
FReadingSentence = False
If Not SentenceLocked Then
// copy the NMEA line stored in the buffer into Sentence
FSR0 = @Sentence
FSR1 = @FBuffer
While FIndexIn > 0
POSTINC0 = POSTINC1
Dec(FIndexIn)
Wend
INDF0 = 0 // add end of string terminator
NewSentence = True
EndIf
Else
// set buffer data
If FIndexIn < NMEABufferSize Then
FSR0 = @FBuffer
Inc(FSR0, FIndexIn)
INDF0 = Data
Inc(FIndexIn)
Else
FReadingSentence = False
EndIf
EndIf
EndIf
EndIf
PIE1.5 = 1
EndIf
Restore
WREG = WREGHold
BSR = BSRHold
End Interrupt
Code: Select all
ISR_ONNMEADATA_0
MOVLB 0
?I002486_F022_000079_P000472 ; L#MK BSRHOLD = BSR
MOVFF BSR,F684_U08
?I002487_F022_000080_P000472 ; L#MK WREGHOLD = WREG
MOVLB 2
MOVWF F683_U08
MOVFF INDF0,F685_U08
MOVFF INDF1,F686_U08
MOVFF STATUS,F687_U08
MOVFF PRODL,F688_U08
MOVFF PRODH,F689_U08
MOVFF _TBLPTRL#M0_U16H,F690_U16H
MOVFF _TBLPTRL#M0_U16,F690_U16
MOVFF TABLAT,F692_U08
MOVFF FSR0L,F693_U08
MOVFF FSR0H,F694_U08
MOVFF FSR1L,F695_U08
MOVFF FSR1H,F696_U08
LFSR 0,F697_U200
CLRF FSR1L,0
CLRF FSR1H,0
MOVLW 25
MOVFF POSTINC1,POSTINC0
DECFSZ WREG,1,0
BRA $ - 6
?I002488_F022_000084_P000472 ; L#MK IF PIR1.5 = 1 THEN
MOVLB 0
BTFSS PIR1,5,0
BRA ENDIF_275
?I002489_F022_000086_P000472 ; L#MK PIE1.5 = 0
BCF PIE1,5,0
?I002490_F022_000087_P000472 ; L#MK DATA = RCREG
MOVFF RCREG,F682_U08
?I002491_F022_000090_P000472 ; L#MK IF DATA = "$" THEN
MOVLW 36
MOVLB 2
SUBWF F682_U08,0
MOVLB 0
BNZ ENDIF_276
?I002492_F022_000091_P000472 ; L#MK FREADINGSENTENCE = TRUE
MOVLB 5
BSF M716_U01,0
?I002493_F022_000092_P000472 ; L#MK FINDEXIN = 0
MOVLB 6
CLRF M797_U08
ENDIF_276
MOVLB 0
?I002494_F022_000096_P000472 ; L#MK IF FREADINGSENTENCE THEN
BCF STATUS,3,0
MOVLB 5
BTFSS M716_U01,0
BSF STATUS,3,0
MOVLB 0
BOV ENDIF_277
?I002495_F022_000100_P000472 ; L#MK IF DATA < " " THEN
MOVLW 32
MOVLB 2
SUBWF F682_U08,0
MOVLB 0
BC FALSE_168
?I002496_F022_000102_P000472 ; L#MK FREADINGSENTENCE = FALSE
MOVLB 5
BCF M716_U01,0
?I002497_F022_000103_P000472 ; L#MK IF NOT SENTENCELOCKED THEN
BCF STATUS,3,0
BTFSC M716_U01,3
BSF STATUS,3,0
MOVLB 0
BOV ENDIF_280
?I002498_F022_000105_P000472 ; L#MK FSR0 = @SENTENCE
LFSR 0,M811_U648
?I002499_F022_000106_P000472 ; L#MK FSR1 = @FBUFFER
LFSR 1,M717_U640
?I002500_F022_000107_P000472 ; L#MK WHILE FINDEXIN > 0
WHILE_25
MOVLB 6
MOVF M797_U08,1
MOVLB 0
BZ FALSE_169
?I002501_F022_000108_P000472 ; L#MK POSTINC0 = POSTINC1
MOVFF POSTINC1,POSTINC0
?I002502_F022_000109_P000472 ; L#MK DEC(FINDEXIN)
MOVLB 6
DECF M797_U08,1
MOVLB 0
BRA WHILE_25
FALSE_169
?I002503_F022_000111_P000472 ; L#MK INDF0 = 0 // ADD END OF STRING TERMINATOR
CLRF INDF0,0
?I002504_F022_000112_P000472 ; L#MK NEWSENTENCE = TRUE
MOVLB 5
BSF M716_U01,4
ENDIF_280
MOVLB 0
BRA ENDIF_279
FALSE_168
?I002505_F022_000116_P000472 ; L#MK IF FINDEXIN < NMEABUFFERSIZE THEN
MOVLW 80
MOVLB 6
SUBWF M797_U08,0
MOVLB 0
BC FALSE_170
?I002506_F022_000117_P000472 ; L#MK FSR0 = @FBUFFER
LFSR 0,M717_U640
?I002507_F022_000118_P000472 ; L#MK INC(FSR0, FINDEXIN)
MOVLB 6
MOVF M797_U08,0
ADDWF _FSR0L#M0_U16,1,0
MOVLW 0
ADDWFC _FSR0L#M0_U16H,1,0
?I002508_F022_000119_P000472 ; L#MK INDF0 = DATA
MOVFF F682_U08,INDF0
?I002509_F022_000120_P000472 ; L#MK INC(FINDEXIN)
INCF M797_U08,1
MOVLB 0
BRA ENDIF_281
FALSE_170
?I002510_F022_000122_P000472 ; L#MK FREADINGSENTENCE = FALSE
MOVLB 5
BCF M716_U01,0
ENDIF_281
MOVLB 0
ENDIF_279
ENDIF_277
?I002511_F022_000128_P000472 ; L#MK PIE1.5 = 1
BSF PIE1,5,0
ENDIF_275
CLRF FSR0L,0
CLRF FSR0H,0
LFSR 1,F697_U200
MOVLW 25
MOVFF POSTINC1,POSTINC0
DECFSZ WREG,1,0
BRA $ - 6
MOVFF F696_U08,FSR1H
MOVFF F695_U08,FSR1L
MOVFF F694_U08,FSR0H
MOVFF F693_U08,FSR0L
MOVFF F692_U08,TABLAT
MOVFF F690_U16H,_TBLPTRL#M0_U16H
MOVFF F690_U16,_TBLPTRL#M0_U16
MOVFF F689_U08,PRODH
MOVFF F688_U08,PRODL
MOVFF F687_U08,STATUS
MOVFF F686_U08,INDF1
MOVFF F685_U08,INDF0
?I002512_F022_000132_P000472 ; L#MK WREG = WREGHOLD
MOVLB 2
MOVF F683_U08,0
?I002513_F022_000133_P000472 ; L#MK BSR = BSRHOLD
MOVFF F684_U08,BSR
?I002514_F022_000135_P000472 ; L#MK END INTERRUPT
RETFIE 1
Steve