With so many solutions, how can you tell which solutions are most likely to help you and which ones are not? To provide you with a tool to use, we rate our solutions based on various elements that most accurately determine if a solution is a quality solution. To explain what factors affect the solution rating, here are the elements we take into consideration when formulating our solution rating.
The Grade of the Solution
The Zone Rank of the Expert Providing the Solution
The Number of Author and Expert Comments
The Number of Experts Contributing
The Feedback of the Community
Your Input Matters Because of the way the system is set up, the most important variable in this equation is you. As a member of Experts Exchange, you are able to cast your vote on the quality of the solutions in regard to how complete, accurate, helpful and easy to understand each solution is. When you provide your feedback, each rating is adjusted accordingly. So, if you see a solution that has a poor rating that you think is a good solution, let us know by rating it. As you do, the rating will be adjusted and will become more accurate for other members of our site.
If you have any suggestions that you would like to make for our rating system, please ask a question in the Suggestions Zone of Community Support.
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. :-)