AP2k
2007-05-17
In the PIC archy, the baud rate register needs a value equal to Fosc/(16*DesiredBaudRate) - 1. Obviously the math doesnt always make an int. I would want to take that definition and use some round() function on it to make it into an int. However, this obviously will take some processor time every time I try to evaluate it supposing that there is no optimization for round(someDefinedNumber).
I have a definition for OSC_FREQ, USART_BAUD, and the factor 16 is obvious. The compiler will normally optimize this through arithmetic, but how should I go about rounding the number?
Frieder Ferlemann
2007-05-17
you could use the macro:
#define DIVIDE_ROUNDED(x,y) (((x)+(y)/2)/(y))
if x and y are literals then the expression should be
calculated at compile time and cause no runtime overhead.
(If y is something with a side-effect you probably
won't be completely happy with this macro)
Maarten Brock
2007-05-18
How about
#define DIVIDE_ROUNDED(x,y) (((x)/(float)(y))+0.5)
or use
(OSC_FREQ / (16.0 * USART_BAUD)) - 0.5
There are no side-effect problems. All floating point arithmetic is done by the compiler at compile time and the result is cast to integer type at compile time too when assigning to the register.