|
|
View previous topic :: View next topic |
Author |
Message |
Joe Guest
|
Substraction |
Posted: Wed May 11, 2005 4:25 am |
|
|
Hello,
how to do a substraction of 0x50 - 0x45 to have the result 0x05 and not 0x0b ?
Thanks a lot. |
|
|
JohnKennedy
Joined: 12 May 2004 Posts: 38
|
|
Posted: Wed May 11, 2005 5:20 am |
|
|
Simply you can't as the answer is correct at 0x0b if you convert the hex to decimal and do the maths you will see this (80 - 69 = 11 which is 0x0b in Hex)
HTH
JFK |
|
|
Ttelmah Guest
|
|
Posted: Wed May 11, 2005 5:22 am |
|
|
You won't.
Decimal 50-45, gives 5. Hexadecimal, 0x50 (decimal 80), minus 0x45 (decimal 69), gives 0xB (decimal 11).
If you want five as a result, start with the numbers in decimal, not hex.
I think in fact the numbers you have, may be binary coded decimal (BCD), not hex. If so, there have been routines posted here on the forum in the past for doing BCD conversions, and what you need is to convert the incoming numbers to decimal, before performing the arithmetic, and then convert them back (if the values have to go back to the same chip).
Best Wishes |
|
|
Joe Guest
|
|
Posted: Wed May 11, 2005 6:04 am |
|
|
Ok thanks, i hope it is ok, in fact it is bcd exactly how to convert BCD to decimal ?
Is that correct Code: | #define fromBCD(x) ((x & 0xF)+conv[(x>>4)]) | ?
Many thanks |
|
|
Ttelmah Guest
|
|
Posted: Wed May 11, 2005 6:34 am |
|
|
Yes. This is a routine I posted to do this. You need the array 'conv' defined as well before it'll work.
Best Wishes |
|
|
Joe Guest
|
|
Posted: Wed May 11, 2005 6:38 am |
|
|
Ok thanks i think i figured it out !
Thank you very much ! |
|
|
Joe Guest
|
|
Posted: Wed May 11, 2005 6:44 am |
|
|
I forgot to ask something !
If i want to make operations on BCD i can't, isn't it ?
I have to convert it in decimal and then make operations on it and then re convert in BCD ? Is that right ?
I can't substract with BCD ? |
|
|
Ttelmah Guest
|
|
Posted: Wed May 11, 2005 7:25 am |
|
|
You could potentially write BCD maths functions. You would have to seperate out the digits, do the arithmetic on these, and then rebuild the final number. The other way of doing this, is the 'ADD adjust' operation, where you look at the result of the decimal arithmetic, and the carry bits, and work out how to adjust the result to give the required BCD value. This operation is a standard function on some processors (the Z80 for example), but does not exist on the PIC. BCD, has fallen from favour in recent years, so processor support is not common on modern chips. The simplest solution, would be something like:
Code: |
int1 eflag;
int8 BCDAdd(int8 v1,int8 v2) {
int8 temp;
eflag=false;
temp=(v1 & 0xF0)+(v2 & 0xF0);
v1=(v1 & 0xF)+(v2 & 0xF);
if (v1>9) {
v1=v1-9;
++temp;
}
if (temp>0x90) {
temp=temp-0x90;
eflag=true;
}
return(temp+v1);
}
|
This returns the BCD sub of two BCD values, and sets 'eflag', if the result overflows the two digits.
Best Wishes |
|
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|