<?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=20321&amp;mode" />

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2018-04-18T12:39:22+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=20321&amp;mode</id>
<entry>
<author><name><![CDATA[JarekB]]></name></author>
<updated>2018-04-18T12:39:22+01:00</updated>
<published>2018-04-18T12:39:22+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=20321&amp;p=206933#p206933</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=20321&amp;p=206933#p206933"/>
<title type="html"><![CDATA[Re: Silnik bipolarny dla początkujących]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=20321&amp;p=206933#p206933"><![CDATA[
Nie wiem czy dobrze rozumiem pytanie <br />Ale czy o to Ci chodzi?<br /><br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;util/delay.h&gt;<br /><br />uint8_t kroki;<br />uint8_t cos_tam_cos_tam = 1;<br /><br />int main( void ) {<br />    void funkcja_nasza( uint8_t cos );<br /><br />    while ( 1 ) {<br />        kroki++;<br />        if ( kroki &gt; 0 &amp;&amp; kroki &lt; 90 ) cos_tam_cos_tam = 10;<br />        if ( kroki &gt;= 90 &amp;&amp; kroki &lt; 190 ) cos_tam_cos_tam = 20;<br />        funkcja_nasza( cos_tam_cos_tam );<br />        _delay_ms(10);  // tego delaya to trzeba przerobić na tykadełko jakiegś tajmera i sprawdzać tykadełko a nie delaić się po kątach                  <br />    }  // Koniec while<br />}      // Koniec main<br /><br />void funkcja_nasza( uint8_t cos ) {<br />    for ( uint8_t a = 0; a == cos; a++ ) {<br />   // tu sobie zrobisz co chcesz tyle razy ile cos_ta_co_tam <br />  }  // Koniec pętli<br />}    // Koniec funkcja_nasza[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=18188">JarekB</a> — 18 kwi 2018, o 12:39</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[elektronikq]]></name></author>
<updated>2018-04-18T11:04:41+01:00</updated>
<published>2018-04-18T11:04:41+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=20321&amp;p=206932#p206932</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=20321&amp;p=206932#p206932"/>
<title type="html"><![CDATA[Re: Silnik bipolarny dla początkujących]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=20321&amp;p=206932#p206932"><![CDATA[
Czyli ok rozumiemy się. Bo mi teraz już nie chodzi o ten program tylko o to sprawdzanie. Czy jest jakiś sposób na sprawdzanie tej zmiennej kroki, że w każdym razie jak doliczy do 90, 190 to program mi wykona coś innego. Myślałem o przerwaniu, o goto ale teraz sie zastanawiam czy pętla nie jest zbyt szybka żeby badać ją przerwaniem. Chyba że między krokami dam większe delay ale te co są duże. Problem pewnie pojawi się przy małych przerwach między krokami.?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=11544">elektronikq</a> — 18 kwi 2018, o 11:04</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[rskup]]></name></author>
<updated>2018-04-15T22:00:27+01:00</updated>
<published>2018-04-15T22:00:27+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=20321&amp;p=206832#p206832</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=20321&amp;p=206832#p206832"/>
<title type="html"><![CDATA[Re: Silnik bipolarny dla początkujących]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=20321&amp;p=206832#p206832"><![CDATA[
Jak masz warunek na kroki == 90, to jak skaczesz co 4, to nie trafisz w tę wartość, bo 90 nie jest podzielne przez 4. Jak zaczynasz liczyć od 0 to trafiasz na warunki z wartością 88 a potem z wartością 92 a wartość 90 nie jest sprawdzana <img src="https://forum.atnel.pl/images/smilies/icon_e_sad.gif" alt=":(" title="Smutny" />. Tak samo dzieje się z wartością 181.<br /><br />Według mnie (choć nie wiem jak masz w pozostałej części kodu) do kodu z pierwszego warunku (kroki &lt; 90) trafiasz z wartościami zmiennej kroki równej 0, 4, ..., 84, 88. Warunek drugi (kroki == 90) nie jest nigdy prawdziwy (bo kroki mają wartość 88 a potem 92). Warunek trzeci (kroki &gt; 90) wykonywany jest dla zmiennej kroki o wartościach 92, 96, ... 176, 180, 184, 188, .... Warunek czwarty (kroki == 181) nigdy nie jest prawdziwy (kroki mają wartość 180 a potem 184).<br /><br />Dlatego powtórzę kolejny raz. Zabawa w kroki wykonywane po kilka by zapewnić komplet przesunięć jest bardzo złym pomysłem i wymaga dokładnego wyliczenia wartości do warunków. A przy pierwszej zmianie znowu będziesz musiał wyliczać wartości dla wszystkich warunków. Dlatego zmień sposób obsługi silnika na coś w proponowanym stylu.<br /><br />-- <br />Pozdrawiam,<br />Robert<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3427">rskup</a> — 15 kwi 2018, o 22:00</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[elektronikq]]></name></author>
<updated>2018-04-11T19:29:19+01:00</updated>
<published>2018-04-11T19:29:19+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=20321&amp;p=206724#p206724</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=20321&amp;p=206724#p206724"/>
<title type="html"><![CDATA[Re: Silnik bipolarny dla początkujących]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=20321&amp;p=206724#p206724"><![CDATA[
Tam powinno być kroki==90 i potem kroki==180.<br />Twój sposób przetestuje dziękuje. Jednak tutaj bardziej chodzi o zrozumienie więc pytam.<img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br />Jak program się wykonuje po kolei to jak wyjdzie z if gdzie kroki&gt;90 to może być tak, że dwa warunki się będą wykonywać albo ten drugi się nie wykona bo jak program opuści przed ostatni if z zmienną kroki ==182. Bo co krok zmienna jest zwiększana. Więc cały czas warunek będzie spełniony, że kroki &gt;90. <br /><br />Chciałbym więc np. że jeśli tylko w programie kroki osiągną np. wartość 180 to od razu przeszedł do następnego ifa.<br />Czyli tak jak pisałem pytać się w ifach? Czy przerwanie co 1ms lub krócej?<br />Czy Pan rozumie o co mi chodzi?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=11544">elektronikq</a> — 11 kwi 2018, o 19:29</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[rskup]]></name></author>
<updated>2018-04-11T16:13:28+01:00</updated>
<published>2018-04-11T16:13:28+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=20321&amp;p=206721#p206721</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=20321&amp;p=206721#p206721"/>
<title type="html"><![CDATA[Re: Silnik bipolarny dla początkujących]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=20321&amp;p=206721#p206721"><![CDATA[
<div class="quotetitle">elektronikq napisał(a):</div><div class="quotecontent"><br />[syntax=c]if (kroki=90)<br />{STOP;<br />_delay_ms(10);<br />kroki++;<br />}<br /> if (kroki&gt;91)<br />    {[/syntax]<br /></div><br />A co się dzieje jak kroki równe są 91, bo nie ma na to warunku?<br /><br />Przy takim stylu pisania zawsze gdzieś pojawi się błąd, szczególnie jak będziesz chciał zmienić liczbę kroków, to wszystko może się rozjechać <img src="https://forum.atnel.pl/images/smilies/icon_e_sad.gif" alt=":(" title="Smutny" />.<br />Skorzystaj z propozycji wcześniej wrzuconego przeze mnie kodu. Masz tam oddzielone kroki od fazy oraz jawnie wrzucone przedziały w case.<br /><br />-- <br />Pozdrawiam,<br />Robert<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3427">rskup</a> — 11 kwi 2018, o 16:13</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[elektronikq]]></name></author>
<updated>2018-04-11T12:04:50+01:00</updated>
<published>2018-04-11T12:04:50+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=20321&amp;p=206718#p206718</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=20321&amp;p=206718#p206718"/>
<title type="html"><![CDATA[Re: Silnik bipolarny dla początkujących]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=20321&amp;p=206718#p206718"><![CDATA[
Mam taki kod:<br />[syntax=c]if (kroki&lt;90)<br />    {<br />    KROK4;<br />     _delay_ms(10);<br />    kroki++;<br />    KROK3;<br />    _delay_ms(10);<br />     kroki++;<br />    &#91;b&#93;KROK2;<br />    _delay_ms(10);<br />    kroki++;&#91;/b&#93;<br />     KROK1;<br />     _delay_ms(10);<br />     kroki++;<br />    }<br />if (kroki=90)<br />{STOP;<br />_delay_ms(10);<br />kroki++;<br />}<br /> if (kroki&gt;91)<br />    {<br />    KROK1;<br />     _delay_ms(10);<br />    kroki++;<br />    KROK2;<br />    _delay_ms(10);<br />     kroki++;<br />    &#91;b&#93;KROK3;<br />    _delay_ms(10);<br />    kroki++;&#91;/b&#93;<br />     KROK4;<br />     _delay_ms(10);<br />     kroki++;<br />    }<br />if (kroki=181)<br />{STOP;<br />_delay_ms(10);<br />kroki=0;<br />}<br />    {[/syntax]<br />Czyli przy 181 ma się silnik zatrzymać a on się nie zatrzymuje. Ja to rozumiem tak:<br />Program wykonuje się linijka po linijce więc jak opuści już 3 if to zmienna kroki może mieć nie 181 tylko 182 więc warunek się nie wykona. <br />I teraz jak to rozwiązać. <br />1. Zrobić przerwania co 1ms odpytywać się o zmienną kroki?<br />2. Zrobić w ifach odpytania o zmienną kroki:<br />[syntax=c]if (kroki&lt;90)<br />    {<br />    KROK4;<br />     _delay_ms(10);<br />    kroki++;<br />if(kroki=181)<br />{<br />STOP;<br />_delay_ms(10);<br />kroki=0;<br />}<br />    KROK3;<br />    _delay_ms(10);<br />     kroki++;<br />if(kroki=181)<br />{<br />STOP;<br />_delay_ms(10);<br />kroki=0;<br />}<br />    KROK2;<br />    _delay_ms(10);<br />    kroki++;<br />if(kroki=181)<br />{<br />STOP;<br />_delay_ms(10);<br />kroki=0;<br />}<br />     KROK1;<br />     _delay_ms(10);<br />     kroki++;<br />if(kroki=181)<br />{<br />STOP;<br />_delay_ms(10);<br />kroki=0;<br />}<br />    }[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=11544">elektronikq</a> — 11 kwi 2018, o 12:04</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[rskup]]></name></author>
<updated>2018-04-10T21:54:41+01:00</updated>
<published>2018-04-10T21:54:41+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=20321&amp;p=206707#p206707</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=20321&amp;p=206707#p206707"/>
<title type="html"><![CDATA[Re: Silnik bipolarny dla początkujących]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=20321&amp;p=206707#p206707"><![CDATA[
Wklejone kody są chyba lekko rozjechane:<br /><div class="quotetitle">elektronikq napisał(a):</div><div class="quotecontent"><br />[syntax=c]if (obroty==2)<br />if(kroki&gt;=90&amp;&amp;obroty==1)<br />{<br />STOP;<br />obroty=2;<br />_delay_ms(2000);<br /> <br />}{[/syntax]<br /></div><br /><div class="quotetitle">elektronikq napisał(a):</div><div class="quotecontent"><br />[syntax=c]&#91;b&#93;KROK2;<br />_delay_ms(10);<br />kroki++;&#91;/b&#93;[/syntax]<br /></div><br /><div class="quotetitle">elektronikq napisał(a):</div><div class="quotecontent"><br />[syntax=c]&#91;b&#93;if()&#91;/b&#93;<br />_delay_ms(10);<br /> kroki++;<br />&#91;b&#93;KROK2;<br />&#91;b&#93;if()&#91;/b&#93;<br />_delay_ms(10);<br />kroki++;&#91;/b&#93;<br /> KROK1;<br />&#91;b&#93;if ()&#91;/b&#93;[/syntax]<br /></div><br />Popraw je, bo w takiej ich postaci to ciężko jest się na ich temat wypowiedzieć <img src="https://forum.atnel.pl/images/smilies/icon_e_sad.gif" alt=":(" title="Smutny" />.<br /><br />-- <br />Pozdrawiam,<br />Robert<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3427">rskup</a> — 10 kwi 2018, o 21:54</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[elektronikq]]></name></author>
<updated>2018-04-10T20:02:25+01:00</updated>
<published>2018-04-10T20:02:25+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=20321&amp;p=206696#p206696</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=20321&amp;p=206696#p206696"/>
<title type="html"><![CDATA[Re: Silnik bipolarny dla początkujących]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=20321&amp;p=206696#p206696"><![CDATA[
Jak mam w programie:<br /><br /><br />[syntax=c]if (obroty==2)<br />if(kroki&gt;=90&amp;&amp;obroty==1)<br />{<br />STOP;<br />obroty=2;<br />_delay_ms(2000);<br /><br />}{<br />KROK4;<br /> _delay_ms(10);<br />kroki++;<br />KROK3;<br />_delay_ms(10);<br /> kroki++;<br />KROK2;<br />_delay_ms(10);<br />kroki++;<br /> KROK1;<br /> _delay_ms(10);<br /> kroki++;<br />}[/syntax]<br /><br />To program się wykonuje po kolei i kolejny krok <br />np. if (obroty==91) może się nie wykonać ponieważ, jak program doliczy do 91 i trafi na moment:<br />[syntax=c]if (obroty==2)<br />{<br />KROK4;<br /> _delay_ms(10);<br />kroki++;<br />KROK3;<br />_delay_ms(10);<br /> kroki++;<br />&#91;b&#93;KROK2;<br />_delay_ms(10);<br />kroki++;&#91;/b&#93;<br /> KROK1;<br /> _delay_ms(10);<br /> kroki++;<br />}[/syntax]<br />To zaraz będzie miał 92 i dopiero potem trafi na kolejny if  gdzie pyta czy silnik zrobił 92 kroki więc go nie wykona.<br />Lepiej co każdy krok pytać if' em czy sprawdzić czy wykonał 92 kroki czyli obrót:<br />[syntax=c]if (obroty==2)<br />{<br />KROK4;<br />&#91;b&#93;if()&#91;/b&#93;<br /> _delay_ms(10);<br />kroki++;<br />KROK3;<br />&#91;b&#93;if()&#91;/b&#93;<br />_delay_ms(10);<br /> kroki++;<br />&#91;b&#93;KROK2;<br />&#91;b&#93;if()&#91;/b&#93;<br />_delay_ms(10);<br />kroki++;&#91;/b&#93;<br /> KROK1;<br />&#91;b&#93;if ()&#91;/b&#93;<br /> _delay_ms(10);<br /> kroki++;<br />}[/syntax]<br /><br />czy lepiej zastosować przerwanie i sprawdzać np. co 1 ms ile jest w zmiennej KROKI?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=11544">elektronikq</a> — 10 kwi 2018, o 20:02</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[rskup]]></name></author>
<updated>2018-03-10T23:31:03+01:00</updated>
<published>2018-03-10T23:31:03+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=20321&amp;p=205397#p205397</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=20321&amp;p=205397#p205397"/>
<title type="html"><![CDATA[Re: Silnik bipolarny dla początkujących]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=20321&amp;p=205397#p205397"><![CDATA[
<div class="quotetitle">elektronikq napisał(a):</div><div class="quotecontent"><br />Czyli ta ostatni warunek w ogóle się nie wykona?<br /></div>Dokładnie tak <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" />.<br /><div class="quotetitle">elektronikq napisał(a):</div><div class="quotecontent"><br />Przy takiej konstrukcji byłoby inaczej, oczywiście zmienna kroki musiałaby się zwiększyć o 1 aby wykonać ostatnie else.<br /></div>Przy takiej konstrukcji programu i &quot;skakaniem&quot; zmiennej kroki musisz pilnować jakie wartości są możliwe. Dlatego zaproponowałem Ci inne podejście.<br /><br />Jeszcze tak dla nauki, abyś kiedyś nie musiał mieć nauczkę <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" />. Jeżeli zmienna może przyjmować wartości z całego swojego zakresu, to warto w warunkach pokryć jej cały zakres. U Ciebie zakres w warunkach kończy się na 193. A co będzie jak coś zmienisz w jej inkrementacji i będzie mieć 194 lub więcej? A rozwiązaniem jest jeden prosty znak w warunku &quot;&gt;&quot;. Zamiast: [syntax=c]else if (kroki == 193)[/syntax] dać: [syntax=c]else if (kroki &gt;= 193)[/syntax] Albo w ogóle dać tylko:<br /> [syntax=c]else[/syntax] <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: 10 minutach ]</span></strong><br /><br />Z tymi warunkami to jak ze światłami. Robisz warunki &quot;jeżeli czerwone&quot;, &quot;jeżeli żółte&quot;, &quot;jeżeli zielone&quot; i wygląda że jest OK. No nie, bo jeszcze może być pulsująca sygnalizacja lub całkowicie wyłączona. A nie daj Boże jeszcze coś się zepsuło i świeci się jakaś dziwna kombinacja <img src="https://forum.atnel.pl/images/smilies/icon_e_sad.gif" alt=":(" title="Smutny" />. I to także musi być uwzględnione w warunkach. Czyli powinien być dany na koniec else na wszystkie nieprzewidziane sytuacje w którym musisz rozwiązać problem w sposób kontrolowany i coś robiąc by nie utknąć na skrzyżowaniu jak kiedyś samochód autonomiczny Google <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" />.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3427">rskup</a> — 10 mar 2018, o 23:31</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[elektronikq]]></name></author>
<updated>2018-03-10T23:01:14+01:00</updated>
<published>2018-03-10T23:01:14+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=20321&amp;p=205396#p205396</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=20321&amp;p=205396#p205396"/>
<title type="html"><![CDATA[Re: Silnik bipolarny dla początkujących]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=20321&amp;p=205396#p205396"><![CDATA[
Czyli ta ostatni warunek wogóle się nie wykona?<br />[syntax=c]else if(kroki&gt;98&amp;&amp;kroki&lt;193)[/syntax]<br />Przy takiej konstrukcji byłoby inaczej, oczywiście zmienna kroki musiałaby się zwiększyć o 1 aby wykonać ostatnie else.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=11544">elektronikq</a> — 10 mar 2018, o 23:01</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[rskup]]></name></author>
<updated>2018-03-10T21:55:27+01:00</updated>
<published>2018-03-10T21:55:27+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=20321&amp;p=205391#p205391</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=20321&amp;p=205391#p205391"/>
<title type="html"><![CDATA[Re: Silnik bipolarny dla początkujących]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=20321&amp;p=205391#p205391"><![CDATA[
193 łapie się w warunku:<br /><div class="quotetitle">elektronikq napisał(a):</div><div class="quotecontent"><br />[syntax=c]else if(kroki&gt;98&amp;&amp;kroki&lt;194)[/syntax]<br /></div><br />oraz w:<br /><div class="quotetitle">elektronikq napisał(a):</div><div class="quotecontent"><br />[syntax=c]else if(kroki==193)[/syntax]<br /></div><br /><br />-- <br />Pozdrawiam,<br />Robert<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3427">rskup</a> — 10 mar 2018, o 21:55</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[elektronikq]]></name></author>
<updated>2018-03-09T21:02:10+01:00</updated>
<published>2018-03-09T21:02:10+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=20321&amp;p=205316#p205316</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=20321&amp;p=205316#p205316"/>
<title type="html"><![CDATA[Re: Silnik bipolarny dla początkujących]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=20321&amp;p=205316#p205316"><![CDATA[
<div class="quotetitle"><b>Quote:</b></div><div class="quotecontent"><br />Warunek opierasz na jednej zmiennej to kroki, więc pomyśl o zastosowaniu switch-a zamiast warunków if. W takim wypadku kompilator d razu podałby Ci że warunek kroki==193 jest już wcześniej zawarty w innym, więc ten else się nie wykona.<br /></div><br />W którym miejscu w programie kroki się równają 193 dwa razy?<br />Jutro będę miał zestaw i przetestuje programy. <br />Dziękuje za pomoc.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=11544">elektronikq</a> — 9 mar 2018, o 21:02</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[rskup]]></name></author>
<updated>2018-03-01T11:53:42+01:00</updated>
<published>2018-03-01T11:53:42+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=20321&amp;p=204765#p204765</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=20321&amp;p=204765#p204765"/>
<title type="html"><![CDATA[Re: Silnik bipolarny dla początkujących]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=20321&amp;p=204765#p204765"><![CDATA[
Kontynuując propozycję zrobienia tego samego w lepszej kodowo wersji, zobacz czy coś takiego nie będzie dla Ciebie zrozumiałe, a jak bardzo uniwersalne i przejrzyste to jest:<br />[syntax=c]uint8_t kroki = 1;<br />uint16_t timer = 0;<br /><br />while(1)<br />{<br />if (timer == 0)<br />{<br />switch (kroki)<br />{<br />case 1 ... 97:<br />move(LEFT);<br />timer = 10;<br />break;<br />case 98:<br />move(OFF);<br />timer = 2000;<br />break;<br />case 99 ... 193:<br />move(RIGHT);<br />timer = 5;<br />break;<br />default:<br />move(OFF);<br />kroki = 0;<br />timer = 2000;<br />}<br />kroki++;<br />}<br />_delay_ms(1);<br />timer--;<br />}[/syntax]<br /><br />Aby wykonać krok wystarczy zmiana stanu pinów. Więc aby wykonać kilka kroków to trzeba wywołać kilka razy razy funkcję w określonych odstępach. Nie ma konieczności czekania między nimi, tylko można ten czas oddać innym funkcją / procesom. Aby nie dokładać kolejnego elementu to zamiast timerów sprzętowych / programowych jest w przykładzie dana funkcja _ms_delay() wywoływana wielokrotnie do czasu wyzerowania zmiennej timer. Ale struktura jest już przygotowana pod użycie timera programowego / sprzętowego. Argumentem funkcji _ms_delay() jest 1, więc timer określa opóźnienie w ms.<br /><br />W funkcji move używany jest argument będący jednym z trzech wartości:<br />[syntax=c]enum { OFF, LEFT, RIGHT };[/syntax]<br /><br />To teraz wystarczy dodać funkcję move która odpowiednio zmieni położenie silnika.<br />W funkcji move musimy pilnować fazy silnika by odpowiednio ją zmieniać (inaczej w lewo a inaczej w prawo), więc powołujemy statyczną zmienną phase.<br />[syntax=c]void move(uint8_t dir)<br />{<br />static uint8_t phase = 0;<br /><br />if (dir == OFF)<br />{<br />STOP;<br />}<br />else<br />{<br />switch (dir)<br />{<br />case LEFT:<br />phase++;<br />if (phase &gt; 4) phase = 1;<br />break;<br />case RIGHT:<br />phase--;<br />if (phase &lt; 1) phase = 4;<br />break;<br />}<br /><br />switch (phase)<br />{<br />case 1:<br />KROK1;<br />break;<br />case 2:<br />KROK2;<br />break;<br />case 3:<br />KROK3;<br />break;<br />default:<br />KROK4;<br />break;<br />}<br />}<br /><br />}[/syntax]<br />Jak wysłaliśmy OFF, to tylko wyłączamy silnik. Jak LEWO i PRAWO, to odpowiednio zwiększamy lub zmniejszamy pharse a następnie nowy stan wystawiamy na piny.<br />Dzięki temu wywołanie OFF wyłączy silnik ale nie zgubi fazy kroków.<br /><br />-- <br />Pozdrawiam,<br />Robert<br /><br />PS. Kod pisany jest na sucho, bo nie mam w tej chwili jak sprawdzić, więc mam nadzieję że nie ma w nim błędów <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" />.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3427">rskup</a> — 1 mar 2018, o 11:53</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[rskup]]></name></author>
<updated>2018-03-01T10:12:28+01:00</updated>
<published>2018-03-01T10:12:28+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=20321&amp;p=204758#p204758</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=20321&amp;p=204758#p204758"/>
<title type="html"><![CDATA[Re: Silnik bipolarny dla początkujących]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=20321&amp;p=204758#p204758"><![CDATA[
Polecam Ci podłączenie wyświetlacza np. LCD 2x16 i na niego wyrzucanie wartości zmiennych np. zmiennej kroki. Dzięki czemu będziesz widział jak zachowuje się twój program i gdzie masz błąd. Jak na podłączanie wyświetlacza jest u Ciebie za wcześnie (choć jak zajrzysz do BB to wszystko stanie się od razu jasne), to podłącz na któryś wolny port 8 diodek i wrzucaj do niego stan zmiennej - będą zaświecać Ci się odpowiednio diody pokazując wartość zmiennej, choć to jest trudniejsze do obserwacji jak nie ma się naturalnego liczenia w kodzie binarnym <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" />.<br /><br /><br />Warunek opierasz na jednej zmiennej to kroki, więc pomyśl o zastosowaniu switch-a zamiast warunków if. W takim wypadku kompilator d razu podałby Ci że warunek kroki==193 jest już wcześniej zawarty w innym, więc ten else się nie wykona.<br /><br /><br />Nie jest dobrym zwyczajem opierać warunki wykonania ruchu (zmienna kroki) od fazy kroku. Bo jak źle zrobisz w warunkach granicę to będziesz przeskakiwał kroki i będzie problem z kręceniem silnikiem.<br />Rozumiem że to są początki programowania, ale może warto od razu wyrzucić z pętli warunków na liczbę kroków samo kręcenie silnikiem do zewnętrznej funkcji i w niej trzymać fazę silnika. A wywoływać ją tylko z argumentem liczby kroków i ewentualnie kierunek i opóźnienie i nie interesować się w głównej części czy ma to być teraz KROK1 czy może KROK3.<br /><br />-- <br />Pozdrawiam,<br />Robert<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3427">rskup</a> — 1 mar 2018, o 10:12</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[elektronikq]]></name></author>
<updated>2018-02-28T21:49:19+01:00</updated>
<published>2018-02-28T21:49:19+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=20321&amp;p=204730#p204730</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=20321&amp;p=204730#p204730"/>
<title type="html"><![CDATA[Re: Silnik bipolarny dla początkujących]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=20321&amp;p=204730#p204730"><![CDATA[
Dziękuje Mistrzu. Napisałem tak:<br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;util/delay.h&gt;<br /><br /><br /> //definicje<br /><br />#define A1 (1&lt;&lt;PB0)<br />#define A2 (1&lt;&lt;PB1)<br />#define B1 (1&lt;&lt;PB2)<br />#define B2 (1&lt;&lt;PB3)<br /><br />#define KROK1 PORTB |=A1|B1; PORTB &amp;= ~(A2|B2)<br />#define KROK2 PORTB |=A2|B1; PORTB &amp;= ~(A1|B2)<br />#define KROK3 PORTB |=A2|B2; PORTB &amp;= ~(A1|B1)<br />#define KROK4 PORTB |=A1|B2; PORTB &amp;= ~(A2|B1)<br />#define STOP PORTB &amp;= ~(A1|A2|B1|B2)<br />uint8_t kroki, prawo, lewo;<br /> int main (void)<br /> {<br /><br /> DDRB |= A1|A2|B1|B2;<br /><br />while(1)<br /><br />{<br /> if(kroki&lt;97)<br />{<br />           KROK1;<br />      _delay_ms(10);<br />   kroki++;<br />   KROK2;<br />   _delay_ms(10);<br />kroki++;<br />KROK3;<br />    _delay_ms(10);<br />kroki++;<br />KROK4;<br />_delay_ms(10);<br />kroki++;<br />}<br /> else if(kroki==98)<br /> {<br />STOP;<br />_delay_ms(2000);<br />kroki++;<br /> }<br /> else if(kroki&gt;98&amp;&amp;kroki&lt;194)<br /> {<br /> KROK4;<br /> _delay_ms(5);<br />        kroki++;<br /> KROK3;<br /> _delay_ms(5);<br />     kroki++;<br />     KROK2;<br />     _delay_ms(5);<br />kroki++;<br />    KROK1;<br />    _delay_ms(5);<br />    kroki++;<br /><br />}<br /> else if(kroki==193)<br />  {<br /> STOP;<br /> kroki=1;<br />     _delay_ms(2000);<br /><br />  }<br /><br /><br />}<br /> }[/syntax]<br />I program tak działa jak chce. Obrót wolny w prawo, stop = 2 sekundy i obrót szybki w lewo. I chciałem, żeby program się zapętlił i ustawiłem na koniec kroki=1; ale silnik stoi. Czy może ktoś podpowiedzieć w czym błąd?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=11544">elektronikq</a> — 28 lut 2018, o 21:49</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[rskup]]></name></author>
<updated>2018-02-28T20:45:45+01:00</updated>
<published>2018-02-28T20:45:45+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=20321&amp;p=204721#p204721</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=20321&amp;p=204721#p204721"/>
<title type="html"><![CDATA[Re: Silnik bipolarny dla początkujących]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=20321&amp;p=204721#p204721"><![CDATA[
<div class="quotetitle"><b>Quote:</b></div><div class="quotecontent"><br />O co chodzi z if(kroki==0)prawo=1;?<br /></div>Po if oraz po else wykonywana jest jedna instrukcja. Jeżeli chcesz dawać więcej to musisz zrobić blok poprzez użycie nawiasów klamrowych { }. Danie zapisu prawo=1; kończy w tej linii wszystkie instrukcje wykonywane przy spełnieniu warunku w if-ie. Kolejnym słowem nie jest else (tylko nawias {), więc kończy się całkowicie sprawdzanie warunku i instrukcje.<br /><br />Zapis if - else jest bardzo logiczny. if to jest jeżeli a else oznacza w przeciwnym wypadku. Działania to jedna instrukcja lub blok instrukcji znajdujący się w nawisach {}. Jeżeli po działaniach z if znajduje się else to wykonywane są działania w przypadku niespełnienia warunku. A jak jest coś innego, to traktowane jest to jako kolejna niezależna instrukcja.<br />[syntax=c]if (warunek) DZIAŁANIA_PO_SPEŁNIENIU_WARUNKU;<br />else DZIAŁANIA_PO_NIESPEŁNIENIU_WARUNKU;[/syntax]<br />Oczywiście działaniem może być kolejna instrukcja if, dzięki temu można zagnieżdżać warunki:<br />[syntax=c]if (warunek1) DZIAŁANIA_PO_SPEŁNIENIU_WARUNKU1;<br />else<br />     if (warunek2) DZIAŁANIA_PO_SPEŁNIENIU_WARUNKU2;<br />     else ....[/syntax] <br /><br />-- <br />Pozdrawiam,<br />Robert<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3427">rskup</a> — 28 lut 2018, o 20:45</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[elektronikq]]></name></author>
<updated>2018-02-28T19:19:06+01:00</updated>
<published>2018-02-28T19:19:06+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=20321&amp;p=204716#p204716</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=20321&amp;p=204716#p204716"/>
<title type="html"><![CDATA[Re: Silnik bipolarny dla początkujących]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=20321&amp;p=204716#p204716"><![CDATA[
Czytając bb mam pokazane że pod if-em może być kilka else if.<br />//<em>część programu</em><br />if (warunek1) instrukcja1;<br />else if (warunek2) instrukcja2; /1<br />else if (warunek3) instrukcja3; /2<br />else if (warunek4) instrukcja4; /3<br /><br /><em>dalsza część programu</em> //<br /><br />Mam kilka else po jednym if i jest dobrze?<br />Jeśli chodzi o zrozumienie if i else kodu wyżej:<br />Jeśli warunek będzie spełniony to wykona się instrukcja1 i potem program wraca do <em>dalszej części programu</em><br /> czy sprawdza wszystkie else if i wrazie spełnienia warunków2 i 3 i 4 wykonuje instrukcje 2, 3 i 4?<br /><br />Jeśli chodzi o zagnieżdzenie if w if-ie? Czy jeśli używam w if-e podrzędnym zmiennej globalnej czy lokalnej to po zmianie tej zmiennej będzie ona dostępna poza if-em podrzędnym i nadrzędnym np.:<br /><br /> if (warunek)<strong> if nadrzędny</strong><br />{<br />instrukcja <br />if (warunek 1) instrukcja1( np.: zmienna=1;) <strong>if podrzędny</strong><br />}<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=11544">elektronikq</a> — 28 lut 2018, o 19:19</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Marhef]]></name></author>
<updated>2018-02-28T18:32:47+01:00</updated>
<published>2018-02-28T18:32:47+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=20321&amp;p=204708#p204708</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=20321&amp;p=204708#p204708"/>
<title type="html"><![CDATA[Re: Silnik bipolarny dla początkujących]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=20321&amp;p=204708#p204708"><![CDATA[
Postarałem się wyjaśnić błąd syntax error opisami w kodzie <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><div class="quotetitle">elektronikq napisał(a):</div><div class="quotecontent"><br />[syntax=c]if(kroki==0&amp;&amp;kroki&lt;90)prawo=1;<br />{                  &lt;--------------- tu jest błąd, ten blok instrukcji jest już poza ifem (tak, możesz sobie w dowolnym miejscu dodać nawiasy klamrowe. Tylko musisz je pozamykać :))<br /><br />if(prawo==1)          &lt;------- tu jest warunek do uwagi niżej<br />{<br />           KROK1;<br />      _delay_ms(10);<br />   kroki++;<br />   KROK2;<br />   _delay_ms(10);<br />kroki++;<br />KROK3;<br />    _delay_ms(10);<br />kroki++;<br />KROK4;<br />_delay_ms(10);<br />kroki++;<br />}<br />}                                         &lt;-------- przed tym nawiasem mógłbyś dać else if, ale wtedy dotyczyłoby to warunku wskazanego wyżej<br /><br />if(kroki==91)prawo=0;&lt;--------  więc dając tu else if wywala błąd, bo nie ma ifa do else[/syntax]<br /></div><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=12752">Marhef</a> — 28 lut 2018, o 18:32</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[elektronikq]]></name></author>
<updated>2018-02-28T14:27:01+01:00</updated>
<published>2018-02-28T14:27:01+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=20321&amp;p=204695#p204695</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=20321&amp;p=204695#p204695"/>
<title type="html"><![CDATA[Re: Silnik bipolarny dla początkujących]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=20321&amp;p=204695#p204695"><![CDATA[
O co chodzi z if(kroki==0)prawo=1;?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=11544">elektronikq</a> — 28 lut 2018, o 14:27</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[rskup]]></name></author>
<updated>2018-02-28T12:04:10+01:00</updated>
<published>2018-02-28T12:04:10+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=20321&amp;p=204686#p204686</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=20321&amp;p=204686#p204686"/>
<title type="html"><![CDATA[Re: Silnik bipolarny dla początkujących]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=20321&amp;p=204686#p204686"><![CDATA[
<div class="quotetitle">elektronikq napisał(a):</div><div class="quotecontent"><br />Dlaczego jak ostani if zapiszę:<br />    [syntax=c]else  if(kroki==91)prawo=0;[/syntax]<br />to wyskakuje syntax error.<br /></div>Musisz przyjrzeć się swojej składni kodu i podział na elementy które będą wykonywane przy poszczególnych warunkach (np. nawiasy).<br /><div class="quotetitle">elektronikq napisał(a):</div><div class="quotecontent"><br />[syntax=c]if(kroki==0)prawo=1;<br />                                {[/syntax]<br /></div><br /><br />-- <br />Pozdrawiam,<br />Robert<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3427">rskup</a> — 28 lut 2018, o 12:04</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[elektronikq]]></name></author>
<updated>2018-02-27T09:12:23+01:00</updated>
<published>2018-02-27T09:12:23+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=20321&amp;p=204642#p204642</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=20321&amp;p=204642#p204642"/>
<title type="html"><![CDATA[Silnik bipolarny dla początkujących]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=20321&amp;p=204642#p204642"><![CDATA[
Żeby lepiej zrozumieć sterowanie silnika to postanowiłem sam się pobawić i mam kilka pytań:<br /><br />[syntax=c]if(kroki==0&amp;&amp;kroki&lt;90)prawo=1;<br />{<br /><br />if(prawo==1)<br />{<br />           KROK1;<br />      _delay_ms(10);<br />   kroki++;<br />   KROK2;<br />   _delay_ms(10);<br />kroki++;<br />KROK3;<br />    _delay_ms(10);<br />kroki++;<br />KROK4;<br />_delay_ms(10);<br />kroki++;<br />}<br />}<br /><br />if(kroki==91)prawo=0;[/syntax]<br />Silnik cały czas się kręci w prawo a wg mojego zamysłu miał kręcić się tylko 90 kroków. To się dzieje przez zagnieżdżenie if w if?? Zmienna prawo jest zmienną lokalną więc chyba ma dostęp z if podrzędnego do if-a nadrzędnego. Dlaczego jak ostani if zapiszę:<br />[syntax=c]else  if(kroki==91)prawo=0;[/syntax] to wyskakuje syntax error.<br />Układ testuje Atmega 32 (zestaw ATB), Eclipse.<br />Czy taka składnia jest poprawna:<br />[syntax=c]if(warunek1)<br />{<br />if (warunek2) instrukcja1;<br />else if (warunek3) instrukcja2;<br />}[/syntax]<br />czy niesie za sobą jakieś niebezpieczeństwo?<br /><br /><br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;util/delay.h&gt;<br /><br /><br /> //definicje<br /><br />#define A1 (1&lt;&lt;PB0)<br />#define A2 (1&lt;&lt;PB1)<br />#define B1 (1&lt;&lt;PB2)<br />#define B2 (1&lt;&lt;PB3)<br /><br />#define KROK1 PORTB |=A1|B1; PORTB &amp;= ~(A2|B2)<br />#define KROK2 PORTB |=A2|B1; PORTB &amp;= ~(A1|B2)<br />#define KROK3 PORTB |=A2|B2; PORTB &amp;= ~(A1|B1)<br />#define KROK4 PORTB |=A1|B2; PORTB &amp;= ~(A2|B1)<br />#define STOP PORTB &amp;= ~(A1|A2|B1|B2)<br />uint8_t kroki, prawo, lewo;<br /> int main (void)<br /> {<br /><br /> DDRB |= A1|A2|B1|B2;<br /><br />while(1)<br /><br />{<br />if(kroki==0)prawo=1;<br />{<br />if(prawo==1&amp;&amp;kroki&lt;95)<br />{<br />           KROK1;<br />      _delay_ms(10);<br />   kroki++;<br />   KROK2;<br />   _delay_ms(10);<br />kroki++;<br />KROK3;<br />    _delay_ms(10);<br />kroki++;<br />KROK4;<br />_delay_ms(10);<br />kroki++;<br />}<br /><br />}<br /><br />if(kroki==96) prawo=0;<br /><br /><br />}<br /><br />}[/syntax]<br />Silnik zrobi 95 kroków i się zatrzymuje ale silnik &quot;trzyma&quot; zmienna prawo się nie zeruje?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=11544">elektronikq</a> — 27 lut 2018, o 09:12</p><hr />
]]></content>
</entry>
</feed>