Rounding Word Values


Closed Thread
Results 1 to 9 of 9
  1. #1
    Join Date
    Mar 2010
    Posts
    5

    Question Rounding Word Values

    I am new to PICBasic and having an issue with the following portion of my code:

    MAXVAL VAR Word
    DIST VAR Word

    MAXVAL = 32
    DIST = 1 to 30

    Percent=(DIST/MAXVAL)*100

    The Precent value is always zero!
    I suspect the "Percent" variable contains a non whole number and that is why it has no value.
    Is there a way I can present this equation differently to round up or down to the nearest whole number?

    I appreciate any advise.

    Thank you.

  2. #2
    Join Date
    Oct 2005
    Location
    Sweden
    Posts
    3,521


    Did you find this post helpful? Yes | No

    Default

    Hi,
    PBP only deals with integer math, truncating (not rounding) anything to the right of any decimal point. In your case the largest number you're having in the calculation is 30/32 which will come back as 0 when executed because 30/32 = 0.9375, 0.9375*100 will be treated as 0*100.

    To come around this you can multiply Dist by 100 before doing the division:
    Dist = Dist * 100 'Will now be 100-3000
    Percent = Dist / Maxval 'Will return 93, should be 93.75

    To get even better results:
    Dist = Dist * 1000 'Dist will now be 1000-30000
    Percent = Dist / Maxval 'Will return 937 as a representation of 93.7

    Then to display the value you can do:
    HSEROUT ["Result: ", Percent / 10, ".", Percent // 10, "%"], 10, 13
    Which should display 93.7

    If Dist was, say 11 the "true" result is (11/32)*100 = 34.375% but you'll get
    11000/32 = 343, displayed as 34.3

    Is that good enough or do you need it to be rounded?

    /Henrik.

  3. #3
    Join Date
    Mar 2010
    Posts
    5


    Did you find this post helpful? Yes | No

    Default

    Thank you for the reply Henrik.

    Your reply was most helpful.

    Is there a way to get around truncation (round values to nearest integer) in PB PRO?

    I am using LED's rather than a display as follows:

    '------------------------------------------------------------------------
    comp1:
    If Percent > 10 Then comp2
    PORTB = %00000001
    Goto continue
    comp2:
    If Percent > 20 Then comp3
    PORTB = %00000011
    Goto continue
    comp3:
    If Percent > 30 Then comp4
    PORTB = %00000111
    Goto continue
    comp4:
    If Percent > 40 Then comp5
    PORTB = %00001111
    Goto continue
    comp5:
    If Percent > 50 Then comp6
    PORTB = %00011111
    Goto continue
    comp6:
    If Percent > 60 Then comp7
    PORTB = %00111111
    Goto continue
    comp7:
    If Percent > 70 Then comp8
    PORTB = %01111111
    Goto continue
    comp8:
    If Percent > 80 Then comp9
    PORTB = %11111111
    Goto continue
    comp9:
    If Percent > 95 Then comp10
    comp10:
    PORTB = %11111111
    FreqOut bz, 250, 4000
    pause 250
    PORTB = %01111111
    Low bz
    pause 250

    continue:

    'Rest of code

    '-------------------------------------------------------------------------

    Again, thank you so much for your help.

    Chris

  4. #4
    Join Date
    Oct 2004
    Posts
    440


    Did you find this post helpful? Yes | No

    Default

    Dist = Dist * 1000 'Dist will now be 1000-30000
    Percent = Dist / Maxval 'Will return 937 as a representation of 93.7
    Percent = Percent + 5 'ROUND 937 UP
    Percent = Percent / 10 'ANSWER 94

    Norm

  5. #5
    Join Date
    Mar 2010
    Posts
    5


    Did you find this post helpful? Yes | No

    Default

    Thanks Norm. I think that will do the trick....

  6. #6
    Join Date
    May 2008
    Location
    Italy
    Posts
    825


    Did you find this post helpful? Yes | No

    Default

    Chris, what about semplifying your code in this way:

    Code:
    AA0  var Byte  ' new variable to add.
    
    If Percent < 95 then
    AA0 = (Percent / 10) - 1
    PortB = (2^AA0)-1
    else
    PORTB = %11111111
    FreqOut bz, 250, 4000
    pause 250
    PORTB = %01111111
    Low bz
    pause 250
    endif
    will eliminate from comp1 up to label continue.

    Al.
    All progress began with an idea

  7. #7
    Join Date
    Mar 2010
    Posts
    5


    Did you find this post helpful? Yes | No

    Default

    This is perfect.... I get more out of these discussions then any one book I own.

    Thanks Al

    Chris

    btw

    The circuit I am working on is for measuring the amount of salt in my water softener brine tank and displays the level on a blank switch plate via 8 LED's (see attachment). The circuit uses a Parallax PING sensor, 16F87 for the slave and 16F876 for the master. communication is via RS-485.

    If anyone is interested in the specifics, I would be more than happy to share details.

    Again, thanks for all the help.

    Chris
    Attached Images Attached Images  

  8. #8
    Join Date
    May 2008
    Location
    Italy
    Posts
    825


    Did you find this post helpful? Yes | No

    Default

    Chris, I made a mistake! Sometimes I forget that PBP is not VB and in this case I have use the power sign^ improperly since PBP is not able to do power (the sign is used for Bitwise Exclusive OR). So the code I have posted will not work! To overcome this limitation I have used a lookup table so the working code is as follow:

    Code:
    AA0  var Byte  ' new variable to add.
    BB0  var byte  ' new variable to add
    
    If Percent < 95 then
    AA0 = (Percent / 10) - 1
    LOOKUP2 AA0,[1,3,7,15,31,63,127,255],BB0
    PortB = BB0
    else
    PORTB = %11111111
    FreqOut bz, 250, 4000
    pause 250
    PORTB = %01111111
    Low bz
    pause 250
    endif

    As you can see the code didn't change much, just removed (2^AA0)-1 and added a new variable.


    Al.
    Last edited by aratti; - 28th March 2010 at 18:47.
    All progress began with an idea

  9. #9
    Join Date
    Mar 2010
    Posts
    5


    Did you find this post helpful? Yes | No

    Default

    Al, I appreciate the correction. I understood what you where trying to do. I too am more familiar with VB than PBP.
    This definitely simplifies the overall code.
    Thank you very much.

    Chris

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