<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40"><head><meta http-equiv=Content-Type content="text/html; charset=utf-8"><meta name=Generator content="Microsoft Word 15 (filtered medium)"><style><!--
/* Font Definitions */
@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;}
/* Style Definitions */
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;}
@page WordSection1
        {size:612.0pt 792.0pt;
        margin:70.85pt 70.85pt 70.85pt 70.85pt;}
div.WordSection1
        {page:WordSection1;}
--></style></head><body lang=CS link=blue vlink="#954F72" style='word-wrap:break-word'><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">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">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 (jaroslav.buchta@hascomp.cz)</p><p class=MsoNormal>>> Datum: 13/04/2021 20:06</p><p class=MsoNormal>>> Příjemce: HW-news (hw-list@list.hw.cz)</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 www.HW.cz</p><p class=MsoNormal>>> Hw-list@list.hw.cz</p><p class=MsoNormal>>> http://list.hw.cz/mailman/listinfo/hw-list</p><p class=MsoNormal>>><o:p> </o:p></p><p class=MsoNormal>>> _______________________________________________</p><p class=MsoNormal>>> HW-list mailing list  -  sponsored by www.HW.cz</p><p class=MsoNormal>>> Hw-list@list.hw.cz</p><p class=MsoNormal>>> http://list.hw.cz/mailman/listinfo/hw-list</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 www.HW.cz</p><p class=MsoNormal>> Hw-list@list.hw.cz</p><p class=MsoNormal>> http://list.hw.cz/mailman/listinfo/hw-list</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 www.HW.cz</p><p class=MsoNormal>Hw-list@list.hw.cz</p><p class=MsoNormal>http://list.hw.cz/mailman/listinfo/hw-list</p><p class=MsoNormal><o:p> </o:p></p></div></body></html>