Hardware = a PIC 16F84, I use a crystal oscillator 4 MHz, in a multi-purpose test board with a MAX 232 to convert from TTL to CMOS. Also, a GPS receiver TFAG10, and a computer with Hyperterminal.
Software = Write the Assembly program in MPLAB IDE, simulate with MPLAB SIM and flash the program into the PIC with ICPROG.
The GPS receiver, transmit the data at 4800 bps, 8 bits, N,1 stop bit. When I connect the TFAG10 to the serial port of the computer. I can see the data comming through Hyperterminal (No problems there)
Assuming that at 4800 bps the lenght of the bit is 208 useconds, wrote a program to test that... below is the code (may be messy but works just fine)
list p=16F84
radix hex
org 0
status equ 0x03
porta equ 0x05
portb equ 0x06
count8 equ 0x0d
indf equ 0x00
fsr equ 0x04
bsf status,5 ;bank 1
movlw 0x00
movwf portb ;port b all out
movlw 0x11
movwf porta ;ra0 y ra4 in
bcf status,5 ;bank 0
start movlw 0x11 ;lower limit is 0x12 but put -1 in fsr
movwf fsr
movlw 0x41 ;caracter "A"
movwf 0x12 ;put it into this memory address
movlw 0x42 ;caracter "B"
movwf 0x13 ;put it into this memory address
movlw 0x43 ;caracter "C"
movwf 0x14 ;put it into this memory address
movlw 0x44 ;caracter "D"
movwf 0x15 ;put it into this memory address
movlw 0x45 ;caracter "E"
movwf 0x16 ;put it into this memory address
movlw 0x46 ;caracter "F"
movwf 0x17 ;put it into this memory address
movlw 0x47 ;caracter "G"
movwf 0x18 ;put it into this memory address
movlw 0x48 ;caracter "H"
movwf 0x19 ;put it into this memory address
movlw 0x49 ;caracter "I"
movwf 0x1a ;put it into this memory address
movlw 0x4a ;caracter "J"
movwf 0x1b ;put it into this memory address
movlw 0x4b ;caracter "K"
movwf 0x1c ;put it into this memory address
movlw 0x4c ;caracter "L"
movwf 0x1d ;put it into this memory address
movlw 0x4d ;caracter "M"
movwf 0x1e ;put it into this memory address
movlw 0x4e ;caracter "N"
movwf 0x1f ;put it into this memory address
movlw 0x4f ;caracter "O"
movwf 0x20 ;put it into this memory address
movlw 0x50 ;caracter "P"
movwf 0x21 ;put it into this memory address
movlw 0x51 ;caracter "Q"
movwf 0x22 ;put it into this memory address
movlw 0x52 ;caracter "R"
movwf 0x23 ;put it into this memory address
movlw 0x53 ;caracter "S"
movwf 0x24 ;put it into this memory address
movlw 0x54 ;caracter "T"
movwf 0x25 ;put it into this memory address
movlw 0x55 ;caracter "U"
movwf 0x26 ;put it into this memory address
movlw 0x56 ;caracter "V"
movwf 0x27 ;put it into this memory address
movlw 0x57 ;caracter "W"
movwf 0x28 ;put it into this memory address
movlw 0x58 ;caracter "X"
movwf 0x29 ;put it into this memory address
clrf count8 ; put count8 to zero
newbyte incf fsr,1 ;fsr=fsr+1
bcf porta,1 ;start bit
nop
nop
nop
nop
nop ;several nops to meet timing
newbit call delay ;go to delay
btfsc indf,0 ;is bit 0 = 0 on variable memory address?
goto one ;no, is 1
zero bcf porta,1 ;yes, send a 0 on RA1
rrf indf,1 ;move all bits down one place
incf count8,1 ;count8=count8+1
btfss count8,3 ;is it 8?
goto newbit ;no, go and find a new bit
goto stopbit ;yes, go and send stop bit
one bsf porta,1 ;send a 1 on RA1
rrf indf,1 ;move all bits down one place
incf count8,1 ;count8=count8+1
btfss count8,3 ;is it 8?
goto newbit ;no, go and find a new bit
stopbit call delay ;delay
bsf porta,1 ;send a 1 on RA1
call delay ;delays between bytes
call delay ;
clrf count8 ;put count8 to zero
movlw 0x29 ;the final character is on memory 0x29
subwf fsr,0 ;w= fsr-0x29
btfsc status,2 ;did fsr reach the final character ?
goto start ;yes, all over again
goto newbyte ;no, go and get a new byte
delay movlw 0x40
movwf 0x0e
loop decfsz 0x0e,1
goto loop
return
end
So, if my GPS receiver and the program above both can be viewed by the Hyperterminal (4800, 8,N,1) then I assume that the lenght of the bit that the GPS receiver gives me is the same as my program (208 useconds = 1/4800).
Well, and here is my problem, I CAN NOT make it work assuming 208 useconds... instead it works when I put a delay between 40 and 100 useconds (anywhere between those values) using this program:
RA0 is connected to the GPS and RA1 is connected to the computer.
list p=16F84
radix hex
org 0
status equ 0x03
porta equ 0x05
portb equ 0x06
bsf status,5 ;bank 1
movlw 0x00
movwf portb ;portb all out
movlw 0x11
movwf porta ;ra0 and ra4 in (don't use ra4 at all)
bcf status,5 ;bank 0
start movlw 0x00
movwf portb ;port b all off (I don't use them)
search btfsc porta,0 ;is there a 0 in RA0 ? (in)
goto one ;no, go to one
zero bcf porta,1 ;yes, then put a 0 in RA1 (out)
call delay ;go delay
goto search ;back to search
one bsf porta,1 ;put a 1 in RA1 (out)
call delay ;go delay
goto search ;back to search
delay movlw 0x1e ;maximum value for the transmission to be OK
movwf 0x0e
loop decfsz 0x0e,1
goto loop
return
end
So, this program also works fine, but I can't understand why ....because the delay is way too short for the suposed 4800 bps from the GPS... and if in deed the bit is shorter (then it won't be 4800 !! as the specifications state)... why is the GPS working fine with Hyperterminal at 4800 ?
Feel free to treat me as ignorant, I don't care as long as answer is reached. :-)
Start Free Trial