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 CCS Technical Support

float to int16

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



Joined: 05 Dec 2004
Posts: 31

View user's profile Send private message

float to int16
PostPosted: Sun Nov 28, 2010 9:14 am     Reply with quote

I have the following code to convert float to int16 array. The code compiles successfully, but after simulation the array value is not correct. Can someone help me???
Code:

#include <18F452.h>
#include <math.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=40000000)

main()
{
unsigned int16 m,a;
int16 buffer[520];
   
for (m = 0; m < 520; m++)
    {
    buffer[m] = (int16)150 *sin(( 2 * 3.14159 * m * 3500) / 100000);
    }

}
Ttelmah



Joined: 11 Mar 2010
Posts: 19553

View user's profile Send private message

PostPosted: Sun Nov 28, 2010 11:32 am     Reply with quote

Your code, casts '150' to an integer, which it already is.....
As written, for a value of (say) 10, you will evaluate:

sin(( 2 * PI * 10 * 3500)/100000) = 0.809

*150 = 121.3

And put 121 into buffer[10]

You don't need to cast anywhere. A float is automatically converted to an int, if you assign it to an integer variable. However the question is what values you expect to get?.
Also as a comment, reduce the operations. It costs nothing for you to precalculate 2*pi*3500/100000, as 0.2199115, and just have:

m*0.2199115

Remember multiplications solve much faster than divisions, so 'pre-solving' the arithmetic, reduces errors and increases speed.

My guess though would be that you don't actually want the 2*pi. Normally you divide a angle in degrees by 2*pi, to convert it to radians. Multiplying by 2*pi, is used to convert an angle in radians to degrees. C, calculates sin, and the other angular functions for an angle in radians already, so if your calculation expects sin to work in degrees, this would be where the error lies......
I think you are trying to calculate sins for 520 points round 180 degrees. If so, the formula would be:

buffer[m] = sin(m*0.00604152);

Best Wishes
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