How can I speed this code up? SHIFTOUT is slowing it down and I need a faster way.


Closed Thread
Results 1 to 30 of 30

Hybrid View

  1. #1
    Join Date
    Mar 2010
    Location
    Minnesota, USA
    Posts
    41


    Did you find this post helpful? Yes | No

    Default

    Quote Originally Posted by mackrackit View Post
    I wonder if SHIFTING all 16 values at once would be faster than looping? Darn zeros
    Code:
    shiftout dpin,clk,1,[DATA,DATA,DATA,DATA,DATA,...]
    I dunno let me try it...
    Last edited by wolwil; - 8th May 2010 at 06:54.

  2. #2
    Join Date
    Mar 2010
    Location
    Minnesota, USA
    Posts
    41


    Did you find this post helpful? Yes | No

    Default

    Nope The Same

    The part that is slow is going from SUB1 to SUB2 not the looping through them 4096 times

    I just tried taking out the GOSUB's and still the same thing

  3. #3
    Join Date
    Dec 2007
    Location
    Finland
    Posts
    191


    Did you find this post helpful? Yes | No

    Default

    There are couple of workarounds available:
    1) changed crystal to 20MHz
    2) If Shiftout command is too slow
    Code:
    <code><font color="#000000">    <b>SHIFTOUT </b>dpin,clk,1,[Dat]
    </code>
    then don't use it. Do it other way (e.g code below).
    Code:
    <code><font color="#000000">    dpin = Dat.0(7) : clk = 1 : clk = 0
        dpin = Dat.0(6) : clk = 1 : clk = 0
        dpin = Dat.0(5) : clk = 1 : clk = 0
        dpin = Dat.0(4) : clk = 1 : clk = 0
        dpin = Dat.0(3) : clk = 1 : clk = 0
        dpin = Dat.0(2) : clk = 1 : clk = 0
        dpin = Dat.0(1) : clk = 1 : clk = 0
        dpin = Dat.0(0) : clk = 1 : clk = 0
    </code>
    This will run much faster but consume more code space. Trade-off that you have to live with.
    BTW, DATA is reserved word so therefore I changed it to Dat

    BR,
    -Gusse-
    Last edited by Gusse; - 8th May 2010 at 09:05. Reason: Crystal comment added

  4. #4
    Join Date
    Mar 2010
    Location
    Minnesota, USA
    Posts
    41


    Did you find this post helpful? Yes | No

    Default Nope the same.

    Quote Originally Posted by Gusse View Post
    Code:
    <code><font color="#000000">    dpin = Dat.0(7) : clk = 1 : clk = 0
        dpin = Dat.0(6) : clk = 1 : clk = 0
        dpin = Dat.0(5) : clk = 1 : clk = 0
        dpin = Dat.0(4) : clk = 1 : clk = 0
        dpin = Dat.0(3) : clk = 1 : clk = 0
        dpin = Dat.0(2) : clk = 1 : clk = 0
        dpin = Dat.0(1) : clk = 1 : clk = 0
        dpin = Dat.0(0) : clk = 1 : clk = 0
    </code>

    BR,
    -Gusse-
    Nope the same.

    20 MHz Clock will still be too slow with SHIFTOUT.

    I am assuming your code has something to do with accessing per bit in the word sized Dat variable. So if I wanted to access the 11th bit I would do this Dat.1(2) right?

    Would anyone have a faster way in Assembly I could do this?

    Also Does anyone know how many clock pulses SHIFTOUT uses?
    Last edited by wolwil; - 8th May 2010 at 17:16.

  5. #5
    Join Date
    Dec 2007
    Location
    Finland
    Posts
    191


    Did you find this post helpful? Yes | No

    Default

    Quote Originally Posted by wolwil View Post
    Nope the same.

    20 MHz Clock will still be too slow with SHIFTOUT.
    In your 1st post you are saying that you are running @16MHz. 20MHz is 25% faster than you present system.

    Quote Originally Posted by wolwil View Post
    I am assuming your code has something to do with accessing per bit in the word sized Dat variable. So if I wanted to access the 11th bit I would do this Dat.1(2) right?

    Would anyone have a faster way in Assembly I could do this?

    Also Does anyone know how many clock pulses SHIFTOUT uses?
    Code does exactly the same as SHIFTOUT but just little bit faster.
    If this didn't help then SHIFTOUT is not the bottleneck.
    Keep looking other solutions.

    11th bit would be Dat.0(10).
    Example below (remember MSBFIRST).
    Code:
    <code><font color="#000000">    Dat     VAR BYTE [2]
    
        dpin = Dat.0(7) : clk = 1 : clk = 0
        dpin = Dat.0(6) : clk = 1 : clk = 0
        dpin = Dat.0(5) : clk = 1 : clk = 0
        dpin = Dat.0(4) : clk = 1 : clk = 0
        dpin = Dat.0(3) : clk = 1 : clk = 0
        dpin = Dat.0(2) : clk = 1 : clk = 0
        dpin = Dat.0(1) : clk = 1 : clk = 0
        dpin = Dat.0(0) : clk = 1 : clk = 0
        
        dpin = Dat.0(15) : clk = 1 : clk = 0
        dpin = Dat.0(14) : clk = 1 : clk = 0
        dpin = Dat.0(13) : clk = 1 : clk = 0
        dpin = Dat.0(12) : clk = 1 : clk = 0
        dpin = Dat.0(11) : clk = 1 : clk = 0
        dpin = Dat.0(10) : clk = 1 : clk = 0  <font color="#000080"><i>'&lt;- 11th
        </i></font>dpin = Dat.0(9)  : clk = 1 : clk = 0
        dpin = Dat.0(8)  : clk = 1 : clk = 0
    
    </code>
    EDIT: If you or anybody know faster SHIFTOUT workaround with PBP, I would be interested.

    BR,
    -Gusse-
    Last edited by Gusse; - 8th May 2010 at 18:16. Reason: EDIT

  6. #6
    Join Date
    Mar 2010
    Location
    Minnesota, USA
    Posts
    41


    Did you find this post helpful? Yes | No

    Default

    Quote Originally Posted by Gusse View Post
    Code does exactly the same as SHIFTOUT but just little bit faster.
    If this didn't help then SHIFTOUT is not the bottleneck.
    Keep looking other solutions.

    BR,
    -Gusse-
    Well I have come to the realization that it is not the SHIFTOUT slowing me down but the pulsing of PORTA.3 for 4096 times. I need to get this to be faster.

    For better help on this I am going to add on to an older post that deals with the chip I am using so I don't create multiples on here.

    Thanks everyone for your help.

  7. #7
    Join Date
    Sep 2005
    Location
    Campbell, CA
    Posts
    1,107


    Did you find this post helpful? Yes | No

    Default

    Use a 16 bit counter in assembly to count to 0FFF.
    In that loop, use the instruction -

    btg LATA.3

    You can't get much quicker than that.

    I haven't counted exactly, but it looks to be under 14 cycles. At 40Mhz, that is
    1.4uSEC = 714 Khz.
    Charles Linquist

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