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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2015-10-02T18:40:20+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=23&amp;t=161&amp;mode</id>
<entry>
<author><name><![CDATA[Oliveer]]></name></author>
<updated>2015-10-02T18:40:20+01:00</updated>
<published>2015-10-02T18:40:20+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=161&amp;p=141245#p141245</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=161&amp;p=141245#p141245"/>
<title type="html"><![CDATA[Re: SunDuino-NelDuino  --&gt; K2000 -- nie znoszę delay..]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=161&amp;p=141245#p141245"><![CDATA[
Trochę temat odkopię, sprawa jest prosta, przy starcie currentMillis ma wartość 0, tak jak i previousMillis, interwał 1000.<br /><br />Po sekundzie currentMillis == 1000 a previousMillis == 0, czyli 1000 - 0 &gt; 1000 (tutaj bym użył  ' &gt;= ' ponieważ przy ' &gt; ' warunek zostanie spełniony przy 1001 i zmienna previousMillis przyjmie wartość 1001, 2002, 2003...) <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><div class="quotetitle">Sami88 napisał(a):</div><div class="quotecontent"><br />if (currentMillis - previousMillis &gt; interval)<br /></div><br /><br />Warunek interwal został spełniony więc  previousMillis ma teraz wartość = 1000, a dokładnie 1001 <img src="https://forum.atnel.pl/images/smilies/icon_e_biggrin.gif" alt=":D" title="Bardzo szczęśliwy" /><br /><div class="quotetitle">Sami88 napisał(a):</div><div class="quotecontent"><br />previousMillis = currentMillis;<br /></div><br /><br />licznik currentMillis leci dalej, więc jak doleci do 2000 to analogicznie if (2001-1000 &gt;= 1000) previousMillis = 2000. (2002)<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=4152">Oliveer</a> — 2 paź 2015, o 18:40</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Sami88]]></name></author>
<updated>2015-07-12T08:02:54+01:00</updated>
<published>2015-07-12T08:02:54+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=161&amp;p=134252#p134252</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=161&amp;p=134252#p134252"/>
<title type="html"><![CDATA[Re: SunDuino-NelDuino  --&gt; K2000 -- nie znoszę delay..]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=161&amp;p=134252#p134252"><![CDATA[
<strong>NIE ROZUMIĆ <img src="https://forum.atnel.pl/images/smilies/icon_neutral.gif" alt=":|" title="Średnio zadowolony" /></strong> , skąd się bierze wartość currentMillis = millis(); <br />Jaką wartość otrzymuje w tym przykładzie currentMillis ?<br /><br />[syntax=cpp]unsigned long currentMillis = millis(); // tu przekazałem zmiennej aktualna wartość<br />// zwracana przez funkcję millis();<br /><br />if (currentMillis - previousMillis &gt; interval) // no chyba wiadomo co tutaj robię<br /><br />// jeśli (currentMillis -(minus) previousMillis jest większe od interval)[/syntax]<br /><br />Wychodzi na to iż currentMillis jest nieznaną i zmienna millis() też jest nieznaną. Nie mogę tego zrozumieć.<br /><br />Więc jeśli nieznana <strong>currentMillis</strong> odjąć znana <strong>previousMillis</strong> jest mniejsza od znana <strong>interval</strong><br />[syntax=cpp]if (currentMillis - previousMillis &gt; interval)[/syntax]<br /><br />Wykonaj:<br />Zdefiniowana <strong>previousMillis</strong> wartość 0 jest równa <strong>currentMillis</strong>, więc <strong>currentMillis</strong> jest równe 0, i dopiero tutaj nadaliśmy wartość <strong>currentMillis</strong> = 0<br />[syntax=cpp]previousMillis = currentMillis;[/syntax]<br /><br />Jeśli zdefiniowana <strong>ledState</strong> będzie mieć stan niski<br />[syntax=cpp]if (ledState == LOW)[/syntax]<br /><br />Podajemy <strong>ledState</strong> stan wysoki<br />[syntax=cpp]ledState = HIGH;[/syntax]<br /><br />A jak nie pozostaw stan niski<br />[syntax=cpp]else<br />ledState = LOW;[/syntax]<br /><br />Wysyłamy na kanał wyjściowy <strong>ledPin</strong> stan <strong>ledState</strong><br />[syntax=cpp]digitalWrite(ledPin, ledState);[/syntax]<br /><br /><strong>JAK TO ROZUMIEM ??</strong><br />Kod staruje od początku i zatrzymuje się  na<br /><br />[syntax=cpp]if (currentMillis - previousMillis &gt; interval)[/syntax]<br /><br />W tym momencie wartość <strong>previousMillis</strong> jest zmienną która z wartości 0 rośnie do 1000 milisekund i gdy osiąga ten stan program idzie dalej, ponieważ korzysta z wewnętrznego zegara mikroprocesora który startuje od chwili zasilenia. Pytanie czy zmieniając wartość 0 na 100 jaki będzie tego skutek ? Czy zero ma tu być obligatoryjne zawsze ma być ta wartość ?<br /><br />Rozpoczyna się funkcja <strong>if</strong> i tutaj zmienna <strong>previousMillis</strong> oraz <strong>currentMillis</strong> jaką otrzymują wartość ? Jest to 1000 milisekund albo 0. Jeśli wartość jest brana ze zmiennej globalnej to jest to wartość zresetowana i ma wartość 0. Ale też jest to operacja w funkcji, więc powinna mieć wartość 1000 milisekund + 1 milisekunda. (kod poniżej)<br /><br />[syntax=cpp]previousMillis = currentMillis;[/syntax]<br /><br />W tedy zostaje sprawdzony stan wyjścia pinu i jeśli ma wartość niską<br /><br />[syntax=cpp]if (ledState == LOW)[/syntax]<br /><br />zmiennej <strong>ledState</strong> nadana jest wartość Wysoką, po czym na końcu kodu zostaje wysłana ta wartość na pin po upływie 1000 milisekund po czym program zaczyna od nowa. Ponieważ na starcie stan zmiennej <strong>ledState</strong> był niski to teraz jest wysoki i zostaje zapalona dioda itd. Czy ktoś może mi odpowiedzieć na pytani które zawarłem czy aby dobrze rozumuje ten kod ?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=10480">Sami88</a> — 12 lip 2015, o 08:02</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[kierlan]]></name></author>
<updated>2012-01-25T23:53:02+01:00</updated>
<published>2012-01-25T23:53:02+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=161&amp;p=2079#p2079</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=161&amp;p=2079#p2079"/>
<title type="html"><![CDATA[Re: SunDuino-NelDuino  --&gt; K2000 -- nie znoszę delay..]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=161&amp;p=2079#p2079"><![CDATA[
nio dobrze czyli zatem nie da rady kombinować w kierunku którym chciałem <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=84">kierlan</a> — 25 sty 2012, o 23:53</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[SunRiver]]></name></author>
<updated>2012-01-25T22:30:18+01:00</updated>
<published>2012-01-25T22:30:18+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=161&amp;p=2076#p2076</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=161&amp;p=2076#p2076"/>
<title type="html"><![CDATA[Re: SunDuino-NelDuino  --&gt; K2000 -- nie znoszę delay..]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=161&amp;p=2076#p2076"><![CDATA[
dodam jeszcze tyle , że kod programu na którym się wzorowałeś kolego kierlan ,<br />jedyne co robi to tylko wyświetla wartość funkcji millis() na oknie terminala żeby <br />wszyscy zobaczyli jak ta funkcja działa , a nie liczy ileś tam czasu <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br />Jakbyś poczekał 50 dni to byś zobaczył że leci od początku <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br />(co zapomniałem dopisać <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br />Natomiast wyliczenie dokładnie 1000ms jest już wyjaśnione  w kodzie wyżej <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=58">SunRiver</a> — 25 sty 2012, o 22:30</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[SunRiver]]></name></author>
<updated>2012-01-25T22:06:16+01:00</updated>
<published>2012-01-25T22:06:16+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=161&amp;p=2075#p2075</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=161&amp;p=2075#p2075"/>
<title type="html"><![CDATA[Re: SunDuino-NelDuino  --&gt; K2000 -- nie znoszę delay..]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=161&amp;p=2075#p2075"><![CDATA[
O dzięki Mirku:)<br /><br />W tym przykładzie na serial chodziło mi o pokazanie co właściwie robi funkcja millis() , a liczy czas od uruchomienia programu.<br />Chodzi o czas pracy procesora , który możemy sobie  skoro i tak tyka do czegoś użyć <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br />Parę postów wyżej wyjaśniłem chyba dokładnie działanie funkcji:)<br /><br />A w tym przykładzie niema żadnego delaya , a obliczenia czasu są oparte na funkcji millis();<br />Niemniej postaram się jakoś łopatologicznie wyjaśnić działanie tego programiku:<br /><br />[syntax=cpp]<br /><br />const int ledPin =  13;    // Dioda podłączona do portu Digital13<br />int ledState = LOW;       // Stan pinu diody LOW <br />long previousMillis = 0;    // ta długa zmienne ma wartość początkową = 0    <br />long interval = 1000;       // ta długa zmienna przechowuje ilość zliczanych milisekund <br />                                  //  czyli 1000ms = 1s<br /> <br />void setup() {<br />  pinMode(ledPin, OUTPUT);      // tu ustawiłem pin diody D13 jako wyjście <br />                                           // z wiadomego powodu<br />}<br /> <br />void loop()<br />{<br />  unsigned long currentMillis = millis(); // tu przekazałem zmiennej aktualna wartość<br />                                                   // zwracana przez funkcję millis();<br /> <br />  if(currentMillis - previousMillis &gt; interval) // no chyba wiadomo co tutaj robię<br />  <br />  // jeśli (currentMillis -(minus) previousMillis jest większe od interval)<br />                                                        <br />{<br />    previousMillis = currentMillis;   // no bez jaj chyba jasna jest ta linijka<br />    if (ledState == LOW)  // sprawdzenie czy dioda zgaszona  <br />                                 <br /><br />      ledState = HIGH;   // to zmień na HIGH (włącz)<br />    else                      // a jak nie LOW tylko HIGH  czyli zaświecona<br />      ledState = LOW;   // to zmień na LOW czyli zgaś<br />      digitalWrite(ledPin, ledState);  // wysyłanie na port właściwego stanu w celu migania diodą <br />  }<br />}<br /> <br />[/syntax]<br /><br /><br />No teraz chyba wszyscy widzą i wiedzą jaki zamysł panuje w programie:)<br /><br />Po prostu funkcja mili sobie liczy czas pracy procka , a ja tylko przypisuje sobie wartość funkcji <br />millis() do zmiennej currentMillis i odejmuje od niej zmienną  previousMillis która ma wartość 0 (zero)<br />cały czas  bo była potrzebna tylko do tego żeby pokazać programowi że zegar ruszył od zera i sobie przyrasta:)<br />porównuje wiec wynik odejmowania zmiennej previousMillis i currentMillis i porównuję czy jest większe od zmiennej <br />interval. i w ten sposób wyliczam sobie 1 sekundę  czyli dioda mryga tak jak chciałem:) <br /><br />Zatem zmieniając wartość zmiennej interval  zmieniamy szybkość migania diody podobnie jak zmieniając wartość<br />parametru funkcji delay() <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br />i to wszystko <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=58">SunRiver</a> — 25 sty 2012, o 22:06</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2012-01-25T20:32:57+01:00</updated>
<published>2012-01-25T20:32:57+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=161&amp;p=2073#p2073</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=161&amp;p=2073#p2073"/>
<title type="html"><![CDATA[Re: SunDuino-NelDuino  --&gt; K2000 -- nie znoszę delay..]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=161&amp;p=2073#p2073"><![CDATA[
hyhyhyhy - no dokładnie o tym myślałem (że masz takie coś w kodzie) - ale zauważ że nie tylko DELAYEM ale także czasem wykonania Serlial.println <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br />Teraz to chyba już zapamiętasz to na całe życie <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> o co w tym chodzi?<br /><br />PS ... zauważ że te dodatkowe średnio 12ms to dokładnie czas potrzebny na przesłanie 12 znaków z prędkością 9600bps <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> <br /><br />a napis<br /><br />Czas: 1012 plus CRLF <br /><br />to właśnie trwa praktycznie 12ms dokładnie <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> więc zobacz jakie dokładne masz pomiary panie kochany<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 25 sty 2012, o 20:32</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[kierlan]]></name></author>
<updated>2012-01-25T20:21:17+01:00</updated>
<published>2012-01-25T20:21:17+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=161&amp;p=2072#p2072</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=161&amp;p=2072#p2072"/>
<title type="html"><![CDATA[Re: SunDuino-NelDuino  --&gt; K2000 -- nie znoszę delay..]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=161&amp;p=2072#p2072"><![CDATA[
program generjący dane na terminal to jak wyżej pisałem <img src="https://forum.atnel.pl/images/smilies/icon_razz.gif" alt=":P" title="Pokazuje język" /> kod sunrivera na ktorym opierałem się<br /><br />[syntax=cpp]<br /><br />unsigned long czas; // w zmiennej czas będziemy przekazywać aktualną wartość millis()<br /><br />void setup(){<br />  Serial.begin(9600); // 9600 bps dla portu USART<br />}<br />void loop(){<br />  Serial.print(&quot;Czas: &quot;);  // nie no chyba to jest jasne i oczywiste<br />  czas = millis(); // przypisujemy wartość millis() do zmiennej czas<br />  // wyświetlanie czasu od chwili uruchomienia programu<br />  Serial.println(czas);<br />  // delay potrzebny żeby nie wyświetlać zbędnych danych<br />  delay(1000);<br />}<br /><br /><br />[/syntax]<br /><br />opóznienie jest spowodowane DELAYEM <img src="https://forum.atnel.pl/images/smilies/icon_razz.gif" alt=":P" title="Pokazuje język" /> czyli 1s<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=84">kierlan</a> — 25 sty 2012, o 20:21</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2012-01-25T20:12:50+01:00</updated>
<published>2012-01-25T20:12:50+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=161&amp;p=2071#p2071</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=161&amp;p=2071#p2071"/>
<title type="html"><![CDATA[Re: SunDuino-NelDuino  --&gt; K2000 -- nie znoszę delay..]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=161&amp;p=2071#p2071"><![CDATA[
<div class="quotetitle">kierlan napisał(a):</div><div class="quotecontent"><br />nio widzę taki, że złe miałem założenie ponieważ zakładałem zliczanie &quot;co 1&quot; i to był błąd <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /></div><br />Ależ zlicza co jedną milisekundę - skąd takie przypuszczenie że nie ? szok ! <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> Przecież te przerwy pomiędzy wynikami są spowodowane zapewne operacjami które wykonujesz pomiędzy jednym wyświetlaniem a drugim. A kodu nie pokazałeś, który generował te dane na terminalu. Jeśli pokażesz to szybko zapewne uda się wyjaśnić co mierzyłeś i jak. <br /><br />Zastanów się, że przecież sama operacja wysyłania danych przez RS232 musi trwać i to tym dłużej jeśli nie jest zorganizowana na przerwaniach i jeśli bez przerwań to tym dłużej im mniejsza prędkość.<br /><br />Oczywiście mogę się mylić co do pewnych szczegółów bo nie zajrzałem do źródeł działania funkcji Millis() ... ale czuję że te duże przerwy wynikają z kodu , który napisałeś.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 25 sty 2012, o 20:12</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[kierlan]]></name></author>
<updated>2012-01-25T19:56:07+01:00</updated>
<published>2012-01-25T19:56:07+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=161&amp;p=2070#p2070</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=161&amp;p=2070#p2070"/>
<title type="html"><![CDATA[Re: SunDuino-NelDuino  --&gt; K2000 -- nie znoszę delay..]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=161&amp;p=2070#p2070"><![CDATA[
tak, to też prawda <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> no nic jak złapie Suna na Jabberze to na pewno naprowadzi mnie na dobry tok myślenia  jak zawsze zresztą hehe :]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=84">kierlan</a> — 25 sty 2012, o 19:56</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Sonix]]></name></author>
<updated>2012-01-25T19:48:37+01:00</updated>
<published>2012-01-25T19:48:37+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=161&amp;p=2069#p2069</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=161&amp;p=2069#p2069"/>
<title type="html"><![CDATA[Re: SunDuino-NelDuino  --&gt; K2000 -- nie znoszę delay..]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=161&amp;p=2069#p2069"><![CDATA[
Wynika z tego chyba tylko jedno, nie uda się trafić zawsze w konkretną milisekundę <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=127">Sonix</a> — 25 sty 2012, o 19:48</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[kierlan]]></name></author>
<updated>2012-01-25T19:48:01+01:00</updated>
<published>2012-01-25T19:48:01+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=161&amp;p=2068#p2068</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=161&amp;p=2068#p2068"/>
<title type="html"><![CDATA[Re: SunDuino-NelDuino  --&gt; K2000 -- nie znoszę delay..]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=161&amp;p=2068#p2068"><![CDATA[
nio widzę taki, że złe miałem założenie ponieważ zakładałem zliczanie &quot;co 1&quot; i to był błąd <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=84">kierlan</a> — 25 sty 2012, o 19:48</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2012-01-25T18:19:27+01:00</updated>
<published>2012-01-25T18:19:27+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=161&amp;p=2067#p2067</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=161&amp;p=2067#p2067"/>
<title type="html"><![CDATA[Re: SunDuino-NelDuino  --&gt; K2000 -- nie znoszę delay..]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=161&amp;p=2067#p2067"><![CDATA[
No i bardzo dobrze wygląda to zliczanie - a ty widzisz jakiś problem ? - bo nie zrozumiałem<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 25 sty 2012, o 18:19</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[kierlan]]></name></author>
<updated>2012-01-25T16:16:49+01:00</updated>
<published>2012-01-25T16:16:49+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=161&amp;p=2066#p2066</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=161&amp;p=2066#p2066"/>
<title type="html"><![CDATA[Re: SunDuino-NelDuino  --&gt; K2000 -- nie znoszę delay..]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=161&amp;p=2066#p2066"><![CDATA[
odpalając program na którym się wzorowałem jako tako, chyba wychwyciłem jeden z problemów.. tak wygląda zliczanie 0_o <br /><br /><a href="http://img141.imageshack.us/i/beztytuufo.png/"  class="postlink"><img src="http://img141.imageshack.us/img141/7343/beztytuufo.png" alt="Obrazek" /></a><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=84">kierlan</a> — 25 sty 2012, o 16:16</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[kierlan]]></name></author>
<updated>2012-01-25T16:04:50+01:00</updated>
<published>2012-01-25T16:04:50+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=161&amp;p=2065#p2065</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=161&amp;p=2065#p2065"/>
<title type="html"><![CDATA[Re: SunDuino-NelDuino  --&gt; K2000 -- nie znoszę delay..]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=161&amp;p=2065#p2065"><![CDATA[
hm.. moja logika myślenia była taka tutaj, że czas = millis(); czyli jeśli dam warunek if czas = 1000 to będzie to działać w sposób następujący: jeżeli licznik doleci do 1000 to stanie się to i to <img src="https://forum.atnel.pl/images/smilies/icon_razz.gif" alt=":P" title="Pokazuje język" /> a jezeli doleci do 2000 to to i to oraz wyzeruje licznik :]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=84">kierlan</a> — 25 sty 2012, o 16:04</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2012-01-25T15:53:56+01:00</updated>
<published>2012-01-25T15:53:56+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=161&amp;p=2064#p2064</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=161&amp;p=2064#p2064"/>
<title type="html"><![CDATA[Re: SunDuino-NelDuino  --&gt; K2000 -- nie znoszę delay..]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=161&amp;p=2064#p2064"><![CDATA[
Może ja nie Sun, ale podpowiem ci, żebyś rzucił okiem na właściwy kod który pokazał kolega Sun <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br />[syntax=c]if(currentMillis - previousMillis &gt; interval)[/syntax]<br /><br />jak myślisz do czego powołał kolega Sun, dodatkową zmienną previousMilis albo interval ??? przeanalizuj to w tym jego przykładzie a doznasz olśnienia i życie bez delay'ów stanie się piękne <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br />Bo ty próbujesz to załatwić w taki nieoczekiwany sposób <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br />[syntax=c_mac]if (czas = 1000) [/syntax]<br /><br />więc chyba widzisz, że coś jest nie tak<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 25 sty 2012, o 15:53</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[kierlan]]></name></author>
<updated>2012-01-25T15:49:49+01:00</updated>
<published>2012-01-25T15:49:49+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=161&amp;p=2063#p2063</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=161&amp;p=2063#p2063"/>
<title type="html"><![CDATA[Re: SunDuino-NelDuino  --&gt; K2000 -- nie znoszę delay..]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=161&amp;p=2063#p2063"><![CDATA[
Achoj <img src="https://forum.atnel.pl/images/smilies/icon_razz.gif" alt=":P" title="Pokazuje język" /> <br /><br />&quot;Sun&quot; mam do Ciebie pytanko <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br />ostatnio po tym &quot;nie znoszę delay&quot; :&gt; zacząłem  wyszukiwać sobie innej drogi i tutaj na bazie ostatniego Twojego kodziuku zmodziłem coś takiego z tym, że prawdopodobnie(bo nie działa jak należy) problem tkwi w nieprawidłowym resetowaniu licznika...<br /><br />[syntax=cpp]<br /><br />unsigned long czas = 0;<br /><br /><br />void setup()<br />{<br />  pinMode(13, OUTPUT);<br />}<br />void loop()<br />{<br /><br />  czas = millis(); <br /><br /> if (czas = 1000)  // cykl od 0-1000ms - LOW<br /> {<br />   digitalWrite(13, HIGH);<br />   <br />   <br /> }<br /> if (czas = 2000) // cykl 1000-2000ms - HIGH<br /> {<br />   digitalWrite(13, LOW);<br />   czas = 0;    // powrót do cyklu 0-1000ms - LOW<br /> }<br /> <br />}<br /><br />[/syntax]<br /><br />a dokładnie ta linijka: <br /><br />[syntax=cpp]<br />  czas = 0;    // powrót do cyklu 0-1000ms - LOW<br />[/syntax]<br /><br />opisałem w kodzie o co mi chodziło dokładnie, program to hello world &quot;blink&quot; ;P<br /><br />Czekam na podpowiedź lub sugestie nie korzystałem  jeszcze z tego cudowatego licznika :]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=84">kierlan</a> — 25 sty 2012, o 15:49</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[SunRiver]]></name></author>
<updated>2012-01-24T13:04:57+01:00</updated>
<published>2012-01-24T13:04:57+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=161&amp;p=2041#p2041</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=161&amp;p=2041#p2041"/>
<title type="html"><![CDATA[Re: SunDuino-NelDuino  --&gt; K2000 -- nie znoszę delay..]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=161&amp;p=2041#p2041"><![CDATA[
Fakt trochę mało czytelnie opisałem za co przepraszam , powinienem do komentować linie , ale w tak banalnych programach często komentarze pomijam bo zasadniczo niema tu żadnych rozbudowanych funkcji i algorytmów <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br />Ująłem tu tylko najprostsze z możliwych jak w pierwszym przykładzie użycie pętli FOR i IF/ELSE , zasady ich działania <br />są totalnymi fundamentami nauki programowania.  W drugim przykładzie istotnie użyłem funkcji bibliotecznej Millis(), która w istocie wymaga wyjaśnienia:<br /><br />-- Millis() <br /><br />jest funkcja czasową zaimplementowana w środowisku arduino ide , która zwraca liczbę milisekund <br />od czasu uruchomienia bieżącego programu na procesorze. Co ciekawe powrót do zera czyli przepełnienie <br />nastąpi po około 50 dniach (jeśli nie zresetujemy procesora). <br /><br />Najlepiej chyba to zobrazuje mały przykład,<br />w którym będziemy w terminalu wyświetlać czas działania programu:<br /><br />[syntax=cpp]<br />unsigned long czas; // w zmiennej czas będziemy przekazywać aktualną wartość millis()<br /><br />void setup(){<br />  Serial.begin(9600); // 9600 bps dla portu USART<br />}<br />void loop(){<br />  Serial.print(&quot;Czas: &quot;);  // nie no chyba to jest jasne i oczywiste<br />  czas = millis(); // przypisujemy wartość millis() do zmiennej czas<br />  // wyświetlanie czasu od chwili uruchomienia programu<br />  Serial.println(czas);<br />  // delay potrzebny żeby nie wyświetlać zbędnych danych<br />  delay(1000);<br />}<br /><br />[/syntax]<br /><br />Już chyba jasne jest do czego służy funkcja millis(), mówiąc  w skrócie procesor zlicza czas działania od chwili <br />uruchomienia programu (każdego) i dzięki funkcji millis() mamy możliwość skorzystania z tego ukrytego licznika<br />co tez warto czynić <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br />Wyjaśnienia też wymagają podane przeze mnie w przykładach objętości programów wyrażone w bitach, ale to już <br />trochę inna filozofia o czym napisze nowy temat ze szczegółowym wyjaśnieniem  co powinno rozwiać wątpliwości <br />i uzmysłowić początkującym dlaczego warto umieć myśleć strukturalnie i oszczędzać cenne zasoby naszych mikrokontrolerów. Bo jak się niebawem przekonacie - liczyliście nieprawidłowo zasoby pamięciowe.<br /><br />Jako zajawkę zadam wam pytanie ile pamięci SRAM ma popularna jak grzybica stóp ATmega8 ??<br />Wyjaśnienie w nowym temacie już niebawem.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=58">SunRiver</a> — 24 sty 2012, o 13:04</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[kierlan]]></name></author>
<updated>2012-01-23T22:39:41+01:00</updated>
<published>2012-01-23T22:39:41+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=161&amp;p=1401#p1401</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=161&amp;p=1401#p1401"/>
<title type="html"><![CDATA[Re: SunDuino-NelDuino  --&gt; K2000 -- nie znoszę delay..]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=161&amp;p=1401#p1401"><![CDATA[
<div class="quotetitle">mirekk36 napisał(a):</div><div class="quotecontent"><br />No właśnie <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> tylko ten pierwszy rzut oka, gdy zniechęca początkujących<br /></div><br /><br />dokładnie potrafi zniechęcić i tu jest problem.. temu dając przykład wole użyć nawet delay by taka osoba zrozumiała i nie było to dla niej &quot;czarną magią&quot; ale z czasem tak jak na tym o to forum pokazać lepsze rozwiązanie bez delay <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=84">kierlan</a> — 23 sty 2012, o 22:39</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2012-01-23T22:16:32+01:00</updated>
<published>2012-01-23T22:16:32+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=161&amp;p=1400#p1400</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=161&amp;p=1400#p1400"/>
<title type="html"><![CDATA[Re: SunDuino-NelDuino  --&gt; K2000 -- nie znoszę delay..]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=161&amp;p=1400#p1400"><![CDATA[
<div class="quotetitle">kierlan napisał(a):</div><div class="quotecontent"><br />zgodzę się w 100% chodziło mi o czytelność na 1 rzut oka, ...<br /></div><br /><br />No właśnie <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> tylko ten pierwszy rzut oka, gdy zniechęca początkujących - to nawet nie zdają sobie sprawy ile to kosztuje. Bo przecież ile można zrobić programując liniowo - używając Delayów - a ILE można zrobić w TAKI sposób? - oto jest pytanie <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> - to prawie jak &quot;Być albo nie być&quot; <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=54">mirekk36</a> — 23 sty 2012, o 22:16</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[kierlan]]></name></author>
<updated>2012-01-23T21:50:32+01:00</updated>
<published>2012-01-23T21:50:32+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=161&amp;p=1399#p1399</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=161&amp;p=1399#p1399"/>
<title type="html"><![CDATA[Re: SunDuino-NelDuino  --&gt; K2000 -- nie znoszę delay..]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=161&amp;p=1399#p1399"><![CDATA[
zgodzę się w 100% chodziło mi o czytelność na 1 rzut oka, z delayami wiadomo od razu o co chodzi i jest bardziej przejrzysty (na mój gust oczywiście), ale oczywiście lepsiejsze jest rozwiązanie kolegi sunrivera rzecz wiadoma  :]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=84">kierlan</a> — 23 sty 2012, o 21:50</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2012-01-23T21:28:52+01:00</updated>
<published>2012-01-23T21:28:52+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=161&amp;p=1398#p1398</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=161&amp;p=1398#p1398"/>
<title type="html"><![CDATA[Re: SunDuino-NelDuino  --&gt; K2000 -- nie znoszę delay..]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=161&amp;p=1398#p1398"><![CDATA[
<div class="quotetitle">kierlan napisał(a):</div><div class="quotecontent"><br />.... , ale czy kod czytelniejszy nie powiedział bym <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /></div><br /><br />Bo z tą czytelnością to jest troszkę tak jak z nauką języka obcego. Na początku gdy nie znasz hebrajskiego to patrzysz na to co jest napisane jak na węzełki, ptaszki krzaczki. Gdy się troszkę go nauczysz, to coś rozumiesz - ala nadal mało czytelne. A gdy już zaczynasz tym językiem nieźle władać - to okazuje się, że jest czytelny jak nie wiadomo co <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br />I taka sama analogia jest hmmm tyle że w tym przypadku nie chodzi o sam język C czy C++ - bo załóżmy, że ten już znasz mniej więcej. I potrafisz za jego pomocą zrobić to i owo, wysterować jakieś piny, porty, moduły sprzętowe itd...<br /><br />Ale teraz chodzi o naukę kolejnej rzeczy - programowania i zmiany myślenia z liniowego na strukturalne (nie mylić ze strukturami w C) .... tu dokładnie chodzi o naukę i zrozumienie tego co to są tzw: &quot;timery programowe&quot;. A gdy już zaskoczysz - to zobaczysz, że obojętnie jak ktoś nie napisze kodu z zastosowaniem techniki timerów programowych - to będzie on zawsze w miarę dobrze czytelny - pomimo iż są setki sposobów na implementację takich mechanizmów.<br /><br />Tu w arduino kolega autor skorzystał z że tak powiem z wbudowanych (hmm ja to nazywam &quot;tyknięć systemowych&quot; albo z &quot;Heart beat&quot;) .... gdzieś pod spodem tyka sobie systemowy timer i zlicza milisekundy. Wystarczy zatem z niego skorzystać - i już masz coś na kształt &quot;timera programowego&quot;. Ale to w arduino - i trzeba się zapoznać z funkcją millis() .... wtedy będzie wiadomo o co chodzi. Natomiast ja w swojej książce, ponieważ piszę o czystym C .... pokazuję jak we własnym zakresie robić te &quot;tyknięcia systemowe&quot; (Heart beat) .... to w sumie proste - wystarczy jeden timer sprzętowy, który na dodatek może jeszcze pełnić kilka innych funkcji.<br /><br />Reasumując - kolega SunRiver dał bardzo dobrą podpowiedź jak prosto znowu można to realizować w środowisku arduino. Bo tu nie język C++ ale samo środowisko i biblioteki dają taką możliwość.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 23 sty 2012, o 21:28</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[kierlan]]></name></author>
<updated>2012-01-23T21:06:59+01:00</updated>
<published>2012-01-23T21:06:59+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=161&amp;p=1397#p1397</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=161&amp;p=1397#p1397"/>
<title type="html"><![CDATA[Re: SunDuino-NelDuino  --&gt; K2000 -- nie znoszę delay..]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=161&amp;p=1397#p1397"><![CDATA[
Nio dobrze fakt delay jest zasobo żerny, ma jeszcze inne wyżej nie wymienione wady , ale czy kod czytelniejszy nie powiedział bym <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=84">kierlan</a> — 23 sty 2012, o 21:06</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[SunRiver]]></name></author>
<updated>2012-01-23T18:05:08+01:00</updated>
<published>2012-01-23T18:05:08+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=161&amp;p=1395#p1395</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=161&amp;p=1395#p1395"/>
<title type="html"><![CDATA[SunDuino-NelDuino  --&gt; K2000 -- nie znoszę delay..]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=161&amp;p=1395#p1395"><![CDATA[
Jak wiadomo instrukcja &quot;delay&quot; we wszystkich formach i ustrojach jest uwielbiana przez młodych<br />programistów fakt ma jedna zaletę i tylko jedną:<br /><br />-- jest prosta w użyciu,<br /><br />poza tym ma same wady z ważniejszych :<br /><br />-- wstrzymuje pracę procesora na określony parametrem czas<br />-- jest zasobożerna i zabiera sporo cennych zasobów<br /><br />Ale czy można w takim razie jej nie używać ??<br /><br />Niekoniecznie chodzi mi o jej całkowite nieużywanie, ale jeśli to możliwe używać z głową , a nie <br />z uporem maniaka delay-ować jak się da i co się da. W celu pokazania możliwości optymalizacji<br />kodu oraz nienadużywania instrukcji delay  posłużę się banalnym przykładem programu, który<br />tworzy na 4rech diodach led  prosty efekt K2000. Do pracy.<br /><br />Przyda nam się jakaś płytka xDuino  oraz 4 diody led dowolne i 4 rezystory:<br />schemat połączeń jest banalny i prezentuje się poniżej:<br /><br /><a href="http://forum.atnel.pl/_obrazki/o/58_626b1b3992a5030291dc6a03b0a8b648.png"  class="postlink"><img src="http://forum.atnel.pl/_obrazki/o/thumb/58_626b1b3992a5030291dc6a03b0a8b648.png" alt="Obrazek" /></a><br /><br />Jak widać totalny banał <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br />No to piszemy kod.<br /><br />Wersja 1. <br /><br />[syntax=cpp]<br />void setup()<br />{<br />pinMode(0,OUTPUT);<br />pinMode(1,OUTPUT);<br />pinMode(2,OUTPUT);<br />pinMode(3,OUTPUT);<br />}<br /> <br />void loop()<br />{<br />digitalWrite(0,HIGH);<br />delay(250);<br />digitalWrite(0,LOW);<br />digitalWrite(1,HIGH);<br />delay(250);<br />digitalWrite(1,LOW);<br />digitalWrite(2,HIGH);<br />delay(250);<br />digitalWrite(2,LOW);<br />digitalWrite(3,HIGH);<br />delay(250);<br />digitalWrite(3,LOW);<br />}<br />[/syntax]<br /><br />Tak jak widać jest to jedynie słuszna droga do uzyskania tego banalnego i jakże <br />skomplikowanego efektu. Ale z taką ilością waszej ulubionej instrukcji dzieją się 3 rzeczy:<br /><br />1. Przez lwią część czasu procesor wymięka z nudy totalnie nic nie robiąc. <br />2. W czasie nic nie robienia i tak nie może nic robić poza nic nie robieniem.<br />3. Program trochę się robi opasły  i jak to możliwe ze te kilka linijek kodu może zająć całe 1480 bitów <br /><br />W przypadku tak prostego programu nie musimy się tym przejmować , ale kiedy nasz program będzie<br />zawierał w kodzie kilkaset instrukcji delay ?? Nasze procesorki potrafią wiele ale posiadają ograniczone <br />jednak zasoby --&gt; to nie windows  gdzie prosta aplikacja waży kilka megabajtów tu trzeba szybko się nauczyć w locie optymalizować kod i unikać zasobożernych instrukcji.<br /><br />W przypadku języka C/C++ można naprawdę wiele zdziałać pisząc program w odpowiedni sposób<br />starając się używać jak najmniej niepotrzebnych opasłych bibliotek i pisząc własne funkcje i procedury,<br />i warto z tego korzystać naprawdę.<br />Teraz napiszemy ten sam program, ale wycinając do minimum użycie instrukcji delay.<br /><br />Wersja druga --&gt; pętlimy<br /><br />[syntax=cpp]<br />int pin;<br /> <br />void setup()<br />{<br />for (pin=0;pin&lt;4;pin++) pinMode(pin,OUTPUT);                   <br />}<br /> <br />void loop()<br />{<br />for (pin=0;pin&lt;4;pin++)<br />{<br />if (pin==0) digitalWrite(3,LOW);<br />else digitalWrite(pin-1,LOW);<br />digitalWrite(pin,HIGH);<br />delay(250);<br />}<br />[/syntax]<br /><br />Popatrzcie program działa dokładnie tak samo jak wersja poprzednia ale użyłem tylko 1 raz instrukcji<br />delay, a cała reszta została uproszczona poprzez zastosowanie pętli FOR i warunków IF ELSE<br />Program jest czytelniejszy krótszy, a po kompilacji zaoszczędziliśmy ponad 400bitów pamięci.<br /><br />Jak wielu z was zauważy -- przy tak prostym programie jakie ma to znaczenie 400bitów w tę czy w druga, skoro np w/w programy pracowały na ATMedze328 która ma ponad 32000bitów pamieci.<br /><br />Tak tu akurat niema to znaczenia ale warto zobrazować ten problem , bo nadużywanie lub co gorsza <br />nie umiejętne korzystanie z instrukcji delay, to oznaka niechlujności w pisanych programach i jednocześnie co chyba gorsze w większych projektach będzie owocowało brakiem czytelności <br />programu i nieprawidłowym jego działaniem. Dla lepszego zobrazowania problemu przedstawię kolejny <br />prosty przykład mianowicie mikrokontrolerowe HELLO WORLD czyli migaczek 1 diodowy<br /><br />1. Wersja ---&gt; Typisz DELAY <br /><br />[syntax=cpp]<br /> void setup() {                <br />  pinMode(13, OUTPUT);     <br />}<br /><br />void loop() {<br />  digitalWrite(13, HIGH);  <br />  delay(1000);              <br />  digitalWrite(13, LOW);    <br />  delay(1000);              <br />}<br /><br />[/syntax]<br /><br />Jak widać prosty program powodujący miganie diody na pinie D13  co 1 sek.<br />Waga: <span style="color: #FF4040">1018bitów</span> <br /><br />2 Wersja --&gt; No DELAY<br /><br />[syntax=cpp]<br />const int ledPin =  13;     <br />int ledState = LOW;          <br />long previousMillis = 0;        <br />long interval = 1000;           <br /><br />void setup() {<br />  pinMode(ledPin, OUTPUT);      <br />}<br /><br />void loop()<br />{<br />  unsigned long currentMillis = millis();<br /> <br />  if(currentMillis - previousMillis &gt; interval) <br />{<br />    previousMillis = currentMillis;   <br />    if (ledState == LOW)<br />      ledState = HIGH;<br />    else<br />      ledState = LOW;<br />      digitalWrite(ledPin, ledState);<br />  }<br />}<br /><br />[/syntax]<br /><br />Program robi to samo - niema ani jednego delaya jak widać <br />Waga: 398bitów<br /><br />Teraz przyjaciele sami pomyślcie czy warto pomyśleć trochę inaczej.<br />Oczywiście nie mówię że używanie delay jest złe chciałem tylko pokazać inne możliwości<br />uzyskania tego samego efektu i zmniejszenia zapotrzebowania na zasoby w programie.<br /><br />Wielu refleksji i przemyśleń....<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=58">SunRiver</a> — 23 sty 2012, o 18:05</p><hr />
]]></content>
</entry>
</feed>