what have you tried ?
in what way does it not provide a correct result?
signed divides, multiplies and shifts need proper handling of the sign bit
otherwise as long as the vars match in type signed integer math works as expected
what have you tried ?
in what way does it not provide a correct result?
signed divides, multiplies and shifts need proper handling of the sign bit
otherwise as long as the vars match in type signed integer math works as expected
Warning I'm not a teacher
It depends on what you're doing with the number(s).
If your displaying them using LCDOUT/SEROUT/HSEROUT/ARRAYWRITE you can use the SDEC modifier to display the value 65535 as -1.
If you're doing further math with the numbers you need check the highest bit, if it's set the value is negative and you can use the ABS operator to retrieve the actual value, do whatever needs done (like a division) and then restore the sign.
If all you want to do is cap the value at 0 thenCode:X VAR WORD Sign VAR BIT X = -5000 HSEROUT["Raw: ", DEC X, " Signed: ", SDEC X, 13] Sign = X.15 ' Preserve sign X = ABS(X) / 5 ' Divide absolute value X.15 = Sign ' Restore sign HSEROUT[SDEC X, 13]Code:IF X.15 THEN X = 0
I'm helping some fellow students to build an extinction meter.
There's ADC reading, and based on liquid passed in the system, light transmission, compared to reference, might increase or decrease.
So idea is, that they flow thru the "reference" liquid, ADC is read and that value is used as offset, which is deducted form further ADC readings, to get the info, what's going on.
Another possibility is use 128 = 0. If ADC Value < 128, treat as negative... I've created my own positive/negative methods that don't follow the standardized Signed Variable format. The math was easier my way for what I was doing. Just some thoughts that might spur ideas.Code:ADCIN Baseline ADCIN Reference IF Reference < Baseline THEN 'Sign = negative 'Use subtraction in calculation 'Denote a reduction ELSE 'Sign = positive 'Use addition in calculation 'Denote an increase ENDIF
It's not ADC value reference that causes problems.
Here's the explanation.
Say ADC changes from 100 to 200 and "middle" point is being 150.
So to have zero at my system variable output (which I later display both on screen and write to EEPROM), I'm deducting 150 from the input ADC value, to get zero. In case when ADC reading increases, than all is good, final variable value changes from 0 to 50, that's good. But if ADC value gets below 150, then things get bad.
Make up your own rules!Code:Zero VAR BYTE Variable VAR BYTE OtherVar VAR BYTE ADCIN, Zero ADCIN, Variable IF Variable < Zero THEN Zero = [some newly calculated value] ENDIF OtherVar = Variable - Zero
what does get bad mean ?But if ADC value gets below 150, then things get bad.
show your code
Bookmarks