Hej mam taki problem z kompilatorem AVR GCC - na moj gust zglupial lub pewnei robie cos zle. jest takie powiedzenie, jesli twierdzisz ze kompilator jest glupi - idz spac. ale nie w tym rzecz. mam wynik pomiaru w postaci liczby 32 bit (wynik z ukladu TCD pomiaru czasu z rozdzielczoscia 7ps(sic!)) i potrzebuje go przemnozyc przez stala 7.629453 nie chce uzywac arytmetyki zmiennoprzecinkowej, zreszta z jakis powodow ona tez nie dziala.
wersja zmiennoprzecinkowa float calc_temp; uint32_t calc_temp1; calc_temp1 = TDC_Read(0); if (calc_temp1 != 0xFFFFFFFF) //overrange detection { calc_temp = (calc_temp1*7.629453); tlcd_write_U32((U32)calc_temp); tlcd_write_string("ps"); } else tlcd_write_string(" OVR ");
no i wynik nie dosc ze jest bez sensu to zawija sie gdzies przy 16 bitach, ale to musze dokaldneij sprawdzic
wersja integer:
uint64_t calc_temp; U32 calc_temp1; calc_temp1 = TDC_Read(0); if (calc_temp1 != 0xFFFFFFFF) //overrange detection { calc_temp = (calc_temp1*7629453UL)/1000000UL; //result in ps tlcd_write_U32((U32)calc_temp); tlcd_write_string("ps"); } else tlcd_write_string(" OVR ");
Wynik wydaje zawijac sie gdzies na 16 bitach lub wczesniej. nie pomaga zadeklarowanie liczb jako 1000000ULL, jedyny efekt uboczny to taki ze objetosc kodu zwieksza sie o 4KB - widac kompilator wlacza biblioteki 64bit?? o robie zle? pewnie znow sie okaze ze gdzies do zmiennej powinienem byl dodac jakas literke...
z innej beczki: czy spotkaliscie sie z bibliotekami w C konwerujacymi np U32 na BCD? napisalem sobie wlasne,ale na pewno nie sa optymalne jesli chodzi o kod, a pewnie istnieja gdzies eleganckie napisane w ASM...