Hallo,
Es wird ja der Wert von data_long auf den Werte Bereich passend zu 0.7
bis 2.3 ms skaliert.
1 | ((uint32_t)data_long * (SIG_0_7MS - SIG_2_3MS))/65535 + SIG_2_3MS;
|
waere shift right um 16 Stellen, also die Division durch 65536, nicht
einfacher und ausreichend genau, die Abweichung ist ja nur 1/65536 also
fast 1e-5.
Ausserdem sind es schlussendlich nur Werte zwischen SIG_2_3MS und
SIG_0_7MS,
die ja nur 0xb820..0xea20 = 0x3200 ueberstreichen.
1 | ((uint32_t)data_long * (SIG_0_7MS - SIG_2_3MS))>>16 + SIG_2_3MS;
|
Man koennte ja auch runden ;-)
1 | (((uint32_t)data_long * (SIG_0_7MS - SIG_2_3MS) + 1<<15)>>16 + SIG_2_3MS;
|
Die Aufloesung ist also nur 12800 verschiedene Werte und nicht 65536.