Serial Timeout Strange Issues


Closed Thread
Results 1 to 21 of 21

Hybrid View

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

    Default Re: Serial Timeout Strange Issues

    I think it's a good call, I want to think I bumbled around and had the same overrun problem when I first wrote code for servos. Problem is I have to learn everything several times before I can remember it now days.
    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.

  2. #2
    Join Date
    Jun 2011
    Posts
    24

    Default Re: Serial Timeout Strange Issues

    This is the main routine that sends the data to the 3 receivers on 3 separate lines.
    Code:
    Clear
    @ DEVICE pic16F684, WDT_OFF
    adcon0 = 7
    adcon1 = 7
    ansel = 0
    
    
    
    define OSC 4
    trisc = %000111
    define CHAR_PACING 1000
    t1 var byte[6] 'angle of servo at body joint
    t2 var byte[6] 'angle of servo at leg
    t3 var byte[6] 'angle of servo at thigh
    i var byte
    start var byte
    ender var byte
    a var byte
    k var byte
    j var byte
    l var word
    rec var byte
    control var byte
    sta var byte
    fin var byte
    ste var byte
    
    control = 0
    speed var byte
    rec = 0
        
    Init:
    For i = 0 to 5
                t2[i] = 110
                t3[i] = 110
                t1[i] = 90
    next i
    Gosub Send
    
    Main:             'Main makes the robot sit then stand then step forward 5 times
                      ' and then turn 5 times and then backward 5 times then sit.
    For l = 0 to 1
        gosub sit
    next l
    for l = 0 to 1000
    pauseus 1
    next l
    For l = 0 to 1
        gosub stand
    next l
    for l = 0 to 1000
    pauseus 1
    next l
    
    For l = 0 to 5
        speed = 2
        gosub forward2
    next l
    for l = 0 to 5
        speed = 2
        gosub turn
    next l
    
    for l = 0 to 5
        speed = - 2
        gosub Backward
    next l
    for l = 0 to 1
        gosub sit
    next l
    while 0 = 0       'robot remains sitting indefinately
    
    wend 
    goto main
    
                                             
    Forward2:                                'moves every leg individualy forward while the rest move backward slowly.
            For i = 0 to  5 step 1
                t2[i] = 130
                t3[i] = 130
                porta.3 = 0
                for j = 0 to 5 step 1
                    For k = 0 to 50
                    pauseus 1
                    next k
                    select case i
                        case 0
                            t1[0] = t1[0] + 5 * speed
                            t1[1] = t1[1] - speed
                            t1[2] = t1[2] - speed
                            t1[3] = t1[3] - speed
                            t1[4] = t1[4] - speed
                            t1[5] = t1[5] - speed
                        Case 1
                            t1[0] = t1[0] - speed
                            t1[1] = t1[1] + 5 * speed
                            t1[2] = t1[2] - speed
                            t1[3] = t1[3] - speed
                            t1[4] = t1[4] - speed
                            t1[5] = t1[5] - speed
                        case 2
                            t1[0] = t1[0] - speed
                            t1[1] = t1[1] - speed
                            t1[2] = t1[2] + 5 * speed
                            t1[3] = t1[3] - speed
                            t1[4] = t1[4] - speed
                            t1[5] = t1[5] - speed
                        case 3
                            t1[0] = t1[0] - speed
                            t1[1] = t1[1] - speed
                            t1[2] = t1[2] - speed
                            t1[3] = t1[3] + 5 * speed
                            t1[4] = t1[4] - speed
                            t1[5] = t1[5] - speed
                        case 4
                            t1[0] = t1[0] - speed
                            t1[1] = t1[1] - speed
                            t1[2] = t1[2] - speed
                            t1[3] = t1[3] - speed
                            t1[4] = t1[4] + 5 * speed
                            t1[5] = t1[5] - speed
                        case 5    
                            t1[0] = t1[0] - speed
                            t1[1] = t1[1] - speed
                            t1[2] = t1[2] - speed
                            t1[3] = t1[3] - speed
                            t1[4] = t1[4] - speed
                            t1[5] = t1[5] + 5 * speed
                    end select
                    Gosub Send     'goes to the serout2 routines sending the position of the legs (t1 t2 and t3)
                next j
                t2[i] = 110
                t3[i] = 110
                Gosub Send 
            next i
    return
    
    Backward:                        'basically the same as forward but in reverse.
        For i = 5 to 0 step - 1
                t2[i] = 130
                t3[i] = 130
                porta.3 = 0
                for j = 0 to 5 step 1
                    For k = 0 to 50
                    pauseus 1
                    next k
                    select case i
                        case 0
                            t1[0] = t1[0] + 5 * speed
                            t1[1] = t1[1] - speed
                            t1[2] = t1[2] - speed
                            t1[3] = t1[3] - speed
                            t1[4] = t1[4] - speed
                            t1[5] = t1[5] - speed
                        Case 1
                            t1[0] = t1[0] - speed
                            t1[1] = t1[1] + 5 * speed
                            t1[2] = t1[2] - speed
                            t1[3] = t1[3] - speed
                            t1[4] = t1[4] - speed
                            t1[5] = t1[5] - speed
                        case 2
                            t1[0] = t1[0] - speed
                            t1[1] = t1[1] - speed
                            t1[2] = t1[2] + 5 * speed
                            t1[3] = t1[3] - speed
                            t1[4] = t1[4] - speed
                            t1[5] = t1[5] - speed
                        case 3
                            t1[0] = t1[0] - speed
                            t1[1] = t1[1] - speed
                            t1[2] = t1[2] - speed
                            t1[3] = t1[3] + 5 * speed
                            t1[4] = t1[4] - speed
                            t1[5] = t1[5] - speed
                        case 4
                            t1[0] = t1[0] - speed
                            t1[1] = t1[1] - speed
                            t1[2] = t1[2] - speed
                            t1[3] = t1[3] - speed
                            t1[4] = t1[4] + 5 * speed
                            t1[5] = t1[5] - speed
                        case 5    
                            t1[0] = t1[0] - speed
                            t1[1] = t1[1] - speed
                            t1[2] = t1[2] - speed
                            t1[3] = t1[3] - speed
                            t1[4] = t1[4] - speed
                            t1[5] = t1[5] + 5 * speed
                    end select
                    Gosub Send
                next j
                t2[i] = 110
                t3[i] = 110
                Gosub Send 
            next i
    return
    
    Turn:                             'similar to others but changes the direction of a side.
        For i = 5 to 0 step - 1
                t2[i] = 130
                t3[i] = 130
                porta.3 = 0
                for j = 0 to 5 step 1
                    For k = 0 to 50
                    pauseus 1
                    next k
                    select case i
                        case 0
                            t1[0] = t1[0] - 5 * speed
                            t1[1] = t1[1] + speed
                            t1[2] = t1[2] + speed
                            t1[3] = t1[3] - speed
                            t1[4] = t1[4] - speed
                            t1[5] = t1[5] - speed
                        Case 1
                            t1[0] = t1[0] + speed
                            t1[1] = t1[1] - 5 * speed
                            t1[2] = t1[2] + speed
                            t1[3] = t1[3] - speed
                            t1[4] = t1[4] - speed
                            t1[5] = t1[5] - speed
                        case 2
                            t1[0] = t1[0] + speed
                            t1[1] = t1[1] + speed
                            t1[2] = t1[2] - 5 * speed
                            t1[3] = t1[3] - speed
                            t1[4] = t1[4] - speed
                            t1[5] = t1[5] - speed
                        case 3
                            t1[0] = t1[0] + speed
                            t1[1] = t1[1] + speed
                            t1[2] = t1[2] + speed
                            t1[3] = t1[3] + 5 * speed
                            t1[4] = t1[4] - speed
                            t1[5] = t1[5] - speed
                        case 4
                            t1[0] = t1[0] + speed
                            t1[1] = t1[1] + speed
                            t1[2] = t1[2] + speed
                            t1[3] = t1[3] - speed
                            t1[4] = t1[4] + 5 * speed
                            t1[5] = t1[5] - speed
                        case 5    
                            t1[0] = t1[0] + speed
                            t1[1] = t1[1] + speed
                            t1[2] = t1[2] + speed
                            t1[3] = t1[3] - speed
                            t1[4] = t1[4] - speed
                            t1[5] = t1[5] + 5 * speed
                    end select
                    Gosub Send
                next j
                t2[i] = 110
                t3[i] = 110
                Gosub Send 
            next i
    return
    
    sit:                            'makes the legs go up to set the robot down.
    while t3[0] < 175
        t3[0] = t3[0] + 2
            t2[0] = t2[0] + 1
            t3[1] = t3[1] + 2
            t2[1] = t2[1] + 1
            t3[2] = t3[2] + 2
            t2[2] = t2[2] + 1
            t3[3] = t3[3] + 2
            t2[3] = t2[3] + 1
            t3[4] = t3[4] + 2
            t2[4] = t2[4] + 1
            t3[5] = t3[5] + 2
            t2[5] = t2[5] + 1
            Gosub Send   
    wend
    return
    
    Stand:                         'makes legs go down to stand robot up
    while t3[0] > 110
        t3[0] = t3[0] - 2
            t2[0] = t2[0] - 1
            t3[1] = t3[1] - 2
            t2[1] = t2[1] - 1
            t3[2] = t3[2] - 2
            t2[2] = t2[2] - 1
            t3[3] = t3[3] - 2
            t2[3] = t2[3] - 1
            t3[4] = t3[4] - 2
            t2[4] = t2[4] - 1
            t3[5] = t3[5] - 2
            t2[5] = t2[5] - 1
            Gosub Send   
    wend
    return
    
    Send:                          'the send routine sends t1,t2,and t3 to the 3 servo controllers.
    
    While portc.0 = 1
    wend
    serout2 portc.3,32852,["@", STR t1\6]
    While portc.2 = 1
    wend
    serout2 portc.4,32852,["@", STR t2\6]
    while portc.1 = 1
    wend
    serout2 portc.5,32852,["@", STR t3\6]   
    Return
    
    end
    This is the receiver I am using. The three receivers all use the same code.
    Code:
    '****************************************************************
    '*  Name    : Hexapod.BAS                                       *
    '*  Author  : Corbet Peters                                     *
    '*  Notice  : Copyright (c) 2011                                *
    '*          : All Rights Reserved                               *
    '*  Date    : 4/26/2011                                         *
    '*  Version : 1.0                                               *
    '*  Notes   :                                                   *
    '*          :                                                   *
    '****************************************************************
    Clear
    @ DEVICE pic16F84, WDT_OFF
    define osc 4
    trisa = %000000
    trisb = $00
    low portb
    t1pulse var byte[6]
    servos var portb
    servos[0] = portb.1
    servos[1] = portb.2
    servos[2] = portb.3
    servos[3] = portb.4
    servos[4] = portb.5
    servos[5] = portb.6 
    t1pulse[0] = 90
    t1pulse[1] = 90
    t1pulse[2] = 90
    t1pulse[3] = 90
    t1pulse[4] = 90
    t1pulse[5] = 90
    porta.1 = 1
    porta.2 = 0
    trisa.3 = 1
    i var byte
    
    Main:
        porta.2 = 0                     'turns on a transistor that brings pin on sender high
                                        'to stop it from sending the serial
        
        porta.2 = 1                      'turns transistor on to bring sender pin low to 
                                         'tell sender to send
        pulsout portb.3, t1pulse[0]+60
        pulsout portb.2, t1pulse[1]+60
        pulsout portb.1, t1pulse[2]+60
        pulsout portb.4, 240 - t1pulse[3]
        pulsout portb.5, 240 - t1pulse[4]
        pulsout portb.6, 240 - t1pulse[5]
        pulsout portb.7, 240 - t1pulse[5]
    
        
        
        Serin2 porta.3,32852,10,comfail,[wait ("@"), str t1pulse\6] 'if timeout length
                                         ' is longer than the time between the sends
                                         'on the sender, this line hangs up and chip
                                         'acts weird like turning porta.2 on but not
                                         ' sending the pulses or turn on servo pins 
                                         ' and never turn off                                 
        porta.2 = 0                      'tell sender to stop sending
        
        goto main                        'loop to main
    Comfail:
        porta.2 = 0
        goto main
    Sorry for the delay, I have been busy and I wanted a chance to comment a little. Any questions please ask. Any suggestions please post!
    Last edited by Archangel; - 14th June 2011 at 18:02. Reason: [code]please use code tags[/code]

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

    Default Re: Serial Timeout Strange Issues

    Just 1 question . . . Does it work now, or do you still have the same problem ?
    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.

  4. #4
    Join Date
    Jun 2011
    Posts
    24

    Default Re: Serial Timeout Strange Issues

    Sorry about the formatting. It doesn't work right now. The seperate movement routines work but the serial doesn't. I can make it work with a timer interrupt but it refreshes about every 25 to 30 ms which is too long and makes the servos weak. I want the servo controllers to wait for a signal from the main and if it does't get one in time then I want it to refresh using the same position.

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

    Default Re: Serial Timeout Strange Issues

    Hi Corbet, have you tried changing your byte values to word, just to see if you are overloading your bytes as Dave suggested ?
    You could make redundant variables and store your current var value as a backup and then compare your new values to them and if out of range then restore from them. Something like:
    psuedocode
    Code:
    serin . . . t1pulse
    dummy1 = t1pulse 
    pulseout . . . t1pulse
    serin . . . t1pulse
    if t1pulse >255 then t1pulse = dummy1 ' restore previous value
    pulseout . . .
    If time critical serial is too slow then you should switch to HSERIN which will receive via hardware while loop does it's thing.
    A nice buffer is featured in the Article about "Serial Backpack LCDs" This Thread was promoted to an article based upon one my early posts seeking help to make a serial LCD as I am TOO CHEAP to lay out 35 to 50 bucks a pop for them.
    You could also Increase your clock speed to 20mhz and increase the baud rate WAY UP so as to execute the loops faster. It uses a little more power though. Bit Bang serial is a Time Hog, of them Debug seems the fastest, uses serout2 syntax too.
    Last edited by Archangel; - 15th June 2011 at 03:53. Reason: [code] this is how to use code tags [/code]
    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.

Members who have read this thread : 1

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

Tags for this Thread

Posting Permissions

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