<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>