Serin Serout Help


Closed Thread
Results 1 to 16 of 16
  1. #1
    Join Date
    Nov 2010
    Posts
    7

    Lightbulb Serin Serout Help

    Currently I am working on a project that involes serial communication between one PIC and another. The task is to flash an led at a rate (77) sent via serial. the code is as follows.

    Sender: PIC 16F877A

    CLEAR
    DEFINE OCS 4
    TRISA = %000000000


    LOOP1:
    SEROUT PORTA.0, 3, [77]
    GOTO LOOP1:
    END

    Receiver: PIC 12F683

    CLEAR
    ANSEL = 0
    CMCON0 = 7
    X VAR BYTE
    HIGH GPIO.2
    INPUT GPIO.1

    LOOP1:
    SERIN GPIO.1, 3, X
    GPIO.3 = 1
    PAUSE x
    GPIO.3 = 0
    GOTO LOOP1
    END

    any help would be appreciated thanks a lot

  2. #2
    Join Date
    Aug 2010
    Location
    Maryland, USA
    Posts
    869


    Did you find this post helpful? Yes | No

    Default

    my guess is the LED is always on or you just see a blip once. try moving the serin outside of the loop. The way you have it it will be waiting for a serin every time through the loop. next problem is you are turning the led on, waiting "x" time, then turning it off. THEN you go right back to the top of the loop and turn it right back on.so if it doesn't hang on the serin, it turns on almost instantly. try adding a pause after you trun it off also. That is assuming GPIO.3 is your LED.
    -Bert

    The glass is not half full or half empty, Its twice as big as needed for the job!

    http://foamcasualty.com/ - Warbird R/C scratch building with foam!

  3. #3
    Join Date
    Jul 2003
    Location
    Colorado Springs
    Posts
    4,959


    Did you find this post helpful? Yes | No

    Default

    On a 12F683, GPIO.3 is "Input Only" when not used as MCLR.
    You'll need to use a different pin for the LED.

    And the receiver has no way to know where each byte of serial data starts.
    The sender is continually sending data and the receiver looks for data whenever it looks for it.

    If the receiver starts looking in the middle of a byte, it doesn't know it's not the beginning of the transmission and will receive an invalid value.

    There needs to be some sort of handshaking, so the sender knows when the receiver will be ready to receive something before sending it.
    That will take another line between the two chips.
    Or, tri-state signaling on the single line (no sample code available).

    My recommendation ... add another line between the two chips, use SEROUT2/IN2 with FlowPin control.
    You can use GPIO.3 for the serial input (put FlowPin on another pin).
    DT

  4. #4
    Join Date
    Nov 2003
    Location
    Wellton, U.S.A.
    Posts
    5,924


    Did you find this post helpful? Yes | No

    Default

    Do not forget
    INCLUDE "modedefs.bas"

    And if you do not have enough pins for the flow control.
    From the manual. We sometimes refer to this as "waiting" for a character to know where we are.
    The list of data items to be received may be preceded by one or more qualifiers enclosed within brackets. SERIN must receive these bytes in exact order before receiving the data items. If any byte received does not match the next byte in the qualifier sequence, the qualification process starts over (i.e. the next received byte is compared to the first item in the qualifier list). A Qualifier can be a constant, variable or a string constant. Each character of a string is treated as an individual qualifier.
    Dave
    Always wear safety glasses while programming.

  5. #5
    Join Date
    Nov 2010
    Posts
    7


    Did you find this post helpful? Yes | No

    Lightbulb Update

    thanks for the post unfortunately i have made little progress. I have set the flowpin using Serin2 and serout2 and i am using proper pins. my baud rate may have some issues I'm trying to use the slowest one for now. Currently the circuit does nothing, no flashing or anything, but i have verified with an oscilloscope that data is being sent. Hear is the new code.

    send:
    CLEAR
    DEFINE OCS
    TRISA = %000000000

    LOOP1:
    SEROUT2 PORTA.0\PORTA.1, 3313, [DEC 77]
    GOTO LOOP1:
    END

    recive:
    CLEAR
    ANSEL = 0
    CMCON0 = 7
    X VAR BYTE

    LOOP1:
    SERIN2 GPIO.1\GPIO.3, 3313, [DEC X]
    pause x
    GPIO.0 = 1
    PAUSE x
    GPIO.0 = 0
    PAUSE X
    GOTO LOOP1
    END

    thanks again any help would be appreciated.

  6. #6
    Join Date
    Nov 2010
    Posts
    7


    Did you find this post helpful? Yes | No

    Lightbulb Update

    Should I be using pull up resistors (22k, 4.7K, 2.2k)?

  7. #7
    Join Date
    Nov 2003
    Location
    Wellton, U.S.A.
    Posts
    5,924


    Did you find this post helpful? Yes | No

    Default

    You will need to turn the analog off.
    The two links below should help. For now, after you read the one from Melanie, use the one from Darrel.
    http://www.picbasic.co.uk/forum/showthread.php?t=561
    http://www.picbasic.co.uk/forum/cont...54-All-Digital

    And if you could post all of your code and how the configs are set might also be helpful.
    Dave
    Always wear safety glasses while programming.

  8. #8
    Join Date
    Nov 2010
    Posts
    7


    Did you find this post helpful? Yes | No

    Lightbulb Update

    Thanks again i will check the links and do what I can. as far as the code goes all of the code i have is written above.

  9. #9
    Join Date
    Nov 2003
    Location
    Wellton, U.S.A.
    Posts
    5,924


    Did you find this post helpful? Yes | No

    Default

    Lets back up a bit. We normally start with a blinky program. If you have already done this then great, if not....

    The configs will need set for the hardware. This can be done int the *.inc file found in the PBP directory or in code space. This link tell about it.
    http://www.picbasic.co.uk/forum/showthread.php?t=543
    Being that you are starting, start using MPASM for the assembler. It will save you trouble later.

    Start with the 16F877A.
    By default the OSC in the *.inc is set for XT. This is fine if you have a crystal attached, if you have a resonator change it to HS.
    Now for the code,
    Code:
    '16F877A
    DEFINE OSC 4 ' This tells PBP how fast the chip is running.
    
    'This line is the configs MPASAM style
    'Comment it out if the configs are set in the *.inc
    @ __config _HS_OSC & _WDT_OFF & _LVP_OFF & _CP_OFF &_BODEN_OFF
    
    ADCON1=%00000111 ' Turns off the ADC
    CMCON=%00000111  'Turns off the Comparators
    TRISA = %00000000  ' Makes all pins on PORTA outputs
    
    'Set up some variables.
    LED  VAR PORTA.1  'Attach a LED to PORTA pin 1
    
    RUN:  Make the LED blink at 1 sec on and 1 sec off
    HIGH LED
    PAUSE 1000
    LOW LED
    PAUSE 1000
    GOTO RUN
    END
    The above will help you determine if the chip is running correctly.

    Do the same for the 12F683.
    The PBP default is internal OSC and the chip defaults to 4 MHz. So you should be good as long as PBP is told about it.
    DEFINE OSC 4
    In you code like we did for the 877A.

    Get everything blinking as it should and then tackle the serial part.
    Last edited by mackrackit; - 8th December 2010 at 06:31.
    Dave
    Always wear safety glasses while programming.

  10. #10
    Join Date
    Jul 2003
    Location
    Colorado Springs
    Posts
    4,959


    Did you find this post helpful? Yes | No

    Default

    Your flowpin is on GPIO.3.

    SERIN2 GPIO.1\GPIO.3, 3313, [DEC X]

    Put the serial data on GPIO.3, and the flowpin on GPIO.1.
    flowpin needs to be able to output.

    And set GPIO.0 to OUTPUT for the LED.

    OUTPUT GPIO.0

    Don't forget to disable MCLR in the configuration.
    DT

  11. #11
    Join Date
    Nov 2010
    Posts
    7


    Did you find this post helpful? Yes | No

    Lightbulb Update

    I have been working on the code for a couple of days. I have made a small progression if i manually send a "1" to the SERIN it will assume a flash rate of 1. this is done by placing the datapin wire to ground. Hear is the current code i am working with. Any help would be great, Thanks!
    Code:
    Recive:
    Clear 
    define ocs 4
    INCLUDE "modedefs.bas"
    @_config_HS_osc &_WDT_OFF &_LVP_OFF &_CP_OFF &_BODEN_OFF
    ADCON1 = %00000111
    CMCON = %00000111
    TRISA = %11111111
    TRISD = %00000000
    X VAR BYTE
    SERIN2 PORTA.5\PORTA.1, 3313, [DEC X]
    LOOP1:     
       HIGH PORTD.2
       PAUSE X
       LOW PORTD.2
       PAUSE X
    GOTO LOOP1
    END  
    
    Send:
    Clear 
    define ocs 4
    INCLUDE "modedefs.bas"
    @_config_HS_osc &_WDT_OFF &_LVP_OFF &_CP_OFF &_BODEN_OFF
    ADCON1 = %00000111
    CMCON = %00000111
    TRISA = %00000000
    TRISD = %00000000
    PORTA = %00000000
    LED VAR PORTA.1
    X VAR BYTE
    X = 100
    LOOP1: 
       SEROUT2 PORTA.5/PORTA.1, 3313, [100]
       PAUSE 5000
    GOTO LOOP1
    END
    Thanks again!
    Last edited by ScaleRobotics; - 12th December 2010 at 21:02. Reason: added code tags

  12. #12
    Join Date
    Aug 2006
    Location
    Look, behind you.
    Posts
    2,818


    Did you find this post helpful? Yes | No

    Default Idle State

    Hi MangoKid,
    I am away from MY Computer and my books, but if I understand this last statement correctly,
    " this is done by placing the datapin wire to ground."
    I believe you are referring to the ports "Idle State" if so here is the little secret: If you are sending TRUE the port wants a pull up resistor and if you are sending INVERTED the port wants a pull Down resistor.
    If you do not believe in MAGIC, Consider how currency has value simply by printing it, and is then traded for real assets.
    .
    Gold is the money of kings, silver is the money of gentlemen, barter is the money of peasants - but debt is the money of slaves
    .
    There simply is no "Happy Spam" If you do it you will disappear from this forum.

  13. #13
    Join Date
    Nov 2003
    Location
    Wellton, U.S.A.
    Posts
    5,924


    Did you find this post helpful? Yes | No

    Default

    Not sure what you mean by datapin...
    But..
    On the receive side you are only checking the serial port once,
    Code:
    SERIN2 PORTA.5\PORTA.1, 3313, [DEC X]
    LOOP1:     
       HIGH PORTD.2
       PAUSE X
       LOW PORTD.2
       PAUSE X
    GOTO LOOP1
    Put the SERIN2 line inside of LOOP1.
    Dave
    Always wear safety glasses while programming.

  14. #14
    Join Date
    Aug 2010
    Location
    Maryland, USA
    Posts
    869


    Did you find this post helpful? Yes | No

    Default

    Thats prolly my fault. Way back at the beginning I suggested to take it out of the loop. I was thinking it would be gotten before entering the loop.
    -Bert

    The glass is not half full or half empty, Its twice as big as needed for the job!

    http://foamcasualty.com/ - Warbird R/C scratch building with foam!

  15. #15
    Join Date
    Nov 2010
    Posts
    7


    Did you find this post helpful? Yes | No

    Thumbs up Update

    Thanks again i moved SERIN inside the loop but to no avail. I am assuming there is an issue with my baud rate. If i am sending should the sending and receiving baud rate be identical or should one be inverted?

    Thanks for the help

  16. #16
    Join Date
    Nov 2010
    Posts
    7


    Did you find this post helpful? Yes | No

    Lightbulb Serin Serout Solved!

    So after alot of headaches i have finally got SERIN SEROUT working . The first and biggest problem was the baud rate i was using the initial (3313) is only meant to communicate with a level converter. I am using (27889) which is 7bit with even parity. Here is the code i hope it helps anyone else who is stuck with the SERIN SEROUT.

    Send:

    clear
    DEFINE OCS 4
    ADCON1 = %00000111
    CMCON = %00000111
    TRISA = %11111111
    TRISD = %00000000
    X VAR BYTE
    X = 555

    LOOP1:
    SEROUT2 PORTA.5, 27889 , [244]
    PAUSE 500
    GOTO LOOP1
    END

    Recive:

    Clear
    define ocs 4
    ADCON1 = %00000111
    CMCON = %00000111
    TRISA = %11111111
    TRISD = %00000000
    X VAR BYTE

    LOOP1:
    LOW PORTD.3
    SERIN2 PORTA.5, 27889, [X]
    HIGH PORTD.3
    HIGH PORTD.2
    PAUSE (X * 10)
    LOW PORTD.2
    PAUSE (X * 10)

    GOTO LOOP1

    END

    Thanks Again to all those who helped solve this.

Members who have read this thread : 1

You do not have permission to view the list of names.

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts