<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="pl-pl">
<link rel="self" type="application/atom+xml" href="https://forum.atnel.pl/feed.php?f=4&amp;t=20892&amp;mode" />

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2018-06-20T18:47:25+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=20892&amp;mode</id>
<entry>
<author><name><![CDATA[andrews]]></name></author>
<updated>2018-06-20T18:47:25+01:00</updated>
<published>2018-06-20T18:47:25+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=20892&amp;p=209129#p209129</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=20892&amp;p=209129#p209129"/>
<title type="html"><![CDATA[Re: generacja sygnału dshot]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=20892&amp;p=209129#p209129"><![CDATA[
<div class="quotetitle">JarekB napisał(a):</div><div class="quotecontent"><br /><div class="codetitle"><b>Code:</b></div><div class="codecontent">00000098 &lt;main&gt;:<br /> 98:    12 be           out    0x32, r1    ; 50<br />    ...                                                                      // tu wielki kompilator zrobił numer<br />  a6:    82 b7           in    r24, 0x32    ; 50                    // dołożył tyle pustych linijek ile jest nop-ów<br />  a8:    80 93 00 01     sts    0x0100, r24    ; 0x800100 &lt;_edata&gt;  // różnica między 98 a a6</div><br /></div><br /><br />A na czym konkretnie polega ten numer kompilatora? <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br />To nie są puste linijki. Pod tymi adresami pomiędzy 0x98 i 0xA6 są właśnie instrukcje NOP.<br /><br />Można oczywiście ustawić wyższy poziom <strong><em>Debug Info</em></strong>, ale i tak zapewne nie wszystkie instrukcje będą widoczne w pliku <strong><em>*.lss</em></strong>.<br /><br />Za to w Atmel Studio podczas symulacji w oknie <strong><em>Disassembly</em></strong> kod wygląda tak:<div class="codetitle"><b>Code:</b></div><div class="codecontent">int main( void ) {<br />    TCNT0 = 0;<br />00000048  OUT 0x26,R1      Out to I/O location <br />    asm( &quot;nop&quot; );<br />00000049  NOP       No operation <br />    asm( &quot;nop&quot; );<br />0000004A  NOP       No operation <br />    asm( &quot;nop&quot; );<br />0000004B  NOP       No operation <br />    asm( &quot;nop&quot; );<br />0000004C  NOP       No operation <br />    asm( &quot;nop&quot; );<br />0000004D  NOP       No operation <br />    asm( &quot;nop&quot; );<br />0000004E  NOP       No operation <br />    czas = TCNT0;<br />0000004F  IN R24,0x26      In from I/O location <br />00000050  STS 0x0100,R24      Store direct to data space </div><br /><br />Poza tym dostępne jest okienko o nazwie <strong><em>Processor Status</em></strong>, w którym jest całe mnóstwo przydatnych informacji, jak np. adres aktualnie wykonywanej instrukcji (PC counter), wskaźnik stosu, licznik cykli wykonanych podczas wykonywania instrukcji, Stop Watch przeliczający wykonane instrukcje na czas (na podstawie zadanej przez nas częstotliwości taktowania).<br /><br />Trudno tu opisać wszystkie możliwości symulatora, ale bardzo łatwo w takich właśnie sytuacjach przetestować, co wygenerował kompilator. Oczywiście symulator nie jest w stanie zasymulować wszystkiego (np. pracy UARTa), czasami potrzebny jest debugger sprzętowy, ale i tak dużo funkcji naszego programu można przetestować.<br /><br />Dlatego osobiście podpisałbym się pod radą kolegi <strong>micky</strong>:<div class="quotetitle">micky napisał(a):</div><div class="quotecontent"><br />A może spróbuj symulatora software'go w Atmel Studio do policzenia czasu wykonywania twoich procedur?<br /></div><br />Oczywiście wymaga to nie tylko zainstalowania Atmel Studio. Trzeba się jeszcze nauczyć obsłużyć taki symulator, ale myślę, że na potrzeby tak prostego programu dużo się uczyć nie trzeba...<br /><br />Z drugiej strony trochę się obawiam, że mnie kolega Mirek zruga za promowanie (&quot;kociego&quot;) Atmel Studio <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=14165">andrews</a> — 20 cze 2018, o 18:47</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[JarekB]]></name></author>
<updated>2018-06-20T12:00:32+01:00</updated>
<published>2018-06-20T12:00:32+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=20892&amp;p=209118#p209118</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=20892&amp;p=209118#p209118"/>
<title type="html"><![CDATA[Re: generacja sygnału dshot]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=20892&amp;p=209118#p209118"><![CDATA[
Zobacz <br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;util/delay.h&gt;<br />uint8_t czas;<br />int main( void ) {<br />    TCNT0 = 0;<br />    asm( &quot;nop&quot; );<br />    asm( &quot;nop&quot; );<br />    asm( &quot;nop&quot; );<br />    czas = TCNT0;<br />    while ( 1 ) {<br />    }<br />}[/syntax]<br /><br />i teraz asembler <br />[syntax=c]00000098 &lt;main&gt;:<br />  98:    12 be           out    0x32, r1    ; 50<br />  9a:    00 00           nop                              // instrukcje nop zajmują 1 takt zegara<br />  9c:    00 00           nop<br />  9e:    00 00           nop<br />  a0:    82 b7           in    r24, 0x32    ; 50<br />  a2:    80 93 00 01     sts    0x0100, r24    ; 0x800100 &lt;_edata&gt;<br />  a6:    ff cf           rjmp    .-2          ; 0xa6 &lt;main+0xe&gt;[/syntax]<br /><br />I teraz ciekawostka <br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;util/delay.h&gt;<br /><br />uint8_t czas;<br /><br />int main( void ) {<br />    TCNT0 = 0;<br />    asm( &quot;nop&quot; );<br />    asm( &quot;nop&quot; );<br />    asm( &quot;nop&quot; );<br />    asm( &quot;nop&quot; );<br />    asm( &quot;nop&quot; );<br />    asm( &quot;nop&quot; );<br />    czas = TCNT0;<br />    while ( 1 ) {<br />    }<br />}[/syntax]<br />I asembler:<br />[syntax=c]00000098 &lt;main&gt;:<br /> 98:    12 be           out    0x32, r1    ; 50<br />    ...                                                                      // tu wielki kompilator zrobił numer<br />  a6:    82 b7           in    r24, 0x32    ; 50                    // dołożył tyle pustych linijek ile jest nop-ów <br />  a8:    80 93 00 01     sts    0x0100, r24    ; 0x800100 &lt;_edata&gt;  // różnica między 98 a a6<br />  ac:    ff cf           rjmp    .-2          ; 0xac &lt;main+0x14&gt;[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=18188">JarekB</a> — 20 cze 2018, o 12:00</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[rskup]]></name></author>
<updated>2018-06-20T11:31:06+01:00</updated>
<published>2018-06-20T11:31:06+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=20892&amp;p=209115#p209115</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=20892&amp;p=209115#p209115"/>
<title type="html"><![CDATA[Re: generacja sygnału dshot]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=20892&amp;p=209115#p209115"><![CDATA[
<div class="quotetitle">aiwa napisał(a):</div><div class="quotecontent"><br />zaglądałem do asemblera i kompletnie nic nie zrozumiałem<br /></div>Możesz włączyć dodawanie informacji z jakich linii kodu w C pochodzą te komendy asemblerowe <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br />-- <br />Pozdrawiam,<br />Robert<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: kilkunastu sekundach ]</span></strong><br /><br />Masz na ten temat informacje tutaj <!-- l --><a class="postlink-local" href="http://forum.atnel.pl/topic3741.html" >topic3741.html</a><!-- l --><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3427">rskup</a> — 20 cze 2018, o 11:31</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[micky]]></name></author>
<updated>2018-06-20T11:06:11+01:00</updated>
<published>2018-06-20T11:06:11+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=20892&amp;p=209113#p209113</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=20892&amp;p=209113#p209113"/>
<title type="html"><![CDATA[Re: generacja sygnału dshot]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=20892&amp;p=209113#p209113"><![CDATA[
A może spróbuj symulatora software'go w Atmel Studio do policzenia czasu wykonywania twoich procedur?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1546">micky</a> — 20 cze 2018, o 11:06</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[aiwa]]></name></author>
<updated>2018-06-20T09:39:03+01:00</updated>
<published>2018-06-20T09:39:03+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=20892&amp;p=209111#p209111</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=20892&amp;p=209111#p209111"/>
<title type="html"><![CDATA[Re: generacja sygnału dshot]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=20892&amp;p=209111#p209111"><![CDATA[
Dziękuję za pomoc  <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> <br />Faktycznie dobrym sposobem jest wykorzystanie timera, choć oczywiście nie do końca precyzyjnym.<br /><br />Przemyślałem to i widzę następujące kwestie:<br /><br />-sprawdziłem ile trwa przypisanie wartości z rejestru do zmiennej czas w poniższy sposób:<br />[syntax=c]TCNT0 = 0;<br />czas = TCNT0;[/syntax]<br />wyszło zero. Następnie dodałem kilka takich samych przypisań:<br />[syntax=c]TCNT0 = 0;<br />czas = TCNT0;<br />czas = TCNT0;<br />czas = TCNT0;[/syntax]<br />kazde przypisanie dodawało po 3 cykle zegara do wyniku. Skoro po jednym przypisaniu wyszło zero cykli, zakładam że nie będzie ono miało wpływu na wynik gdy już zmierzę &quot;czas&quot; wykonywania funkcji.  <img src="https://forum.atnel.pl/images/smilies/icon_idea.gif" alt=":idea:" title="Pomysł" /> <br /><br />-praktycznie wszystkie instrukcje ładnie się dodają, &quot;nopy&quot; po jednym cyklu zegara, ustawienie wyjść dwa cykle itd. <br />Mimo to przy sterowaniu diodą WS2811 p. Mirek mówił, że w rzeczywistości sygnał jest bardziej zniekształcony, tj wydłużony. <br />Nawet jeśli tak się stanie z moim dshotem, to czy przy czasach od 625 do 1670 nanosekund będzie to miało znaczenie? Bo zawsze jest jakaś tolerancja, a tamta dioda WS2811 ma z kolei szybszą komunikację (np. 2,5 razy krótszy bit zera).<br /><br />-zaglądałem do asemblera i kompletnie <span style="text-decoration: underline">nic</span> nie zrozumiałem  <img src="https://forum.atnel.pl/images/smilies/icon_lol.gif" alt=":lol:" title="Śmieje się" /> <br />[syntax=c]000002c2 &lt;main&gt;:<br /> 2c2:89 9a       sbi0x11, 1; 17<br /> 2c4:91 98       cbi0x12, 1; 18<br /> 2c6:85 ee       ldir24, 0xE5; 229<br /> 2c8:93 e0       ldir25, 0x03; 3<br /> 2ca:91 9a       sbi0x12, 1; 18<br /> 2cc:e3 ef       ldir30, 0xF3; 243<br /> 2ce:f1 e0       ldir31, 0x01; 1<br /> 2d0:31 97       sbiwr30, 0x01; 1<br /> 2d2:f1 f7       brne.-4      ; 0x2d0 &lt;main+0xe&gt;<br /> 2d4:00 c0       rjmp.+0      ; 0x2d6 &lt;main+0x14&gt;<br /> 2d6:00 00       nop<br /> 2d8:91 98       cbi0x12, 1; 18<br /> 2da:ef e3       ldir30, 0x3F; 63<br /> 2dc:ff e1       ldir31, 0x1F; 31<br /> 2de:31 97       sbiwr30, 0x01; 1<br /> 2e0:f1 f7       brne.-4      ; 0x2de &lt;main+0x1c&gt;<br /> 2e2:00 c0       rjmp.+0      ; 0x2e4 &lt;main+0x22&gt;<br /> 2e4:00 00       nop<br /> 2e6:91 9a       sbi0x12, 1; 18<br /> 2e8:e7 ee       ldir30, 0xE7; 231<br /> 2ea:f3 e0       ldir31, 0x03; 3<br /> 2ec:31 97       sbiwr30, 0x01; 1<br /> 2ee:f1 f7       brne.-4      ; 0x2ec &lt;main+0x2a&gt;<br /> 2f0:00 c0       rjmp.+0      ; 0x2f2 &lt;main+0x30&gt;<br /> 2f2:00 00       nop<br /> 2f4:91 98       cbi0x12, 1; 18<br /> 2f6:ef e3       ldir30, 0x3F; 63<br /> 2f8:ff e1       ldir31, 0x1F; 31<br /> 2fa:31 97       sbiwr30, 0x01; 1<br /> 2fc:f1 f7       brne.-4      ; 0x2fa &lt;main+0x38&gt;<br /> 2fe:00 c0       rjmp.+0      ; 0x300 &lt;main+0x3e&gt;<br /> 300:00 00       nop<br /> 302:01 97       sbiwr24, 0x01; 1<br /> 304:00 97       sbiwr24, 0x00; 0<br /> 306:09 f7       brne.-62     ; 0x2ca &lt;main+0x8&gt;<br /> 308:91 9a       sbi0x12, 1; 18<br /> 30a:87 ef       ldir24, 0xF7; 247<br /> 30c:92 e0       ldir25, 0x02; 2<br /> 30e:01 97       sbiwr24, 0x01; 1<br /> 310:f1 f7       brne.-4      ; 0x30e &lt;main+0x4c&gt;<br /> 312:00 c0       rjmp.+0      ; 0x314 &lt;main+0x52&gt;<br /> 314:00 00       nop<br /> 316:91 98       cbi0x12, 1; 18<br /> 318:ef e3       ldir30, 0x3F; 63<br /> 31a:ff e1       ldir31, 0x1F; 31<br /> 31c:31 97       sbiwr30, 0x01; 1<br /> 31e:f1 f7       brne.-4      ; 0x31c &lt;main+0x5a&gt;<br /> 320:00 c0       rjmp.+0      ; 0x322 &lt;main+0x60&gt;<br /> 322:00 00       nop<br /> 324:f1 cf       rjmp.-30     ; 0x308 &lt;main+0x46&gt;<br /><br />00000326 &lt;__vector_9&gt;:<br /> 326:1f 92       pushr1<br /> 328:0f 92       pushr0<br /> 32a:0f b6       inr0, 0x3f; 63<br /> 32c:0f 92       pushr0<br /> 32e:11 24       eorr1, r1<br /> 330:10 92 64 00 sts0x0064, r1<br /> 334:0f 90       popr0<br /> 336:0f be       out0x3f, r0; 63<br /> 338:0f 90       popr0<br /> 33a:1f 90       popr1<br /> 33c:18 95       reti[/syntax]<br /><br />Jeśli jednak obliczenia przełożą się na praktykę, to chyba mam problem z głowy  <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=7200">aiwa</a> — 20 cze 2018, o 09:39</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[JarekB]]></name></author>
<updated>2018-06-19T13:36:13+01:00</updated>
<published>2018-06-19T13:36:13+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=20892&amp;p=209078#p209078</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=20892&amp;p=209078#p209078"/>
<title type="html"><![CDATA[Re: generacja sygnału dshot]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=20892&amp;p=209078#p209078"><![CDATA[
Masz Timery programowe którymi możesz zmierzyć czasy <br />Bym to widział tak:[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;util/delay.h&gt;<br /><br />uint8_t czas;<br /><br />int main( void ) {<br />    TCNT0 = 0;<br />               // TWOJA FUNKCJA do zmierzenia<br />    czas = TCNT0;<br />  <br />  while ( 1 ) {<br />    }[/syntax]<br />Każdy z czasów możesz w ten sposób zmierzyć <br />w pliku .lss masz komendy i możesz wyliczyć ile taktów co zajmuje: <br /><br />[syntax=c]00000098 &lt;main&gt;:<br />  98:    12 be           out    0x32, r1    ; 50<br />  9a:    82 b7           in    r24, 0x32    ; 50<br />  9c:    80 93 00 01     sts    0x0100, r24    ; 0x800100 &lt;_edata&gt;<br />  a0:    ff cf           rjmp    .-2          ; 0xa0 &lt;main+0x8&gt;[/syntax]<br /> <br />Czyli Twój czas to będzie ilość taktów zegara minus to co zajmuje ustawienie zegara i przepisanie wartości do zmiennej <br />z dokładnością to pojedynczych tyknięć zegara<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=18188">JarekB</a> — 19 cze 2018, o 13:36</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[aiwa]]></name></author>
<updated>2018-06-19T12:58:01+01:00</updated>
<published>2018-06-19T12:58:01+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=20892&amp;p=209074#p209074</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=20892&amp;p=209074#p209074"/>
<title type="html"><![CDATA[generacja sygnału dshot]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=20892&amp;p=209074#p209074"><![CDATA[
Cześć,<br />mam pewien kłopot ze sprawdzeniem programu, który napisałem.<br />Próbuję stworzyć sygnał cyfrowy na podstawie protokołu DShot600 (do sterowników silników bezszczotkowych).<br />Posiłkowałem się programem do diod WS2811 (z bluebooka albo z bloga mk? nie pamiętam) i przerobiłem dwie funkcje do wysyłania bitów 0 i 1. <br />W załączeniu obrazek jak powinny wyglądać czasy trwania bitów.<br />[Na razie interesują mnie tylko dane, a nie CRC czy cała ramka.]<br />[syntax=c]static void motor_zero(){//1670ns<br />PORT(MOTOR_PORT) |= (1&lt;&lt;MOTOR_PIN);<br />asm(&quot;nop&quot;); asm(&quot;nop&quot;); asm(&quot;nop&quot;); asm(&quot;nop&quot;);//625ns<br />asm(&quot;nop&quot;); asm(&quot;nop&quot;); asm(&quot;nop&quot;); asm(&quot;nop&quot;);<br />PORT(MOTOR_PORT) &amp;= ~(1&lt;&lt;MOTOR_PIN);<br />asm(&quot;nop&quot;); asm(&quot;nop&quot;); asm(&quot;nop&quot;); asm(&quot;nop&quot;);//(=1670-625)ns<br />asm(&quot;nop&quot;); asm(&quot;nop&quot;); asm(&quot;nop&quot;); asm(&quot;nop&quot;);<br />asm(&quot;nop&quot;); asm(&quot;nop&quot;); asm(&quot;nop&quot;); asm(&quot;nop&quot;);<br />asm(&quot;nop&quot;);<br />}<br /><br />static void motor_one(){//1670ns<br />PORT(MOTOR_PORT) |= (1&lt;&lt;MOTOR_PIN);<br />asm(&quot;nop&quot;); asm(&quot;nop&quot;); asm(&quot;nop&quot;); asm(&quot;nop&quot;);//1250ns<br />asm(&quot;nop&quot;); asm(&quot;nop&quot;); asm(&quot;nop&quot;); asm(&quot;nop&quot;);<br />asm(&quot;nop&quot;); asm(&quot;nop&quot;); asm(&quot;nop&quot;); asm(&quot;nop&quot;);<br />asm(&quot;nop&quot;); asm(&quot;nop&quot;); asm(&quot;nop&quot;); asm(&quot;nop&quot;);<br />asm(&quot;nop&quot;);<br />PORT(MOTOR_PORT) &amp;= ~(1&lt;&lt;MOTOR_PIN);<br />asm(&quot;nop&quot;); asm(&quot;nop&quot;); asm(&quot;nop&quot;); asm(&quot;nop&quot;);//(=1670-1250)ns<br />}[/syntax]<br /><br />Pytanie tylko jak sprawdzić poprawność działania funkcji (czy czasy się zgadzają)? <br />Potrzebowałbym zapewne oscyloskopu minimum 25MHz <img src="https://forum.atnel.pl/images/smilies/icon_eek.gif" alt=":shock:" title="Zaszokowany" /> <br />Jak widać program jest prosty ale bez narzędzi/pomysłu nigdy go nie zweryfikuję.  <img src="https://forum.atnel.pl/images/smilies/icon_e_sad.gif" alt=":(" title="Smutny" /><br /><br /><br /><a href="https://obrazkiforum.atnel.pl/7200/e3a5d34a4e839572aaeb3a862c44fb45.png"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/7200/e3a5d34a4e839572aaeb3a862c44fb45.png" alt="Obrazek" /></a><br />czas trwania bitów w protokole dshot600<br /><br /><br />@edit: stąd wziąłem wiedzę o protokole, stronka po angielsku:<br /><a href="https://blck.mn/2016/11/dshot-the-new-kid-on-the-block/"  class="postlink">https://blck.mn/2016/11/dshot-the-new-kid-on-the-block/</a><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=7200">aiwa</a> — 19 cze 2018, o 12:58</p><hr />
]]></content>
</entry>
</feed>