Zobrazení hodnoty napětí z ADCW jako desetinné číslo

Zdravím,
snažím se dostat z ADC převodníku hodnotu napětí. Jen se mi nedaří zobrazit desetiny. Z ADCW jsem získal hodnotu 807 což je podle převodu 3,94V. a mám tento kód:

[code]char results[10];
float res;

res=ADCW*5/1023;
lcd_gotoxy(0,1);
sprintf(results,"%3.2f",res);
lcd_puts(results);[/code]

tento kód mi udělá na pozici (3,1) otazník.

a pokud mám ukáže to 3:

[code]char results[10];
int res;

res=ADCW*5/1023;
lcd_gotoxy(0,1);
sprintf(results,"%d",res);
lcd_puts(results);[/code]

ano vím že pokud je to int, tak je pouze celočílesná číst a ukáže se 3. Bude to nějaká blbost, ale ať dumám jak dumám, nic jsem nevykutil :frowning: Nějaké tipy? Díky

:arrow_right: administrator: přejmenováno z "ADC výsledek na desetiny"

Cau, ja pro zobrazeni pouzivam “%3.1Lw” 3 cely, 1 desetiny, L int16 (f float,2u int), w desetiny, odpoledne sem hodim co mam v helpu

V Project-options-Libraries přidej knihovnu libm.a

V Custom options-Linker options přidej toto
-Wl,-u,vfprintf -lprintf_flt

Pak se podívej kolik to vyprodukuje kódu,
jestli nebude lepší počítat s pevnou desetinnou čárkou.

To platí pro Winavr.
Nechápu proč si každý tazatel myslí, že celá republika ví jaký on používá překladač.

https://forum.mcontrollers.com/t/teplomer-s-ds18b20-meri-na-4-des-mista-zmena-na-1-des-m/1176/1

Zajímavé, tehdy mu to šlo a teď ne.

Je to sice nepatrně odlišný případ, ale princip zůstává stejný. Výpočtem si tu desetin. část může uložit vedle a pak vypsat společně. Problém bych viděl spíš v programátorském myšlení a matice ZŠ :slight_smile:.

Omlouvám se že jsem rovnou nenapsal, že dělám ve winavr.

to: piityy čekal jsem že se moje minulé vlákno zde objeví, kdybych věděl přesně jak na to, tak to sem nepostuju. A chtěl jsem tipy ne hned posty jakej jsem idiot. Jsem naprostej začátečník, tak se chytám pomoci.

to AB: tehdy jsou zkoumal cizí kód a nebylo mě to jasné. teď zkouším prokudovat vlastní a narazil jsem

a pokud jsem to dobře pochopil, nemusím tam mít float ale 2 int jeden na zobrazení celého čísla 3 a pak připojím desetinou část těch 94?

Jak bys to dělal na papíře, kdybys neuměl dělit za desetinnou čárku?
res=ADCW5/1023; // cela cast
des=ADCW
5%1023; // zbytek po děleni, pro ADCW=807 je to 193. Vynásobim deseti a pak stejnej postup jako o řádek výše.
des=des105/1023; // = 9.4 = 9
2 des. místa => násobím stovkou. Pak je ale nutno pořeházet operace nebo použít širší dat.typ. Zbytek po dělení totiž může vyjít až 1024/5 = 204. Po vynásobení 2045100 jsi už mimo rozsah int. Tedy zbytek100/10235. Jednotlivé operace by bylo potřeba rozepsat do samostatných příkazů, jinak to kompiler zprasí. Pak už je otázka, co bude rychlejší.

Pro výrazné zkrácení doby výpočtu doporučuji nahradit dělení 1023 deseti posuvy doprava.
Postupů se dá vymyslet povícero, obzvlášť při požadavku na optimalizaci. Výkon ale asi teď není tvůj problém.

Princip počítání s pevnou desetinnou čárkou je ten,
že počítáme s čísly např. 1000x většími a do výsledku vložíme
na odpovídající místo desetinnou čárku (takže vydělíme zpátky tisícem).

[code]#define VREF 5000UL // reference [mV]

//---------------------------------------------------------------------
int main (void)
{
unsigned int adc_hodnota;
unsigned long napeti;
static char cela_cast[2];
static char desetiny[4];

napeti = VREF * adc_hodnota / 1024;
itoa(napeti/1000,cela_cast,10); // převede číslo na string
itoa(napeti%1000,desetiny,10);

lcd_puts(cela_cast);
lcd_putc(’.’);
lcd_puts(desetiny);
[/code]

to AB: díky to mi moc pomohlo, ještě jsem se koukal na příručku jak to mají tam, tam to bylo podobně a už vím jak na to :slight_smile: díky moc :slight_smile:

to piityy: díky, zkoušel jsem to, ale z nějakého důvodu se mi na displeji ukazovalo jen -14 (místo desetin), ale přišel bych na to proč, snad :slight_smile: