Цитата(KRS @ Nov 21 2005, 17:57)

нет именно -0.5 бывает надо округлять в другую сторону
например
для 14400 и 8 mhz
(unsigned)((8000000/(14400*16))-0.5) = 34
а если счиать в целых и вычитать 1 будет 33
Согласен, но тогда допиши .0f после 16, иначе -253 будет

Вот так: (unsigned)((8000000/(14400*16.0f))-0.5) = 34
Но как раз в таких случаях встаёт проблема с округлением о которой я говорил.
Например может вместо 10.5 в выражении (Fosc/(_BAUD*16.0f)) получиться 10.4999999 и, отняв 0.5, мы получим 9.9999999, что обрежется до 9
Цитата(KRS @ Nov 21 2005, 17:57)

8000000/(14400*16)-1=33.722222 и надо окурглять вверх
Неа, будет -253
Чтобы получить 33.72, как в математике, надо в вещественных числах всё считать:
#define BAUD ((unsigned)(8000000/(14400*16.0f)-1))
и тогда дествительно можно отнимать 0.5 вместо 1, чтобы повысить точность при округлении.
Цитата(KRS @ Nov 21 2005, 17:57)

а 9.99999 получится если надо примерно 9.5 и в общем все равно куда округлять вверх или вниз.
Это справедливо, если ты считаешь через long, но тогда 0.5 вычитать не имеет смысла, т.к. вычитаешь ты его от уже целого числа и вычитание 0.5 равносильно вычитанию 1.
Ведь выражение 8000000/(14400*16) - целочисленное.
Вот идея для округления в целочисленной записи:
#define BAUD ((Fosc-(_BAUD*8L))/(_BAUD*16L))
И завязывайте писать слово BAUD через N
Сообщение отредактировал starter48 - Nov 21 2005, 12:35