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:
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 Nějaké tipy? Díky
administrator: přejmenováno z "ADC výsledek na desetiny"
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Š .
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=ADCW5%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);