[ mst.petrovic @ 31.08.2014. 08:30 ] @
pozdarv svima,
imam problem koji je mozda vama smesan ali meni nije...
Kako da promenljivu tipa float koju lcd prikazuje kao 3.499999 prikazem kao 3.49 (nebitno mi je zaokruzivanje). Koristim mikro C.
unapred hvala!!!

[Ovu poruku je menjao mst.petrovic dana 31.08.2014. u 11:26 GMT+1]
[ bogdan.kecman @ 31.08.2014. 10:30 ] @
Code:

float x;

...
x = (float)((int)x*100) / 100.0F; //x je sad zaokruzena na 2 decimale
...



proveri da li mikroC printf ima mogucnost da formatira float izlaz
u normalnom C-u mozes da uradis

Code:

printf("%.2f\n", x);


i on ce ti prikazati samo 2 decimale
[ mst.petrovic @ 31.08.2014. 10:36 ] @
Bogdane,
hvala ti na odgovoru, od tebe sam ga i ocekivao... :D!!!

jedini problem je sto printf ne mogu da napisem u mikroc-u.
[ bogdan.kecman @ 31.08.2014. 10:53 ] @
ako ne radi printf u mikroc-u radi ti prvi primer kako da iseces
varijablu na samo 2 cifre posle decimalne tacke
[ mst.petrovic @ 31.08.2014. 11:09 ] @
Bogdane,
evo ga deo koda koji je sporan. i dalje nece da radi... posle ovoga meni izbaci samo broj 3

Code:

char *value_pd="000";
float pdp=3.5,pdps=0;
/************************ovo je deo rutine za menjanje vrednosti enkodera 

if(count1>7)
            {
              pdp=pdp+0.1;                  // uvecaj za 0.1
              count1=6;
            }
             if(count1<5)
            {
              pdp=pdp-0.1;                  // umanii za 0.1
              count1=6;
            }
/*****************************

pdps = (float)((int)pdp*100) / 100.0F; //x je sad zaokruzena na 2 decimale
FloatToStr(pdps,value_pd);
Lcd_out(3,10,value_pd );

[ bogdan.kecman @ 31.08.2014. 11:13 ] @
dodaj jos jedne zagrade

pdps = (float)((int)(pdp*100)) / 100.0F;
[ mst.petrovic @ 31.08.2014. 11:35 ] @
[ bogdan.kecman @ 31.08.2014. 11:35 ] @
taj video ti je private
[ mst.petrovic @ 31.08.2014. 11:40 ] @
sada nije...
[ bogdan.kecman @ 31.08.2014. 12:00 ] @
mikroC je tu bas $%#@%@!#$ ... sta da ti kazem ... moraces onda malo drugacije

Code:


int TEMP;

char *value_pd="000";
float pdp=3.5,pdps=0;
/************************ovo je deo rutine za menjanje vrednosti enkodera 

if(count1>7)
            {
              pdp=pdp+0.1;                  // uvecaj za 0.1
              count1=6;
            }
             if(count1<5)
            {
              pdp=pdp-0.1;                  // umanii za 0.1
              count1=6;
            }
/*****************************


TEMP = pdp*100;
pdps = TEMP / 100.0F;
FloatToStr(pdps,value_pd);
Lcd_out(3,10,value_pd );
[ bogdan.kecman @ 31.08.2014. 12:02 ] @
btw float je uzasno spor i uzima uzasno mnogo flash-a .. posebno kod mikroC koji to radi prilicno "nogama" .. razmisli da sta god tu radis predjes u int racunicu ..
izracunas u odnosu na to sto radis kolika ti je tacnost potrebna i sve racunas sa intovima * neka vrednost .. ja na primer za temperaturu gde mi je 2 decimale dovoljna tacnost racunam sve u *1000 .. imas full int math koji je extra brz i trosi nista flash-a i samo krajnje vrednosti koristis tako sto znas da su *1000 u odnosu na pravu vrednost ..
[ mst.petrovic @ 31.08.2014. 12:08 ] @
ok,
mislim da si u pravu... imao sam to resenje na pocetku ali sam hteo da ga resim preko floata... izgleda da sam mnogo tvrdoglav... vracam se na int
hvala puno!!!
[ bogdan.kecman @ 31.08.2014. 12:17 ] @
float je super ako ga podrzava mcu. softwerska float implementacija nije
problem, poznata je i prezvakana mnogo puta, biblioteke su free i vecina
kompajlera ih koristi as-is, problem je sto tu nema nikakve optimizacije
i to je na samom kompajleru da odradi, mikroC to ne ume .. (nije ni XC8
nista bolji po tom pitanju, ali bar ime da isparsira onu liniju kako
treba). e sad, nekad ti je neophodan full float support i u tom slucaju
zagrizes i iskoristis isti ali najcesce ti ne treba float i onda je
bolje da ga samo izsimuliras.. kod mikroC je jos posebno smor sto on ne
ume da izbaci delove koda koji se ne koriste tako da i malo koristenje
float-a uvuce celu ieee754 biblioteku .. no ako se dobro secam jos su je
nesto oni budzili pa zapis nije ieee754 vec "malo" drugaciji .. ne znam
sta bi ti rekao, mnogo mi je draga ta firma ali mi taj kompajler ide na
ganglije sve vise kako prolazi vreme ... mcp je isto smorio sa xc8 a
izgleda su u novijim verzijama upropastili i xc16 i xc32 .. sva sreca da
sam na vreme pobegao skroz sa pic platforme .. sto se kompajlera tice
atmel je milion puta bolji/otvoreniji .. sad jbg ja i dalje mislim da je
mcp zgodniji sto se hw-a i dostupnosti tice ... mrka kapa .. gde god
krenes ako ne ides sa puno para kostace te ko svetog petra kajgana ..

u svakom slucaju, onako kako sam ti napisao (sa TEMP int promenjljivom)
to mora da radi ... e sad ti vidi, ako imas free mesta u flash-u i nije
ti oglavu za brzinu to ce da radi ... ako ti ponestane flash-a ukini
float i odradi to sa intom