<!DOCTYPE html>
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  </head>
  <body>
    Jsem zvyklĂ˝ spíš používat float a teprve kdyĹľ nenĂ­ mĂ­sto, se floatu
    zbavit za cenu zesloĹľitÄ›nĂ­ programu. TĹ™eba na ATtiny416 je float
    skoro nereálnej, na ATmega32, nebo AVR64DD32 s nĂ­m nenĂ­ problĂ©m. Ono
    to hodnÄ› nabÄ›hne prvnĂ­m pouĹľitĂ­m, ale pak uĹľ moc nepĹ™ibĂ˝vá. A
    pĹ™ehlednost vĂ˝poÄŤtĹŻ se dramaticky zlepší.<br>
    <br>
    A ano, pĹ™i zobrazovánĂ­ ÄŤi odesĂ­lánĂ­ postupnÄ› dÄ›lĂ­m deseti, to snad
    ani jinak nejde:-)<br>
    Tzn. z mist se udÄ›lá násobitel, napĹ™. ze 2 je 100, tĂ­m se floatovĂ˝
    vstup vynásobĂ­ a pĹ™edhodĂ­ se funkci cislo(long). Ale dĹŻleĹľitĂ˝ je, Ĺľe
    se to stane aĹľ v uartSend.<br>
    <br>
    Pro mÄ› je dĹŻleĹľitĂ©, Ĺľe mezi změřenĂ­m a odeslánĂ­m jsou floatovĂ©
    vĂ˝poÄŤty. KdyĹľ se vejdou, zmizĂ­ veškerĂ© starosti s pĹ™etĂ˝kánĂ­m, co
    nastávajĂ­ pĹ™i celoÄŤĂ­selnĂ˝ch vĂ˝poÄŤtech a snaze o zachovánĂ­ pĹ™esnosti.<br>
    takĹľe pak máme tĹ™eba:<br>
    <br>
    #define AD_samples (1024.0)<br>
    #define AD_uInDiv   (1 + 110.0/10.0)<br>
    #define AD_uOutDiv (1 + 110.0/22.0)<br>
    #define AD_ref Â  Â  Â  Â  Â  (4.096)<br>
    ...<br>
    <br>
    kde ve funkci cekej je:<br>
    <br>
    if (adSync==1) {<br>
    Â Â Â  adSync=0;<br>
    Â Â Â  adUin = (adData[AD_first] - offset) * násobitel<br>
    Â Â Â  ...<br>
    pĹ™iÄŤemĹľ offset a násobitel jsou z tÄ›ch definĹŻ, nebo z EEPROM float
    eCalConst..., kde je vĂ˝chozĂ­ hodnota z tÄ›ch definĹŻ.<br>
    A zajĂ­mavÄ›jší je, kdyĹľ je vĂ˝stup tĹ™eba teplota z termistoru s
    charakteristikou B3950, nebo konduktometr, kde je ale z EMC a
    dalších dĹŻvodĹŻ na vstupu ještÄ› sĂ©riovej a paralaelnĂ­ R.<br>
    <br>
    Tabulky mĂ­vám na grafickĂ©m displeji, na to je pak tab(x), která
    posune příštĂ­ psanĂ­ na poĹľadovanou pozici, font je tĹ™eba i
    proporcionálnĂ­. Nebo jsem mÄ›l pole dispTabs, kde byly začátky na
    kterĂ˝ skoÄŤĂ­ \t. A to se dá zrovna celkem dobĹ™e použít i na sĂ©riáku,
    dÄ›lá to pak aĹľ putchar2, kdyĹľ mu pĹ™ijde \t a on vĂ­ kolik bylo od
    poslednĂ­ho \n.<br>
    Ale vizuálnĂ­ tabulky na sĂ©riáku moc nemĂ­vám, vÄ›tšinou max. takovĂ˝
    napĹŻl, kde se jen normálnÄ› pouĹľije \t. AĹľ kdyĹľ to zaÄŤne vadit,
    pĹ™idám uartTabs[].<br>
    <br>
    PH<br>
    <br>
    <div class="moz-cite-prefix">Dne 20.04.2024 v 14:01 Martin Záruba
      napsal(a):<br>
    </div>
    <blockquote type="cite"
      cite="mid:07035d67-bd13-4ca5-8b45-c6fcaf944dee@volny.cz">
      <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
      <p><font face="Arial">Nojo, jenĹľe pak s tĂ­m neudÄ›láte tabulku. Je
          potĹ™eba, aby například pokud je hodnota 3753, napsalo to
          |3753mV| ale pokud je 53, napsalo to |  53mV| a ne |53mV|.
          Tedy aby celĂ˝ Ĺ™etÄ›zec (vÄŤetnÄ› toho mV) byl stále (například) 6
          znakĹŻ.<br>
        </font></p>
      <p><font face="Arial">Zkusil jste, kolik to zabere pamÄ›ti? Podle
          toho, co píšete to dÄ›lá pĹ™evod na float. To ale na osmibitu je
          hrĹŻza. Já si hraju jen s "grafikou". ÄŚĂ­slo stále dÄ›lĂ­m deseti,
          to je i na osmibitu snadnĂ©. A vypisuji zbytek po dÄ›lenĂ­. No a
          nÄ›kam vrazĂ­m jakoukoli "vĂ˝plň", tĹ™eba tu teÄŤku. Pak to vypadá
          jako desetinnĂ© ÄŤĂ­slo, kterĂ© ale je v celoÄŤĂ­selnĂ©m formátu
          uloĹľeno tĹ™eba 10x 100x nebo jak se chce vÄ›tší, coĹľ je myslĂ­m
          ten nejefektivnÄ›jší zpĹŻsob, jak na malinkĂ©m procesoru zobrazit
          desetinnĂ© ÄŤĂ­slo.</font></p>
      <p><font face="Arial">Zkoušel jsem takĂ© použít ultoa(). Ale je to
          vÄ›tší a stejnÄ› musĂ­te vĂ˝sledek formátovat.</font></p>
      <p><font face="Arial">Napadlo mÄ› ještÄ› nejprve prvnĂ­ smyÄŤkou
          zjistit dĂ©lku masky a pak nadefinovat pole buf pomocĂ­ malloc.
          A na konci ho uvolnit. Pak by vÄ›tšinou bylo malinkĂ©. Co si
          myslĂ­te o tomto nápadu? <br>
        </font></p>
      <pre class="moz-signature" cols="72">Martin Záruba</pre>
      <div class="moz-cite-prefix">Dne 20.4.2024 v 12:29 Pavel HudeÄŤek
        napsal(a):<br>
      </div>
      <blockquote type="cite"
        cite="mid:674463bf-438e-4e67-88aa-34cf0e2f0c10@seznam.cz">
        <meta http-equiv="Content-Type"
          content="text/html; charset=UTF-8">
        Ne, v mĂ©m příkladu je pĹ™eci stav uBat1=3753,
        tak uartSend("\1mV", adUbat1, 0); vypíše 3753mV<br>
        Pokud by adUbat bylo 53, vypíše 53mV<br>
        a pokud by bylo zadáno uartSend("\1mV", adUbat1, 3);<br>
        vyleze 3753,000mV<br>
        nebo tĹ™eba 3753,001, pokud float hodnota nevyšla pĹ™esnÄ› 3753,000<br>
        <br>
        NÄ›jak tak to fungovalo, uĹľ je to dlouho.<br>
        Ale jak se tu o tom teÄŹ diskutuje a ještÄ› jsme na krouĹľku došli
        k sĂ©riáku, tak si asi koneÄŤnÄ› udÄ›lám tu knihovnu, kde tohle bude
        jedno z pĹ™etĂ­ĹľenĂ­.<br>
        <br>
        PH<br>
        <br>
        <div class="moz-cite-prefix">Dne 20.04.2024 v 11:27 Martin
          Záruba napsal(a):<br>
        </div>
        <blockquote type="cite"
          cite="mid:62da3616-1d24-431d-9cf0-0c397e03b07f@volny.cz">
          <meta http-equiv="Content-Type"
            content="text/html; charset=UTF-8">
          <p><font face="Arial">Jen dotaz: Co vypíše:</font></p>
          <p><font face="Arial">uBat1 je 53</font></p>
          <p><font face="Arial">uartSend("\1mV",adUbat1,0);<br>
            </font></p>
          <p><font face="Arial">nevypíše to</font></p>
          <p><font face="Arial">53mV      ?</font></p>
          <pre class="moz-signature" cols="72">Martin Záruba</pre>
          <div class="moz-cite-prefix">Dne 20.4.2024 v 10:36 Pavel
            HudeÄŤek napsal(a):<br>
          </div>
          <blockquote type="cite"
            cite="mid:cafe8589-63d8-448f-9f19-eb19f16669d4@seznam.cz">
            <meta http-equiv="Content-Type"
              content="text/html; charset=UTF-8">
            Tady asi došlo k mĂ­rnĂ©mu nedorozumÄ›nĂ­:<br>
            Oba umĂ­me zobrazit jen jednu hodnotu.<br>
            Oba umĂ­me poĹľadovanĂ˝ poÄŤet des. mĂ­st.<br>
            Oba umĂ­me text pĹ™ed nĂ­m i po nÄ›m.<br>
            Já nemám formátovánĂ­ tisĂ­cĹŻ, ale zas mĹŻĹľu ve vĂ˝stupnĂ­m textu
            použít #.<br>
            Zas to formátovánĂ­ s # se asi dá ohackovat, Ĺľe zobrazĂ­ tĹ™eba
            2 ÄŤĂ­sla zakĂłdovanĂ˝ do jednoho longu?<br>
            <br>
            // adUin je 12,3456  uBat1 je 3753<br>
            // UART_sendDT je ','  UART_sendPosChr je '\1'<br>
            uartSend("Uin=\1 V\n", adUin, 2);<br>
            uartSend("\1mV", adUbat1, 0);<br>
            vĂ˝sledek je:<br>
            Uin=12,34 V<br>
            3753mV<br>
            <br>
            Ten uartSend byl trochu prasáckej, mist nakopĂ­ruje do
            globálnĂ­ uartSendMist a pak zavolá cislo((long)(v * m)), kde
            m je tĹ™eba 1000 pro mist=3. A cislo pak do poĹľadovanĂ©ho
            mĂ­sta vnutĂ­ oddÄ›lovaÄŤ a uartSendMist vynuluje. Tohle jsem uĹľ
            nÄ›kde mÄ›l i na ty tisĂ­ce, jen se to nevypĂ­nalo samo.<br>
            <br>
            Chystám se Ĺľe bych si z tÄ›hle vÄ›cĂ­ koneÄŤnÄ› udÄ›lal nÄ›jakou
            knihovnu, zatĂ­m to jen kopĂ­ruju mezi projekty a nejÄŤastÄ›jc
            si vystaÄŤĂ­m s putchar2, text na poslánĂ­ textu a cislo na
            poslánĂ­ longu.<br>
            takĹľe poslednÄ› to bylo ve stylu<br>
            text("Uin="); cislo(static_cast<long>(1000.0*adUin));
            text(" mV\r\n");<br>
            <br>
            Buffer je na zásobnĂ­ku, takĹľe sám vznikne a sám zmizĂ­.<br>
            Ale 100 B, to je 20 % RAMky na ATtiny816, coĹľ je hodnÄ›,
            případnÄ› 1,25 % na AVR64DD32, to uĹľ by bylo v pohodÄ›.<br>
            MÄ› se to obecnÄ› nelĂ­bĂ­, protoĹľe rád používám dÄ›je na pozadĂ­.
            Funkce cekej(uint32_t ms) je i vĂ­c neĹľ pĹŻlka programu a
            pokud moĹľno všechno ÄŤekánĂ­ volá aspoň cekej(0). No a kdyĹľ se
            tÄ›ch ÄŤekánĂ­ sejde vĂ­ce takovĂ˝ch, kde mezitĂ­m vzniknul
            buffer..<br>
            TakĹľe mám snahu takovĂ© buffery nedÄ›lat.<br>
            Další vÄ›c je, Ĺľe mám snahu minimalizovat mĂ­sta, kde je
            potĹ™eba omezovat velikost stringu. TakĹľe mÄ› staÄŤĂ­ buffer na
            10B celej vstup mĹŻĹľe mĂ­t 254, vĂ˝stup aĹľ 264 a ve verzi s
            txtPred + txtPo mĹŻĹľou klidnÄ› oba texty mĂ­t do 254.<br>
            <br>
            Ovšem to s F a PSTR je pro mÄ› novinka, za to dĂ­ky.<br>
            <br>
            Byl jsem zvyklĂ˝ na codevision, tam se daly deklarovat
            promÄ›nnĂ© do RAM, EEPROM i Flash, "text" byl ve flash a
            všechno fungovalo do velkĂ© mĂ­ry samo, vÄŤetnÄ› toho, Ĺľe v
            EEPROM je pointer do flash. Super vÄ›c, pokud se po kompilaci
            k binárce sprostÄ› pĹ™ikopĂ­rujou UTF8 texty ve 4 jazycĂ­ch a za
            nÄ› bitmapa fontĹŻ. PĹ™i prvnĂ­m spuštÄ›nĂ­ program ve flash najde
            "Tady>>>", pak dohledá začátky jazykĹŻ, hlášky v
            default jazyku a nakonec font. Pointery hodĂ­ do EEPROM a
            odteÄŹ se mĹŻĹľe na displeji 10 ms po zapnutĂ­ objevit tĹ™eba
            normálnĂ­ ÄŤeština.<br>
            A v případÄ› GCC jsem si myslel, Ĺľe nic uĹľ takhle elegantnÄ›
            nepĹŻjde.<br>
            VlastnÄ› opravdu nejde, protoĹľe si sice mĹŻĹľu nadeklarovat
            promÄ›nnou v EEPROM, ale nemĹŻĹľu jĂ­ přímo používat, jen pĹ™es
            funkce na ÄŤtenĂ­ a zápis EEPROM, kterĂ˝ maj navĂ­c hroznÄ›
            dlouhĂ˝ názvy. "Super" do vzorce se 3 kalibraÄŤnĂ­ma
            konstantama.<br>
            Tak aspoň snad zas mĹŻĹľu mĂ­t texty ve flash:-)<br>
            <br>
            PH<br>
            <br>
            <div class="moz-cite-prefix">Dne 19.04.2024 v 21:23 Martin
              Záruba napsal(a):<br>
            </div>
            <blockquote type="cite"
              cite="mid:ab12d61f-7c9b-4434-9138-43db4d9875b4@volny.cz">
              <meta http-equiv="Content-Type"
                content="text/html; charset=UTF-8">
              <p><font face="Arial">Já to tak pĹŻvodnÄ› dÄ›lal, jenĹľe byl
                  to mnohem sloĹľitÄ›jší a vlastnÄ› mĹŻĹľete takto udÄ›lat jen
                  ÄŤĂˇst neĹľ narazĂ­te na prvnĂ­ formátovacĂ­ znak. Pak uĹľ je
                  to stejnÄ› jen odeslánĂ­ ÄŤĂ­sla. protoĹľe nevĂ­te, zda
                  nebude následovat další formátovacĂ­ znak po libovolnĂ©
                  poÄŤtu "vĂ˝plnĂ­". Tvar text,val, mĂ­st se mi nelĂ­bil,
                  protoĹľe s nĂ­m neudÄ›láte tĹ™eba 10mV. Takto je text
                  kdekoli, dokonce je kdekoli i tĹ™eba \n, takĹľe nemá
                  smysl println. A varinta txtPred, val, mĂ­st, txtPo to
                  sice umĂ­, ale jsou 4 parametry a stejnÄ› nejde udÄ›lat
                  tĹ™eba odskoÄŤenĂ© tisĂ­ce. Taky se mi lĂ­bĂ­, Ĺľe to seĹľere
                  i float. PĹ™edpokládĂ­m, Ĺľe buffer se vytvoří na
                  zásobnĂ­ku a po opuštÄ›nĂ­ funkce zmizĂ­. Je to tak?</font></p>
              <p><font face="Arial">JeštÄ› to chci doplnit o moĹľnost mĂ­t
                  formátovacĂ­ Ĺ™etÄ›zec ve flash. NenĂ­ mi ale jasnĂ©, jakĂ˝
                  je rozdĂ­l mezi PSTR("V pamÄ›ti flash") a F("V pamÄ›ti
                  flash"). Asi se mi vĂ­c lĂ­bĂ­ F(" "), je to kratší zápis
                  a dovoluje pĹ™etĂ­ĹľenĂ­ funkce. Ale moĹľná má nÄ›jakou
                  nevĂ˝hodu, na kterou jsem nepĹ™išel.<br>
                </font></p>
              <pre class="moz-signature" cols="72">Martin Záruba</pre>
              <div class="moz-cite-prefix">Dne 19.4.2024 v 20:50 Pavel
                HudeÄŤek napsal(a):<br>
              </div>
              <blockquote type="cite"
cite="mid:b4bb63a0-c0e8-4e00-bb0f-836ae08e652c@seznam.cz">Moc pÄ›knĂ˝. <br>
                Já bych teda akorát nekopĂ­roval celĂ˝ text do velkĂ©ho
                bufferu a mĂ­sto toho text pĹ™ed ÄŤĂ­slem rovnou odesĂ­lal v
                prvnĂ­m do/while, pak pĹ™eved a odeslal ÄŤĂ­slo a nakonec
                odeslal zbytek vstupnĂ­ho textu. <br>
                <br>
                UĹľ jsem taky kdysi pouĹľil variantu, kdy se zadávajĂ­
                parametry (text, val, mist) a v textu je pak znak pro
                umĂ­stÄ›nĂ­ ÄŤĂ­sla a des. mĂ­st se odešle podle hodnoty mist.
                ÄŚastÄ›jc mám ale (txtPred, val, mist, txtPo). <br>
                <br>
                OdesĂ­lánĂ­ mám teda tĂ©měř vĹľdy rovnou prĹŻběžnÄ› po znacĂ­ch
                a odesĂ­lacĂ­ funkce ÄŤeká jen na dokonÄŤenĂ­ pĹ™edchozĂ­ho
                znaku, takĹľe konverze na vĂ˝stupnĂ­ text probĂ­há paralelnÄ›
                s odesĂ­lánĂ­m. <br>
                <br>
                PH <br>
                <br>
                Dne 19.04.2024 v 19:23 Martin Záruba napsal(a): <br>
                <blockquote type="cite">UĹľ jsem se Vás dost natrápil na
                  toto tĂ©ma a mÄ›l jsem pocit, Ĺľe nic moc ĂşspornĂ©ho a
                  jednoduše pouĹľitelnĂ©ho nenĂ­. JenĹľe jsem paliÄŤatĂ˝ a
                  zkusil jsem pĹ™ece nÄ›co vymyslet. PoĹľadavek byl: <br>
                  <br>
                  VĂ˝pis na poĹľadovanĂ˝ poÄŤet mĂ­st s moĹľnostĂ­ textu pĹ™ed i
                  za ÄŤĂ­slem. <br>
                  <br>
                  PotlaÄŤenĂ­ nevĂ˝znamnĂ˝ch nul. <br>
                  <br>
                  Co nejĂşspornÄ›jší kĂłd jak funkce, tak volánĂ­, vhodnĂ˝
                  pro malinky procesor. <br>
                  <br>
                  PřímĂ˝ tisk bez nutnosti psanĂ­ Serial.print(); <br>
                  <br>
                  Vyrobil jsem toto, posuÄŹte a navrhnÄ›te prosĂ­m co by
                  ještÄ› Ĺˇlo lĂ­p. <br>
                  <br>
                  <br>
                  void pr(int32_t h, const char* f) { <br>
                  Â  char buf[100]; <br>
                  Â  uint8_t i = 0xFF; <br>
                  Â  int32_t x = abs(h); <br>
                  Â  do { <br>
                  Â Â Â  i++; <br>
                  Â Â Â  buf[i] = f[i]; <br>
                  Â  } while (f[i] != 0); <br>
                  <br>
                  Â  do { <br>
                  Â Â Â  i--; <br>
                  Â Â Â  if (buf[i] == '#') { <br>
                  Â Â Â Â Â  if (x != 0) { <br>
                  Â Â Â Â Â Â Â  buf[i] = x % 10 + (uint8_t)'0'; <br>
                  Â Â Â Â Â Â Â  if (h < 0 && x < 10) { <br>
                  Â Â Â Â Â Â Â Â Â  i--; <br>
                  Â Â Â Â Â Â Â Â Â  buf[i] = '-'; <br>
                  Â Â Â Â Â Â Â  } <br>
                  Â Â Â Â Â  } else { <br>
                  Â Â Â Â Â Â Â  buf[i] = ' '; <br>
                  Â Â Â Â Â  } <br>
                  Â Â Â Â Â  x /= 10; <br>
                  Â Â Â  } <br>
                  Â  } while (i != 0); <br>
                  Â  Serial.print(buf); <br>
                  } <br>
                  <br>
                  <br>
                  Funkce má jedinĂ˝ formátovacĂ­ znak # <br>
                  <br>
                  Příklady: <br>
                  <br>
                  int32_t napetimV = 5432; <br>
                  pr(napetimV, "Pokus1=###.###V\n"); <br>
                  pr(-21, Â  Â Â  "Pokus2=### zaporne cislo\n"); <br>
                  pr(9876543,  "Pokus3=# ### ### cislo s mezerami po
                  1000\n"); <br>
                  float a = 54.3; <br>
                  pr(a*10,     "Pokus4=####.# vypis float na 1 desetinne
                  misto\n"); <br>
                  <br>
                  VĂ˝sledek vypadá takto: <br>
                  <br>
                  Pokus1=  5.432V <br>
                  Pokus2=-21 zaporne cislo <br>
                  Pokus3=9 876 543 cislo s mezerami po 1000 <br>
                  Pokus4=   54.3 vypis float na 1 desetinne misto <span
                  style="white-space: pre-wrap">
</span></blockquote>
              </blockquote>
            </blockquote>
          </blockquote>
        </blockquote>
      </blockquote>
    </blockquote>
  </body>
</html>