Just a programming question

I have a value of 28.,000.,000 (yes, 28 million) as unsigned long

Then I do an adding of 800 as integer

This gives 28,000.,800 exaclty as espected.

But now instead of 800 as integer, I want to

add 800.25 so I get a value of 28,000,800.25

Or better explanation:

MarkT:

You are getting towards the limit of what 32 bits can represent, so you might need

to consider splitting the number into a long int part and a float to represent the

fractional part - writing an add/subtract routine isn't too hard, multiply/divide is going to

be "interesting"...

Yes, it is interesting, therefor the famous code

unsigned long tuning_word = (frequency * pow(2, 32)) / DDS_CLOCK;

digitalWrite (LOAD, LOW);shiftOut(DATA, CLOCK, LSBFIRST, tuning_word);

shiftOut(DATA, CLOCK, LSBFIRST, tuning_word >> 8 );

shiftOut(DATA, CLOCK, LSBFIRST, tuning_word >> 16 );

shiftOut(DATA, CLOCK, LSBFIRST, tuning_word >> 24 );

shiftOut(DATA, CLOCK, LSBFIRST, 0x0);

digitalWrite (LOAD, HIGH);

I do a temperature measurement with a DS18B20.

Normal temperature is 40 degree Celsius. But then

I read 39,94 degree Celsius. And I know I have a

drift of 4Hz/Celsius. So my tone is not 800Hz,

but 799,76Hz. Therefore I want to add 0,24Hz

to the 800Hz. To get the desired frequency

I also add 28.094.200Hz. My programmed

frequency is then 28.095.000,24Hz And then

is the drift corrected. And this all must be

bitshifted.

So my formula is: tuning_word = (28095000,24 * pow(2, 32)) / 125000000;

Ofcourse the 28095000,24 is variable

Didn't saw earlier, only with experimenting proofed (and a bit math)

The tuning_word has a resolution of 0.0291 so let round it to 0.03

For a change of eg. 24hz I need to add 800, hey it's an easy integer

Other advantage I saw, I use only 6 frequencies. But all these will

everytime new calculated (takes processor time). So why not 6

fixed tuning_word's

So problem solved to finetune a DDS