|
|
View previous topic :: View next topic |
Author |
Message |
student Guest
|
compilation error |
Posted: Wed Jul 22, 2009 1:33 am |
|
|
The following code is compiled under Borland but in CCS 4.084 I get bulk of errors.
Any clue.
Main c file.
Code: |
#include <dev.h>
#include <stdlib.h>
#include <cordic-32bit.h>
void main(void)
{
float val,var,angle=150.0001;
val=sin(angle);
var=cos(angle);
printf("sin %f cos %f \n ", val,var);
}
|
here is the cordic-32bit.h file.
Code: |
//Cordic in 32 bit signed fixed point math
//Function is valid for arguments in range -pi/2 -- pi/2
//for values pi/2--pi: value = half_pi-(theta-half_pi) and similarly for values -pi---pi/2
//
// 1.0 = 1073741824
// 1/k = 0.6072529350088812561694
// pi = 3.1415926536897932384626
//Constants
#define cordic_1K 0x26DD3B6A
#define half_pi 0x6487ED51
#define MUL 1073741824.000000
#define CORDIC_NTAB 32
#define Pi 3.14159265358979323846
#define N 90
int cordic_ctab [] = {0x3243F6A8, 0x1DAC6705, 0x0FADBAFC, 0x07F56EA6, 0x03FEAB76, 0x01FFD55B, 0x00FFFAAA, 0x007FFF55, 0x003FFFEA, 0x001FFFFD, 0x000FFFFF, 0x0007FFFF, 0x0003FFFF, 0x0001FFFF, 0x0000FFFF, 0x00007FFF, 0x00003FFF, 0x00001FFF, 0x00000FFF, 0x000007FF, 0x000003FF, 0x000001FF, 0x000000FF, 0x0000007F, 0x0000003F, 0x0000001F, 0x0000000F, 0x00000008, 0x00000004, 0x00000002, 0x00000001, 0x00000000,};
float cordic(int theta, int *s, int *c, int n)
{
int k, d, tx, ty, tz;
int x=cordic_1K,y=0,z=theta;
n = (n>CORDIC_NTAB) ? CORDIC_NTAB : n;
for (k=0; k<n; ++k)
{
d = z>>31;
//get sign. for other architectures, you might want to use the more portable version
//d = z>=0 ? 0 : -1;
tx = x - (((y>>k) ^ d) - d);
ty = y + (((x>>k) ^ d) - d);
tz = z - ((cordic_ctab[k] ^ d) - d);
x = tx; y = ty; z = tz;
}
*c = x; *s = y;
return *s/MUL;
}
float cos(float angle)
{
float res;
int *s, *c;
angle=N-angle;
angle=angle*Pi/180;
res=cordic((angle*MUL), &s ,&c,32);
return res;
}
float sin(float angle)
{
float res;
int *s, *c;
if (angle>90)
angle=180-angle;
angle=angle*Pi/180;
res=cordic((angle*MUL), &s ,&c,32);
return res;
}
|
dev.h file is device related config file i.e
Code: |
#include <16F877A.h>
#device *=16
#device ICD=TRUE
#device adc=8
#FUSES NOWDT //No Watch Dog Timer
#FUSES
#use delay(clock=20000000)
#use rs232(baud=9600, xmit=PIN_C6,rcv=PIN_C7)
|
thnx... |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
|
student Guest
|
|
Posted: Wed Jul 22, 2009 1:57 am |
|
|
PCM programmer wrote: | There are Cordic functions for CCS in the Code Library forum:
|
I know but they have some problem with scaling.
What's wrong with the code posted. |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Wed Jul 22, 2009 2:10 am |
|
|
The sizes of the basic datatypes are different in CCS, compared to
Borland. Also, they are unsigned by default. You need to edit the code
and make it be compatible with CCS. Look in the CCS manual, in the
Basic and Special Types section:
http://www.ccsinfo.com/downloads/ccs_c_manual.pdf |
|
|
Ttelmah Guest
|
|
Posted: Wed Jul 22, 2009 2:19 am |
|
|
Also, remember you are working in radians. 150.0001 radians, not degrees....
Best Wishes |
|
|
student Guest
|
data type sizes |
Posted: Wed Jul 22, 2009 3:42 am |
|
|
PCM programmer wrote: | The sizes of the basic datatypes are different in CCS, compared to
Borland. |
Mainly two data types are used in the above program. i.e float and int.
in ccs int32 is used which i have tried with but no luck.And float is same in standard c and ccs c. |
|
|
FvM
Joined: 27 Aug 2008 Posts: 2337 Location: Germany
|
|
Posted: Wed Jul 22, 2009 8:51 am |
|
|
The compiler errors are easily understandable, apparently you didn't yet try to identify them individually.
The code expects case sensitive code processing, so you have to specify a #case at the entry.
Also int x=cordic_1K,y=0,z=theta; is C++ coding style, because theta is a variable. You have to separate the definition from the assignment.
As already said, int has to be changed to int32 in many places. When defining int to 32 bit globally, I got an out-of-RAM error, not that surprizing with PIC16. I doubt, if the code can compile at all. |
|
|
student Guest
|
compilation error |
Posted: Thu Jul 23, 2009 3:47 am |
|
|
I separated the assignment from definition. It reduced the no. of errors.
But I was able to compile the code successfully not until renaming the variable n to a, strange ! Isnt it ?
I compiled it on 18f452 and it used almost 15% of RAM. But failed on 16f877A.
FvM u was of great help ! Thnx a lot . |
|
|
Wayne_
Joined: 10 Oct 2007 Posts: 681
|
Re: compilation error |
Posted: Thu Jul 23, 2009 3:57 am |
|
|
student wrote: | I separated the assignment from definition.It reduced the no. of errors.
But I was able to compile the code successfully not until renaming the variable n to a , strange ! Isnt it ?
I compiled it on 18f452 and it used almost 15% of RAM.But failed on 16f877A.
FvM u was of great help ! Thnx a lot . |
As FvM stated
#define N 90
float cordic(int theta, int *s, int *c, int n)
CCS is not case sensitive so you are reusing N (n) They are the same. So not strange at all really
Probably |
|
|
bkamen
Joined: 07 Jan 2004 Posts: 1615 Location: Central Illinois, USA
|
|
Posted: Thu Jul 23, 2009 9:29 am |
|
|
I've always had the itch that case sensitivity was a bad idea.
If you think of N vs n or MyVar vs myvar... I always consider them the SAME to avoid confusion.
A different var/constant should have a different name to make sure that it doesn't get confused... AND THIS IS WHY.
:D
(Although I like to make constants ALL CAPS for my own edification and am happy when compiling blows up because I name a variable the same thing. Keeps me honest.)
Cheers,
-Ben _________________ Dazed and confused? I don't think so. Just "plain lost" will do. :D |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
|
|
|
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
|