Global Constants

I was wondering how I could make a global constant for a trig lookup table.

You can use a #define statement in a globally-included header file to create global constants. You can also use extern to define global variables.

When I use extern would the variable be placed in user memory? I have 2k of data for the lookup tables in the trig (this is very little for the 32k of rom space available) and don’t want to put these non changing variables in the ram. A define doesn’t help because this is an actual table containing data not just one macro that can be quickly changed.

Unfortunately the extern will be placed in the user memory so, if there is no other way, you might have to try to minimize your table :frowning: .

couldnt you declare the table rom? look in the c18 compiler reference guide, i think you could just declare


const rom int trig_lookup] = {/*info here*/}

and it will put it in rom… you should probably check on that though.

Ahhh thank you, it appears that should work out well, now the table won’t have to be minimized. Seeings as how I don’t have the C Reference available and am not able to attend meetings for now due to Academic problems, would you declare this in the header or the C file?

you would declare it and define it without extern in one .c file, and declare it extern in all other .c files that you want to use it in.

Thank you for your time.

deltacoder already wrote some excellent trig lookup code:

Check the repository: http://nrg.chaosnet.org/repository/index?folder=General%20C%20Code

note - the code in the repository does not currently utilize the “rom” keyword - it’s meant to be compiler/platform independent. I would recommend the addition of the rom and const keywords to the definition of the table array, like so:

const rom unsigned char SIN_LOOKUP[90]

I think my trig code will run fine,
It has a lookup table with 1440 16-bit values and my sine and cosine functions take very little hit to performance. The angle I use is also in 16-bit straight from the gyro which makes this whole thing very high precision which will be increadably useful for the new drive style (Arcade) I developed and hopefully will get to test Wednesday.

The reason for so many values is that we have 32k of rom sitting there doing nothing. Infact it would be a much more efficient way to calculate out 8-bit values for your angles and multiply it by a 8-bit number for your hypontenuse then shift right by 8. That essentially does floating point for you without the performance hit. Doing it with 16-bits can be a bit trickier but the same principle applies.

essentially, that is what my code does - it stores 8-bit values for the sin function, and then returns those. for newer programmers however, there is also an implementation of the base sin() and cos() functions that return a floating point (basically, the lookup / 255).

Ryan:
Can you post your code at the repository? (You’ll need to register)

Posted the code but plum forgot to describe how the values in the table should run, basically they should run something like this, borrowed the table from deltacoder to show as an example. The table can be generated by using
ti=cos(PI / 2 * i / M) * 255
where ti is the table element, i is the element number and M is the number of table elements

cos_lookup_table[90] =
{ 0, 4, 9, 13, 18, 22, 27, 31, 35, 40,
44, 49, 53, 57, 62, 66, 70, 75, 79, 83,
87, 91, 96, 100,104,108,112,116,120,124,
128,131,135,139,142,146,150,153,157,160,
164,167,171,174,177,180,183,186,190,192,
195,198,201,204,206,209,211,214,216,219,
221,223,225,227,229,231,233,235,236,238,
240,241,243,244,245,246,247,248,249,250,
251,252,253,253,254,254,254,255,255,255 };

What exactly do you mean by “globally-included header file”? When you use #define to create a global constant, it does not have a type. Do you have to typecast it whenever you use it?

For example:


**user_routines.c**
#define axelWidth 1234
...
void fn(void)
{
...
x*=axelWidth;      //Can it be this?
x*=(int)axelWidth; //Or must it be this?
x=x*(axelWidth);   //This seems to be the only form that the compiler likes
...
}
...

In C++ you can declare global constants using const varType varName = * initialValue;* Is this acceptable in C?

Please clarify!!!

Please read the pdf document MPLAB® C18 C COMPILER USER’S GUIDE which was included on the CDROM that had MPLAB. All your questions will be answered.

Beware comparing C++ with C. C has been around since 1974 and has changed very little in all these years. ANSI complient C is a standard and C++ is a different animal.

I meant that you can use a #define statement in a header (for example “globals.h”) that is included in any file that needs that variable. When you use a #define statement the variable name that you create will be replaced later (not sure of which but either by the compiler or the linker…probably compiler). Hence, the variable that you create with #define would be constant, you can not modify it. You can, however define variables using extern which would be globally accessable (see ‘Global Variables, anyone?’](http://www.chiefdelphi.com/forums/showthread.php?t=24810)).

Unfortunately I am more of a C++ programmer, myself, so I do not really know an answer to this one. Perhaps somebody else can field this question?‘Global Variables, anyone?’](http://www.chiefdelphi.com/forums/showthread.php?t=24810)

If it is in a header, then you can is a const in any file that includes the header