Próbuję uporządkować moją bibliotekę UART i nieco ją upiększyć, dodając kilka # definicji, dzięki czemu mogę ją później dostosować bez konieczności głębokiego zagłębiania się w kod, ale nie mogę uzyskać następującego fragmentu kodu pracy:C: Lekarstwo na ostrzeżenie: przekroczenie liczby całkowitej w wyrażeniu?
#define FOSC 8000000
#define BAUDRATE 9600
#define BRGVAL (FOSC/2)/(16*BAUDRATE)-1
void uart_init(){
U1BRG = BRGVAL;
}
Po BRGVAL kalkulacja staje 25.0416667, a ponieważ nie jest liczbą całkowitą otrzymuję następujące ostrzeżenie za to, że kiedy przypisać do U1BRG:
UART.c: W funkcji ' uart_init ':
UART.c: 24: ostrzeżenie: liczba całkowita przepełnienie w wyrażeniu
... a kod po prostu nie działa na docelowym sprzęcie. (Jeśli ręcznie wstawiam U1BRG = 25 działa to jak zaklęcie)
Czy istnieje sposób na wpisanie tej stałej do liczby całkowitej, aby kompilator był szczęśliwy?
Wielkie dzięki, Hamza.
Jaki jest typ U1BRG (i rozmiar tego typu)? –
Dlaczego uważasz, że BRGVAL staje się 25.0416667? Wszystkie komponenty wyrażenia w makrze są liczbami całkowitymi, więc gdy makro zostanie zastąpione, wyrażenie użyje do obliczenia arytmetyki liczb całkowitych. Problem, o którym ostrzega kompilator, to przepełnienie, a nie obcinanie zmiennoprzecinkowe. –
U! 1BRG jest unsigned int (16bits) i jest to kompilator MPLAB C30 – Hamza