ryan.reeve
New Member
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
int32 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(int32 theta, int32 *s, int32 *c, int32 n)
{
int32 k, d, tx, ty, tz;
int32 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;
int32 *s, *c;
angle=N-angle;
angle=angle*Pi/180;
res=cordic((angle*MUL), &s ,&c,32);
return res;
}
float sin(float angle)
{
float res;
int32 *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...
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
int32 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(int32 theta, int32 *s, int32 *c, int32 n)
{
int32 k, d, tx, ty, tz;
int32 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;
int32 *s, *c;
angle=N-angle;
angle=angle*Pi/180;
res=cordic((angle*MUL), &s ,&c,32);
return res;
}
float sin(float angle)
{
float res;
int32 *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...