Препроцессор не умеет считать, его функция - развернуть все определённые в программе #define-ы, включить все #include-ы и т.п. Собственно обсуждаемая константа формируется компилятором, и то, что полученное значение неверно, значит, что #include составлен неправильно.
В первом случае BAUND присваивался char-у или int-у, и компилятор привёл константы к соотв. типу, результат, конечно, получился не тот, что нужно. Правильно было бы указать тип констант явно:
Код
#define _BAUND 9600L
#define Fosc 4000000L
#define BAUND ( (Fosc/(_BAUND*16L))-1L )
Дальше не разбирался, но могу предположить, что при разворачивании одного из макросов нарушается порядок выполнения арифметических операций, что-то вроде этого:
Код
#define N 2*2 /* 4/N разворачивается в 4/2*2, т.е. 4, а не 1, как задумывалось */
Чтобы этого избежать, макросы обычно заключаются в скобки:
Код
#define N (2*2) /* 4/N разворачивается в 4/(2*2) */