<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  </head>
  <body>
    <div class="moz-cite-prefix">Jo, to bych udelal taky, ale nejdriv
      bych pouzil STM32 abych nebojoval s pameti, nemel problemy s
      poctem casovacu, neresil ze 64 celociselnych bitu je vypocetni
      problem, na float neni HW podpora a pro ADC a UART pouzil DMA...</div>
    <div class="moz-cite-prefix">Ale je to projekt do skoly, material je
      nejak dan... Samozrejme to jde libovolne programovat vlastnimi
      silami, ale popravde nemam naladu zkoumat periferie AVR...</div>
    <div class="moz-cite-prefix">At si mladej zkusi uskali arduino
      reseni, ono se mu to bude hodit ;-)<br>
    </div>
    <div class="moz-cite-prefix"><br>
    </div>
    <div class="moz-cite-prefix">Dne 13.04.2021 v 21:22 Pavel Hudecek
      napsal(a):<br>
    </div>
    <blockquote type="cite"
      cite="mid:8.MxiO%7D.mZGNDy5P78.1WTUz%7D@seznam.cz">
      <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
      <meta name="Generator" content="Microsoft Word 15 (filtered
        medium)">
      <style>@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0cm;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}.MsoChpDefault
        {mso-style-type:export-only;}div.WordSection1
        {page:WordSection1;}</style>
      <div class="WordSection1">
        <p class="MsoNormal">Nevím jestli na Arduinu nějak snadno jde si
          napsat SW úplně svůj se vším všudy, ale já bych:</p>
        <p class="MsoNormal">- Timerem generoval tu PWM</p>
        <p class="MsoNormal">- Tímtéž 1ms přerušení pro svoje další
          časování</p>
        <p class="MsoNormal">- ADC nechal běžet a generovat přerušení</p>
        <p class="MsoNormal">- Změřené výsledky zpracovávat jako
          vedlejší činnost ve funkci pro čekání</p>
        <p class="MsoNormal"><o:p> </o:p></p>
        <p class="MsoNormal">PH</p>
        <p class="MsoNormal"><o:p> </o:p></p>
        <p class="MsoNormal"><o:p> </o:p></p>
        <div
          style="mso-element:para-border-div;border:none;border-top:solid
          #E1E1E1 1.0pt;padding:3.0pt 0cm 0cm 0cm">
          <p class="MsoNormal" style="border:none;padding:0cm"><b>Od: </b><a
              href="mailto:jaroslav.buchta@hascomp.cz"
              moz-do-not-send="true">Jaroslav Buchta</a><br>
            <b>Odesláno:</b>úterý 13. dubna 2021 21:01<br>
            <b>Komu: </b><a href="mailto:hw-list@list.hw.cz"
              moz-do-not-send="true">hw-list@list.hw.cz</a><br>
            <b>Předmět: </b>Re: AVR arduino potize</p>
        </div>
        <p class="MsoNormal"><o:p> </o:p></p>
        <p class="MsoNormal">Tak jsem to trosku prepsal, takhle to na
          osciloskopu trva 180us a s AD </p>
        <p class="MsoNormal">prevodem necelych 300us. Velke rezervy tam
          nejsou.</p>
        <p class="MsoNormal">Mimochodem, da se v arduinu nejak jednoduse
          pouzit ADC asynchronne? Ze </p>
        <p class="MsoNormal">spustim prevod a az je dokoncen, zpracuju,
          mezitim delam neco jineho... ?</p>
        <p class="MsoNormal">Seriak funguje tusim zasadne synchronne?</p>
        <p class="MsoNormal"><o:p> </o:p></p>
        <p class="MsoNormal">int16_t CDataProc::GetSignal()</p>
        <p class="MsoNormal">{</p>
        <p class="MsoNormal">     uint32_t ms = millis();</p>
        <p class="MsoNormal">     if (ms - lastMillis > 0)</p>
        <p class="MsoNormal">     {</p>
        <p class="MsoNormal">         uint16_t sensorValue =
          (uint16_t)analogRead(A0);</p>
        <p class="MsoNormal">         digitalWrite(13, HIGH);</p>
        <p class="MsoNormal">         cycles++;</p>
        <p class="MsoNormal">         if (firstPass){</p>
        <p class="MsoNormal">             valAvgFilt =
          ((uint64_t)sensorValue << 24) | 0x7fffffUL;</p>
        <p class="MsoNormal">             valSignalFilt =
          ((uint32_t)sensorValue << 8) | 0x7f;</p>
        <p class="MsoNormal">             firstPass = false;</p>
        <p class="MsoNormal">         }</p>
        <p class="MsoNormal">         else</p>
        <p class="MsoNormal">         {</p>
        <p class="MsoNormal">             while (ms - lastMillis > 0)</p>
        <p class="MsoNormal">             {</p>
        <p class="MsoNormal">                 lastMillis++;</p>
        <p class="MsoNormal">                 valAvgFilt =
          (valAvgFilt*(coefAvg-1) + </p>
        <p class="MsoNormal">(((uint64_t)sensorValue << 24) |
          0x7fffffUL))/coefAvg;</p>
        <p class="MsoNormal">                 valSignalFilt =
          (valSignalFilt*(coefSignal-1) + </p>
        <p class="MsoNormal">(((uint32_t)sensorValue << 8) |
          0x7f))/coefSignal;</p>
        <p class="MsoNormal">             }</p>
        <p class="MsoNormal">         }</p>
        <p class="MsoNormal">         Message();</p>
        <p class="MsoNormal">         digitalWrite(13, LOW);</p>
        <p class="MsoNormal">     }</p>
        <p class="MsoNormal">     return (int16_t(valSignalFilt >>
          8)) - (int16_t(valAvgFilt >> 24));</p>
        <p class="MsoNormal">}</p>
        <p class="MsoNormal"><o:p> </o:p></p>
        <p class="MsoNormal">Dne 13.04.2021 v 20:33 Jaroslav Buchta
          napsal(a):</p>
        <p class="MsoNormal">> Diky za tip s tim casovacem, necekal
          jsem, ze se da spatne udelat i </p>
        <p class="MsoNormal">> 1ms timer ;-)</p>
        <p class="MsoNormal">> Vypocty to stiha, predtim to bylo jen
          32b a chodilo to stejne, kdyz to </p>
        <p class="MsoNormal">> rozsirim na cely program, ktery toho
          pocita 10x tolik tak se taky nic </p>
        <p class="MsoNormal">> nezmeni. Az budu mit cas, pro
          zajimavost si udelam pulzy na nejakem IO </p>
        <p class="MsoNormal">> a zmerim, jak to dlouho trva.</p>
        <p class="MsoNormal">><o:p> </o:p></p>
        <p class="MsoNormal">> Dne 13.04.2021 v 20:28 Martin Locker
          napsal(a):</p>
        <p class="MsoNormal">>> Ještě teď koukám, že ty výpočty
          nejsou zcela triviální. Ono násobení </p>
        <p class="MsoNormal">>> a dělení 64-bitových čísel na
          osmibitu při 16MHz bude chvíli trvat. </p>
        <p class="MsoNormal">>> Nejsem si jist, že se to za 1ms
          stihne (bude to asi dost na hraně, </p>
        <p class="MsoNormal">>> chtělo by to změřit).</p>
        <p class="MsoNormal">>><o:p> </o:p></p>
        <p class="MsoNormal">>> S přáním pevného zdraví</p>
        <p class="MsoNormal">>> Martin Locker</p>
        <p class="MsoNormal">>><o:p> </o:p></p>
        <p class="MsoNormal">>> ----- Původní zpráva -----</p>
        <p class="MsoNormal">>> Odesilatel: Jaroslav Buchta
          (<a class="moz-txt-link-abbreviated" href="mailto:jaroslav.buchta@hascomp.cz">jaroslav.buchta@hascomp.cz</a>)</p>
        <p class="MsoNormal">>> Datum: 13/04/2021 20:06</p>
        <p class="MsoNormal">>> Příjemce: HW-news
          (<a class="moz-txt-link-abbreviated" href="mailto:hw-list@list.hw.cz">hw-list@list.hw.cz</a>)</p>
        <p class="MsoNormal">>> Předmět: AVR arduino potize</p>
        <p class="MsoNormal">>><o:p> </o:p></p>
        <p class="MsoNormal">>> Snazim se pomoct se zpracovanim
          signalu, vzorkovani po 1ms a zda se, ze</p>
        <p class="MsoNormal">>> neco se v knihovnach seka (tipuju
          obsluhu serv) a za 100ms mi to vynecha</p>
        <p class="MsoNormal">>> tak 2-3 cykly, za sekundu asi 25
          takže je to asi celkem rovnoměrné.</p>
        <p class="MsoNormal">>><o:p> </o:p></p>
        <p class="MsoNormal">>> Dá se nějak pověsit na ISR 1ms od
          timeru 0? Podle zdrojaku to na nejakou</p>
        <p class="MsoNormal">>> možnost callback fce nevypada
          (timer1 je použit pro serva)</p>
        <p class="MsoNormal">>><o:p> </o:p></p>
        <p class="MsoNormal">>> Neřešim zatim teda, jestli to
          nevynechava i ta přerušeni. Jako</p>
        <p class="MsoNormal">>> doporučuju synovi hodit ten AVR
          drek po psovi ale zatim rychlou nahradu</p>
        <p class="MsoNormal">>> nemame ;-)</p>
        <p class="MsoNormal">>><o:p> </o:p></p>
        <p class="MsoNormal">>> Zkousel jsem Nucleo303RE, to
          funguje i jako arduino hezky ale je to</p>
        <p class="MsoNormal">>> velke. Neco velikosti Arduino Nano
          s normalnim 32b procesorem neni?</p>
        <p class="MsoNormal">>> (nasel uz nejakou exotiku CM4 ale
          maji to jen na mouseru a moc se mi to</p>
        <p class="MsoNormal">>> nelibi, odkaz ted nemam)</p>
        <p class="MsoNormal">>><o:p> </o:p></p>
        <p class="MsoNormal">>> Jo, a jeste to vynechava znaky
          vysilane na serial, zcela nahodne, nekdy</p>
        <p class="MsoNormal">>> to jede pul minuty bez vypadku,
          nekdy vypadne znak po par sekundach,</p>
        <p class="MsoNormal">>> nejaky znamy problem? Terminalem
          to neni, zkousel jsem ruzne ktere mi</p>
        <p class="MsoNormal">>> normalne fungujou na 115200</p>
        <p class="MsoNormal">>><o:p> </o:p></p>
        <p class="MsoNormal">>> Ono to teda nejak funguje jak jsem
          to zkorigoval, ale se.e me to...</p>
        <p class="MsoNormal">>><o:p> </o:p></p>
        <p class="MsoNormal">>> V loop se volaji v redukovane
          verzi jen tyto metody</p>
        <p class="MsoNormal">>><o:p> </o:p></p>
        <p class="MsoNormal">>> #define MSGPERIOD   1000</p>
        <p class="MsoNormal">>> void CDataProc::Message()</p>
        <p class="MsoNormal">>> {</p>
        <p class="MsoNormal">>>      uint32_t ms = millis();</p>
        <p class="MsoNormal">>>      if (ms - msgMillis <
          MSGPERIOD)</p>
        <p class="MsoNormal">>>      {</p>
        <p class="MsoNormal">>>          return;</p>
        <p class="MsoNormal">>>      }</p>
        <p class="MsoNormal">>>      msgMillis += MSGPERIOD;</p>
        <p class="MsoNormal">>>      char s[40];</p>
        <p class="MsoNormal">>>      sprintf (s, "%10lu, %4u, %5u,
          %5u", msgMillis, cycles,</p>
        <p class="MsoNormal">>> (uint16_t)(valSignalFilt >>
          8), (uint16_t)(valAvgFilt >> 24));</p>
        <p class="MsoNormal">>>      Serial.println(s);</p>
        <p class="MsoNormal">>>      cycles=0;</p>
        <p class="MsoNormal">>> }</p>
        <p class="MsoNormal">>><o:p> </o:p></p>
        <p class="MsoNormal">>> uint16_t CDataProc::GetSignal()</p>
        <p class="MsoNormal">>> {</p>
        <p class="MsoNormal">>>      uint16_t sensorValue =
          (uint16_t)analogRead(A0);</p>
        <p class="MsoNormal">>><o:p> </o:p></p>
        <p class="MsoNormal">>>      if (firstPass){</p>
        <p class="MsoNormal">>>          valAvgFilt =
          ((uint64_t)sensorValue << 24) | 0x7fffffUL;</p>
        <p class="MsoNormal">>>          valSignalFilt =
          ((uint32_t)sensorValue << 8) | 0x7f;</p>
        <p class="MsoNormal">>>          firstPass = false;</p>
        <p class="MsoNormal">>>      }</p>
        <p class="MsoNormal">>>      else</p>
        <p class="MsoNormal">>>      {</p>
        <p class="MsoNormal">>>          uint32_t ms = millis();</p>
        <p class="MsoNormal">>>          if (ms - lastMillis >
          0)</p>
        <p class="MsoNormal">>>          {</p>
        <p class="MsoNormal">>>              cycles++;</p>
        <p class="MsoNormal">>>          }</p>
        <p class="MsoNormal">>>          while (ms - lastMillis
          > 0)</p>
        <p class="MsoNormal">>>          {</p>
        <p class="MsoNormal">>>              lastMillis++;</p>
        <p class="MsoNormal">>>              valAvgFilt =
          (valAvgFilt*(coefAvg-1) +</p>
        <p class="MsoNormal">>> (((uint64_t)sensorValue <<
          24) | 0x7fffffUL))/coefAvg;</p>
        <p class="MsoNormal">>>              valSignalFilt =
          (valSignalFilt*(coefSignal-1) +</p>
        <p class="MsoNormal">>> (((uint32_t)sensorValue <<
          8) | 0x7f))/coefSignal;</p>
        <p class="MsoNormal">>>          }</p>
        <p class="MsoNormal">>>      }</p>
        <p class="MsoNormal">>>      Message();</p>
        <p class="MsoNormal">>>      return (int16_t(valSignalFilt
          >> 8)) - (int16_t(valAvgFilt >> 24));</p>
        <p class="MsoNormal">>> }</p>
        <p class="MsoNormal">>><o:p> </o:p></p>
        <p class="MsoNormal">>> Vypis vypada takto napr.</p>
        <p class="MsoNormal">>><o:p> </o:p></p>
        <p class="MsoNormal">>>       53000,  976,   741,   741</p>
        <p class="MsoNormal">>>       54000,  977,   741,   741</p>
        <p class="MsoNormal">>>       55000,  976,   741,   74   
                  //vypadek</p>
        <p class="MsoNormal">>>       56000,  977,   741,   741</p>
        <p class="MsoNormal">>>       57000,  977,   741,   741</p>
        <p class="MsoNormal">>><o:p> </o:p></p>
        <p class="MsoNormal">>><o:p> </o:p></p>
        <p class="MsoNormal">>>      188000,  976,   741,   741</p>
        <p class="MsoNormal">>>      189000,  977,   741,   741</p>
        <p class="MsoNormal">>>      190000,  976,   741,   741</p>
        <p class="MsoNormal">>>      191000,  977,   41,   741   
              //vypadek</p>
        <p class="MsoNormal">>>      192000,  976,   741,   741</p>
        <p class="MsoNormal">>>      193000,  977,   741,   741</p>
        <p class="MsoNormal">>>      194000,  977,   741,   741</p>
        <p class="MsoNormal">>>      15000,  976,   741,   741   
              //vypadek</p>
        <p class="MsoNormal">>>      196000,  977,   741,   741</p>
        <p class="MsoNormal">>>      197000,  976,   741,   741</p>
        <p class="MsoNormal">>><o:p> </o:p></p>
        <p class="MsoNormal">>>
          _______________________________________________</p>
        <p class="MsoNormal">>> HW-list mailing list  -  sponsored
          by <a class="moz-txt-link-abbreviated" href="http://www.HW.cz">www.HW.cz</a></p>
        <p class="MsoNormal">>> <a class="moz-txt-link-abbreviated" href="mailto:Hw-list@list.hw.cz">Hw-list@list.hw.cz</a></p>
        <p class="MsoNormal">>>
          <a class="moz-txt-link-freetext" href="http://list.hw.cz/mailman/listinfo/hw-list">http://list.hw.cz/mailman/listinfo/hw-list</a></p>
        <p class="MsoNormal">>><o:p> </o:p></p>
        <p class="MsoNormal">>>
          _______________________________________________</p>
        <p class="MsoNormal">>> HW-list mailing list  -  sponsored
          by <a class="moz-txt-link-abbreviated" href="http://www.HW.cz">www.HW.cz</a></p>
        <p class="MsoNormal">>> <a class="moz-txt-link-abbreviated" href="mailto:Hw-list@list.hw.cz">Hw-list@list.hw.cz</a></p>
        <p class="MsoNormal">>>
          <a class="moz-txt-link-freetext" href="http://list.hw.cz/mailman/listinfo/hw-list">http://list.hw.cz/mailman/listinfo/hw-list</a></p>
        <p class="MsoNormal">><o:p> </o:p></p>
        <p class="MsoNormal">><o:p> </o:p></p>
        <p class="MsoNormal">>
          _______________________________________________</p>
        <p class="MsoNormal">> HW-list mailing list  -  sponsored by
          <a class="moz-txt-link-abbreviated" href="http://www.HW.cz">www.HW.cz</a></p>
        <p class="MsoNormal">> <a class="moz-txt-link-abbreviated" href="mailto:Hw-list@list.hw.cz">Hw-list@list.hw.cz</a></p>
        <p class="MsoNormal">>
          <a class="moz-txt-link-freetext" href="http://list.hw.cz/mailman/listinfo/hw-list">http://list.hw.cz/mailman/listinfo/hw-list</a></p>
        <p class="MsoNormal"><o:p> </o:p></p>
        <p class="MsoNormal"><o:p> </o:p></p>
        <p class="MsoNormal">_______________________________________________</p>
        <p class="MsoNormal">HW-list mailing list  -  sponsored by
          <a class="moz-txt-link-abbreviated" href="http://www.HW.cz">www.HW.cz</a></p>
        <p class="MsoNormal"><a class="moz-txt-link-abbreviated" href="mailto:Hw-list@list.hw.cz">Hw-list@list.hw.cz</a></p>
        <p class="MsoNormal"><a class="moz-txt-link-freetext" href="http://list.hw.cz/mailman/listinfo/hw-list">http://list.hw.cz/mailman/listinfo/hw-list</a></p>
        <p class="MsoNormal"><o:p> </o:p></p>
      </div>
      <br>
      <fieldset class="mimeAttachmentHeader"></fieldset>
      <pre class="moz-quote-pre" wrap="">_______________________________________________
HW-list mailing list  -  sponsored by <a class="moz-txt-link-abbreviated" href="http://www.HW.cz">www.HW.cz</a>
<a class="moz-txt-link-abbreviated" href="mailto:Hw-list@list.hw.cz">Hw-list@list.hw.cz</a>
<a class="moz-txt-link-freetext" href="http://list.hw.cz/mailman/listinfo/hw-list">http://list.hw.cz/mailman/listinfo/hw-list</a>
</pre>
    </blockquote>
    <p><br>
    </p>
  </body>
</html>