you might have missed the point
50*4095/100 is 2047 this works (all constants)
numx=4095
50*numx/100 is 81 this does not
numy=50
numy*4095/100 is 81 this does not
numz=100
50*4095/numz is 81 this does not
you might have missed the point
50*4095/100 is 2047 this works (all constants)
numx=4095
50*numx/100 is 81 this does not
numy=50
numy*4095/100 is 81 this does not
numz=100
50*4095/numz is 81 this does not
Now I understand what you are saying. It does seem odd to me that there is a 32 bit register for maths calculation which can not be used if there is a word or byte variable in the calculation because the word/byte variable could overflow. A bit more thinking is required on my part, I think.
Does this mean that using ** and */ uses 32 bit and * only 16 bit?
Last edited by EarlyBird2; - 3rd July 2014 at 11:48. Reason: more thinking
Steve Earl www.datageo.co.uk
Look at the Statement keyword "DIV32". It is possible to compute all of these statements:
numx=4095
50*numx/100
numy=50
numy*4095/100
numz=100
50*4095/numz
Dave Purola,
N8NTA
EN82fn
After more thought and a bit of direction to look at DIV32 by Dave.
Multiplication stores a 32 bit result internally but the normal divide only works on the lower 16 bits which causes the 'overflow' problem highlighted by Richard. DIV32 was created specifically to overcome the 16 bit division limitation and as Dave says is a solution here.
Scampy asked about */ and how that works. It works by removing the division in the calculation so there is no 16 bit divide, there is an 8 bit shift or a divide by 256 of the 32 bits whichever way one wishes to visualise the process. Knowing that */ will apply a division by 256 one has to take account of this in the program.
In this case
B_max = (4095/100)*maxbright
take 4095/100 and multiply by 256 giving 10483.2 which is rounded up to 10484. Resulting in this
B_max = maxbright*/10484 which results in an integer value of 2047 when maxbright is 50.
Last edited by EarlyBird2; - 4th July 2014 at 07:44.
Steve Earl www.datageo.co.uk
I wrote this little bit of code to experiment with this thread its interesting to note that to */ method fails when your percentage goes past 1600 in lieu of 50
but the div32 method is quit sound up until the result exceeds 2^16 (65535 )
you need to remember that */ is the middle 16 bits and if you overflow that your still in trouble
Code:**************************************************************** '* Name : UNTITLED.BAS * '* Author : [select VIEW...EDITOR OPTIONS] * '* Notice : Copyright (c) 2014 [select VIEW...EDITOR OPTIONS] * '* : All Rights Reserved * '* Date : 7/2/2014 * '* Version : 1.0 * '* Notes : 16f684 * '* : * '**************************************************************** #CONFIG __config _INTRC_OSC_NOCLKOUT & _CP_OFF & _WDT_ON & _PWRTE_ON & _MCLRE_OFF #ENDCONFIG include "alldigital.pbp" OPTION_REG.7=0 trisa = %11111110 DEFINE OSC 4 so var porta.0 dq var portc.1 Nposn var word ss var word s2 var word s1 var word high so ss=4095 s1=1600 s2=100 pause 4000 serout2 so,84,[ "ready ",13,10] lop: pause 2000 nposn=s1*ss nposn = div32 s2 serout2 so,84,["1 " ,#Nposn,13,10 ] nposn=1600*4095/100 ; you need to adjust this line too serout2 so,84,["2 " ,#Nposn,13,10 ] nposn = s1 */ 10484 serout2 so,84,["3 ", #Nposn,13,10 ] nposn=s1*ss/100 serout2 so,84,["4 ", #Nposn,13,10 ] goto lop
yes only because the result needs to fit a word var
all of this only applies to pbpw only , pbpl is another story
Last edited by richard; - 4th July 2014 at 08:49. Reason: misunderstood question
Bookmarks