Целочисленное переполнение означает, что вы превысили верхний предел значения int, который, вероятно, будет 32767, если вы получаете эту ошибку. Это не имеет ничего общего с плавающей точкой; указанные вами операции на самом деле являются целочисленными математическими операциями, поэтому дробная часть деления в любом случае отбрасывается.
Попробуйте что-то вроде этого:
#define FOSC 8000000L
#define BAUDRATE 9600L
#define BRGVAL ((unsigned int)((FOSC/2)/(16*BAUDRATE)-1))
void uart_init(){
U1BRG = BRGVAL;
}
Суффикс L превращает эти константы в тип long
вместо типа int
. Приведение (unsigned int)
преобразуется в тип U1BRG и позволяет компилятору понять, что вы понимаете, что значение long
будет помещаться в unsigned int
, и, таким образом, скрывать любые предупреждения, которые оно может выдать вам.
Обычно замалчивать предупреждения компилятора - это плохая практика, но в этом случае ясно, что, хотя вам необходимо long
для хранения промежуточных значений в вычислениях, конечный результат будет помещаться в unsigned int
.