a simple boxe timer (code included)


Closed Thread
Results 1 to 25 of 25

Hybrid View

  1. #1
    T.Jackson's Avatar
    T.Jackson Guest


    Did you find this post helpful? Yes | No

    Default

    That's a shame Jeremy, I was going to expose you to the world as border line genius.
    Last edited by T.Jackson; - 19th June 2008 at 17:37.

  2. #2
    T.Jackson's Avatar
    T.Jackson Guest


    Did you find this post helpful? Yes | No

    Default

    I realize that I'm a bit drunk at the moment, now I'm saying 105+

  3. #3
    T.Jackson's Avatar
    T.Jackson Guest


    Did you find this post helpful? Yes | No

    Default

    The usual suspects.

  4. #4
    skimask's Avatar
    skimask Guest


    Did you find this post helpful? Yes | No

    Default

    Quote Originally Posted by T.Jackson View Post
    I realize that I'm a bit drunk at the moment, now I'm saying 105+
    Then step away from the keyboard and go chase parked cars or something...

  5. #5
    skimask's Avatar
    skimask Guest


    Did you find this post helpful? Yes | No

    Talking

    Quote Originally Posted by T.Jackson View Post
    That's a shame Jeremy, I was going to expose you to the world as border line genius.
    I've already exposed myself. I don't need any help.

  6. #6
    T.Jackson's Avatar
    T.Jackson Guest


    Did you find this post helpful? Yes | No

    Default

    One possible "improved" solution is as follows ...

    Code:
       Select Case b1
          Case Is < 219                                        
             timerN = 3
             timerAc = 120
             timerBc = 60     
          
          Case Is < 243                                         
             timerN = 2
             timerAc = 180
             timerBc = 60
    
          Case Is <= 255                                         
             timerN = 1
             timerAc = 600
             timerBc = 180 
       End Select
    That code will do exactly the same job as ...

    Code:
        If (b1 <= 255 And b1 >= 243) Then
            timerN = 1
            timerAc = 600
            timerBc = 180
        End If
        If (b1 <= 242 And b1 >= 219) Then
            timerN = 2
            timerAc = 180
            timerBc = 60
        End If
        If (b1 <= 218 And b1 >= 193) Then
            timerN = 3
            timerAc = 120
            timerBc = 60
        End If
    BUT, it'll probably compile to half the size, run twice as fast, be more readable, easier to comprehend and definitely far easier to maintain.

    Regards,

    Trent Jackson
    Last edited by T.Jackson; - 20th June 2008 at 17:44.

  7. #7
    T.Jackson's Avatar
    T.Jackson Guest


    Did you find this post helpful? Yes | No

    Default

    I might add also that the same thing is possible using IF's, select case is always more effcient though however.

    Code:
          for (int i = 0; i < 12; i++)
          {
              sample = tempArray[i];
              
              if (sample < 0)
                 rangeA++;
              else if (sample < 10)
                 rangeB++;
              else if (sample < 20)
                 rangeC++;
              else if (sample < 30)
                 rangeD++;
              else
                 rangeE++;
          }
    Notice how we start with the smallest number first? Always start with the smallest value first and work downwards with the next biggest value.

    Hope it helps

    Trent Jackson

  8. #8
    Join Date
    Jun 2008
    Posts
    3


    Did you find this post helpful? Yes | No

    Default

    i'm new to picbasic.

    i didn't know that the "select" statment is so faster and smaller than many "if then" compiled in picbasic [realy i did not look at the select statment ... i've just used the first think i know in picbasic]. it was my mistake that i does't look at the beutiness of my code... even in functions where performance are not needed (like the selection of the time).
    i've just share my code.
    anyway, thank for suggestions.
    any other suggestion will be apriciated.

    p.s. is this code more faster? (no IF needed)

    LOOKDOWN2 W0,>[255,242,218,192,166,144,124,105,80,59,49,40,0],B0
    LOOKUP2 B0,[60,600,180,120,60,60,40,30,20,15,10,45,30],timerAc
    LOOKUP2 B0,[60,180,60,60,60,30,40,30,20,15,10,15,15],timerBc
    LOOKUP2 B0,[6,1,2,3,4,5,6,7,8,9,10,11,12],timerN
    Last edited by hozone; - 20th June 2008 at 21:14.

  9. #9
    T.Jackson's Avatar
    T.Jackson Guest


    Did you find this post helpful? Yes | No

    Default

    Quote Originally Posted by hozone View Post

    p.s. is this code more faster? (no IF needed)

    LOOKDOWN2 W0,>[255,242,218,192,166,144,124,105,80,59,49,40,0],B0
    LOOKUP2 B0,[60,600,180,120,60,60,40,30,20,15,10,45,30],timerAc
    LOOKUP2 B0,[60,180,60,60,60,30,40,30,20,15,10,15,15],timerBc
    LOOKUP2 B0,[6,1,2,3,4,5,6,7,8,9,10,11,12],timerN
    At a guess I'm going to say much slower. LOOKUP / DOWN is a function, a group of operations, probably containing many IFs inside it. I think the protocol behind that function would be lengthy, well protected and complex.

    I place no bets though, never implemented it.

    Trent Jackson

  10. #10
    T.Jackson's Avatar
    T.Jackson Guest


    Did you find this post helpful? Yes | No

    Default A Good Case

    The main reason "Select Case" is faster is because it allows you to structure your code. As with an IF statement there's still a "compare" operation being preformed, but it's usually far better optimized.

    The biggest problem with your original code is that every IF will be executed, which consequently wastes time.

    Say for example that b1 = 245, the first IF is tested, the result returns true because b1 is within range of (255 - 243), so the block of code associated with that IF is executed, timerN is set to 1 etc ...

    Now here's the problem -- all subsequent IFs are executed even though b1 is clearly out of range and the result will always return false while ever b = 245.

    Code:
        If (b1 <= 255 And b1 >= 243) Then ' Comparison always performed
            timerN = 1
            timerAc = 600
            timerBc = 180
        End If
        If (b1 <= 242 And b1 >= 219) Then ' Comparison always performed
            timerN = 2
            timerAc = 180
            timerBc = 60
        End If
    Select Case can be configured in a way so that only one comparison is ever performed, only one block of code is ever executed.

    Trent Jackson

Similar Threads

  1. Elapsed Timer Demo
    By Darrel Taylor in forum Code Examples
    Replies: 111
    Last Post: - 29th October 2012, 17:39
  2. Replies: 5
    Last Post: - 24th February 2009, 18:55
  3. Making Program Code Space your playground...
    By Melanie in forum Code Examples
    Replies: 15
    Last Post: - 19th July 2008, 08:26
  4. Interrupt/timer not really interrupting...
    By Tom Gonser in forum mel PIC BASIC Pro
    Replies: 1
    Last Post: - 22nd May 2005, 22:05
  5. Timer Accuracy
    By GEEZER in forum mel PIC BASIC Pro
    Replies: 8
    Last Post: - 31st March 2005, 05:26

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