CCS C Software and Maintenance Offers
FAQFAQ   FAQForum Help   FAQOfficial CCS Support   SearchSearch  RegisterRegister 

ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

CCS does not monitor this forum on a regular basis.

Please do not post bug reports on this forum. Send them to support@ccsinfo.com

IEEE float to Microchip Float Conversion in CCS C

 
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion
View previous topic :: View next topic  
Author Message
muhibraza1



Joined: 26 Jul 2013
Posts: 23

View user's profile Send private message

IEEE float to Microchip Float Conversion in CCS C
PostPosted: Fri Sep 19, 2014 11:38 pm     Reply with quote

Hi Everyone !

I have got a C routine that converts IEEE float into Microchip float. Can someone explain me about how it works ? I am facing trouble in understanding it since I haven't written this routine by myself. Basically it is supposed to receive four bytes that have been concatenated together with the make32() built in CCS function so it actually takes the int32 as input. these four bytes are to be received through MODBUS protocol but thats another topic. I just need to know about the conversion. And if someone could suggest any other routine for the same purpose or just optimize this one that would also be appreciated. Thanks !

Here is the code !

Code:
float f_IEEEtoPIC(int32 f)
{
float ret;
int16 temp;

memcpy(&temp, ((int8*)&f)+2, 2);
temp = ((temp << 1) & 0xFF00) + (temp & 0xFF);

if(bit_test(f, 31)) // Test the sign bit
temp |= 0x0080;
else
temp &= 0xFF7F;

memcpy(((int8*)&ret)+3, ((int8*)&f) , 1);
memcpy(((int8*)&ret)+2, ((int8*)&f)+1 , 1);
memcpy(((int8*)&ret)+1, ((int8*)&temp) , 1);
memcpy(((int8*)&ret) , ((int8*)&temp)+1, 1);

return ret;
}
Ttelmah



Joined: 11 Mar 2010
Posts: 19339

View user's profile Send private message

PostPosted: Sat Sep 20, 2014 12:36 am     Reply with quote

A far more optimised version, comes with the compiler.....

Look at the file ieeefloat.c in the drivers directory.
This has versions optimised for each different chip family.

The version you have will be very slow. Pointer maths is quite laborious on the PIC, and the code you have fiddles with all four bytes, when only two actually have to be moved.

Some years ago (before CCS wrote their version), I wrote a version, and the comments in this may well answer your question:
Code:

void toccs(int *Value) //pointer to 32bit value
{
   //program to convert a 4 bytes 'word' from IEEE to CCS format
   //difference is where the 'sign' bit is stored. CCS's layout is based on
   //maths routines published by Microchip, when the PIC was first launched
   //and uses byte 1 as the 8bit exponent (offset by 0x7F), followed by a sign
   //and 23bit mantissa. This layout was optimised to suit the maths operations
   //available in the PIC. The IEEE format instead has the sign as the first bit
   //then the 8bit exponent, then the 23bit mantissa. So to convert one has to
   //extract the sign bit 'out' of the second byte, move the exponent left one
   //bit into this space, and then put the sign back into the first bit.
   int1 sign;
   sign = shift_left(&Value[1],1,0); //extract sign
   sign = shift_left(&Value[0],1,sign); //move to new location, and extract
   //bottom bit of exponent
   shift_right(&Value[1],1,sign); //put this back in place of the sign bit
}


The CCS version is much more optimised, but the basic operation is the same:

Code:

xxxxxxxx smmmmmmm mmmmmmmm mmmmmmmm
sxxxxxxx xmmmmmmm mmmmmmmm mmmmmmmm


The first line is the CCS format, the second is IEEE.
muhibraza1



Joined: 26 Jul 2013
Posts: 23

View user's profile Send private message

PostPosted: Sat Sep 20, 2014 4:51 am     Reply with quote

Thank you very much Ttelmah !
Display posts from previous:   
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion All times are GMT - 6 Hours
Page 1 of 1

 
Jump to:  
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