rotate bytes in array


Closed Thread
Results 1 to 19 of 19

Hybrid View

  1. #1
    Join Date
    Feb 2011
    Location
    Michigan, USA
    Posts
    33


    Did you find this post helpful? Yes | No

    Default Re: rotate bytes in array

    instead of a for/next shift, how about a in-place overwrite. (instead of shifting the data, shift the index variable.)

    index = 0

    Loop:
    adResult = {...new voltage value}

    arraySum = arraySum - arr[index]
    arr[index] = adResult
    arraySum = arraySum + adResult

    if index = 29 then
    index = 0
    else
    index = index + 1
    endif

    goto Loop


    Mike -

  2. #2
    Join Date
    Aug 2003
    Posts
    985


    Did you find this post helpful? Yes | No

    Default Re: rotate bytes in array

    Mike, is the compile size smaller?
    I can't really check in my project because it appears code is being fragmented over several pages
    after I crossed the first boundary.

    Robert, Didn't know you could use a STEP -1 directive,
    but if it works, it's shorter, and saves a useless byte.

    It appears to be working nicely, but I will shorten it if possible.
    It's for my car computer I've posted about here before.
    With the vehicle running, the voltage reading is live.
    With the engine stopped, but accessories relay on,
    the stereo amplifiers tend to cause the voltage to jump around (understandably).
    The thirty second average is then displayed and acted on to turn accessories off if the average is too low.
    Last edited by Art; - 14th March 2012 at 02:51.

  3. #3
    Join Date
    Feb 2011
    Location
    Michigan, USA
    Posts
    33


    Did you find this post helpful? Yes | No

    Default Re: rotate bytes in array

    Art,
    don't know if it's smaller. i was going for speed rather than code size.

    Mike -

  4. #4
    Join Date
    Jul 2003
    Location
    USA - Arizona
    Posts
    156


    Did you find this post helpful? Yes | No

    Default Re: rotate bytes in array

    Adding a new voltage reading every second to calculate a new mean voltage over thirty seconds
    I was thinking along the lines of what instead of what Tachyon wrote
    a for/next shift, how about a in-place overwrite. (instead of shifting the data, shift the index variable.)
    But, perhaps you want to look at rolling averages...
    http://www.pbpgroup.com/modules/wfse...hp?articleid=7
    http://www.picbasic.co.uk/forum/showthread.php?t=12183
    http://www.picbasic.co.uk/forum/showthread.php?t=8046
    http://www.picbasic.co.uk/forum/showthread.php?p=41702
    http://www.picbasic.co.uk/forum/cont...ith-hysteresis

  5. #5
    Join Date
    Nov 2007
    Location
    West Covina, CA
    Posts
    219


    Did you find this post helpful? Yes | No

    Default Re: rotate bytes in array

    Guys,
    May not be the solution for Art's project, but this post interested me because I was also stumped trying to shift bytes of data FIFO and ended up making something work for me.
    I liked the FOR/NEXT approach given here and thought I would try it since it looked faster and smaller since I'm really collecting 32 bytes instead of 12 in this example.

    My kludge: This scheme uses 24 words and takes 12.5us
    Code:
    DEFINE OSC 8
    
    RX      VAR BYTE        ' Buffer data
    XYZ_val VAR BYTE[12]    ' Accelerometer XYZ data
    TC_OUT  VAR PORTC.4     ' Test point to measure loop time
    
    Load_array:
    TC_OUT = 1
        XYZ_val[0] = XYZ_val[1]     ' Oldest data
        XYZ_val[1] = XYZ_val[2]
        XYZ_val[2] = XYZ_val[3]
        XYZ_val[3] = XYZ_val[4]
        XYZ_val[4] = XYZ_val[5]
        XYZ_val[5] = XYZ_val[6]
        XYZ_val[6] = XYZ_val[7]
        XYZ_val[7] = XYZ_val[8]
        XYZ_val[8] = XYZ_val[9]
        XYZ_val[9] = XYZ_val[10]
        XYZ_val[10] = XYZ_val[11]
        XYZ_val[11] = RX            ' Newest data
    TC_OUT = 0    
    RETURN
    Was surprised to to find that this scheme uses 43 words and takes 216us:
    Code:
    DEFINE OSC 8
    
    RX      VAR BYTE        ' Buffer data
    XYZ_val VAR BYTE[12]    ' Accelerometer XYZ data
    TC_OUT  VAR PORTC.4     ' Test point to measure loop time
    
    
    Load_array:
    TC_OUT = 1
        FOR z = 0 to 10
            XYZ_val[Z] = XYZ_val[Z+1]
        NEXT z
        XYZ_val[11] = RX
    TC_OUT = 0
       
    RETURN
    It meant more typing but saved some space and time.
    Last edited by LinkMTech; - 14th March 2012 at 17:22. Reason: Added note
    Louie

  6. #6
    Join Date
    Jan 2005
    Location
    Montreal, Quebec, Canada
    Posts
    3,161


    Did you find this post helpful? Yes | No

    Default Re: rotate bytes in array

    Quote Originally Posted by LinkMTech View Post
    ...It meant more typing but saved some space and time.

    I'm not surprised at all. We quickly forget that FOR-NEXT commands are a combination of ADDs, IFs and GOTOs in the background. The only problem is that the compiler has to make it generic to work for many circumstances; like the STEP -1 example. So now it has to include SUBTRACTs as well, that generates even more code whether you need it or not.

    I'm simplifying, but that's pretty much it.

    I use the simplified commands 'cause I haven't run out of space yet, and speed hasn't been an issue yet either. But if I ever reach that point, that's when I start breaking them down to their basic elements.

    Robert


    EDIT: Assembler class was back in '78-'83 era, yeesh...
    Last edited by Demon; - 14th March 2012 at 19:05.

  7. #7
    Join Date
    Nov 2007
    Location
    West Covina, CA
    Posts
    219


    Did you find this post helpful? Yes | No

    Default Re: rotate bytes in array

    Thanks for the insight Robert.
    The PBP simplified commands are the very reason I started "programming" especially after seeing the difference Bruce gives on his site.

    My PIC16F1823 is nearing the end with 2020 words used and just happened to need the space and faster time. Plus it was just rewarding to figure this out on my own and thought I'd share a little for some other newbie out there.
    Louie

  8. #8
    Join Date
    Jan 2005
    Location
    Montreal, Quebec, Canada
    Posts
    3,161


    Did you find this post helpful? Yes | No

    Default Re: rotate bytes in array

    Quote Originally Posted by Art View Post
    ...Robert, Didn't know you could use a STEP -1 directive,
    but if it works, it's shorter, and saves a useless byte...

    Yup, got off my lazy butt and got the manual, it's in there.

    So far our score in PBP knowledge:
    Robert 1 .... Art 56,743


Members who have read this thread : 0

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