Advertisement

09.27.2006 at 11:23PM PDT, ID: 22005694
[x]
Attachment Details
[x]
The Solution Rating System

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.

Thank you!

RX & TX serial communication with GPS - PIC 16F84 - Hyperterminal

Tags: pic, gps, serial
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 your free trial to view this solution
Question Stats
Zone: Programming
Question Asked By: dbuela
Solution Provided By: mokule
Participating Experts: 2
Solution Grade: A
Views: 209
Translate:
Loading Advertisement...
09.28.2006 at 10:58AM PDT, ID: 17621450

Rank: Master

All comments and solutions are available to Premium Service Members only.

Start your 7-day free trial and see for yourself why Experts Exchange is the easiest and most proven technology resource in the world. Get Started

Already a member? Login to view this solution.

 
09.28.2006 at 04:44PM PDT, ID: 17623885

All comments and solutions are available to Premium Service Members only.

Start your 7-day free trial and see for yourself why Experts Exchange is the easiest and most proven technology resource in the world. Get Started

Already a member? Login to view this solution.

 
09.28.2006 at 09:02PM PDT, ID: 17625084

All comments and solutions are available to Premium Service Members only.

Start your 7-day free trial and see for yourself why Experts Exchange is the easiest and most proven technology resource in the world. Get Started

Already a member? Login to view this solution.

 
09.29.2006 at 03:05AM PDT, ID: 17626174

All comments and solutions are available to Premium Service Members only.

Start your 7-day free trial and see for yourself why Experts Exchange is the easiest and most proven technology resource in the world. Get Started

Already a member? Login to view this solution.

 
09.29.2006 at 03:15AM PDT, ID: 17626207

All comments and solutions are available to Premium Service Members only.

Start your 7-day free trial and see for yourself why Experts Exchange is the easiest and most proven technology resource in the world. Get Started

Already a member? Login to view this solution.

 
09.29.2006 at 03:24AM PDT, ID: 17626232

All comments and solutions are available to Premium Service Members only.

Start your 7-day free trial and see for yourself why Experts Exchange is the easiest and most proven technology resource in the world. Get Started

Already a member? Login to view this solution.

 
09.29.2006 at 03:28AM PDT, ID: 17626242

All comments and solutions are available to Premium Service Members only.

Start your 7-day free trial and see for yourself why Experts Exchange is the easiest and most proven technology resource in the world. Get Started

Already a member? Login to view this solution.

 
 
Loading Advertisement...
20080236-EE-VQP-29