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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2020-07-18T08:18:41+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=23253&amp;mode</id>
<entry>
<author><name><![CDATA[arturssp]]></name></author>
<updated>2020-07-18T08:18:41+01:00</updated>
<published>2020-07-18T08:18:41+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23253&amp;p=228345#p228345</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23253&amp;p=228345#p228345"/>
<title type="html"><![CDATA[Re: Dziwny sposób wykonywania się pętli while()]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23253&amp;p=228345#p228345"><![CDATA[
Wszystko się zgadza, przeoczyłem post Kolegi Adam12..<br />Dziękuję za odpowiedzi, wszystko jest już jasne <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=16778">arturssp</a> — 18 lip 2020, o 08:18</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2020-07-18T05:05:49+01:00</updated>
<published>2020-07-18T05:05:49+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23253&amp;p=228342#p228342</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23253&amp;p=228342#p228342"/>
<title type="html"><![CDATA[Re: Dziwny sposób wykonywania się pętli while()]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23253&amp;p=228342#p228342"><![CDATA[
Wyżej ci kolega Adam12 wyjaśnił - jak nie było volatile to kompilator uznał że w ogóle nie jest potrzebne całe wnętrze wahile bo po co ? skoro nic nie robi. Masz zawsze plik *.lss w folderze RELEASE po kompilacji, to wersja twojego programu w Asemblerze, wystarczy zajrzeć i przekonać się co i jak zoptymalizował kompilator i co zniknęło.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 18 lip 2020, o 05:05</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[arturssp]]></name></author>
<updated>2020-07-17T21:47:00+01:00</updated>
<published>2020-07-17T21:47:00+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23253&amp;p=228341#p228341</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23253&amp;p=228341#p228341"/>
<title type="html"><![CDATA[Re: Dziwny sposób wykonywania się pętli while()]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23253&amp;p=228341#p228341"><![CDATA[
Mirku! - Wszystko się zgadza, mam BB, GB.. chodzi o to, że nie pisałem nic od 2 lat (niestety praca, brak czasu itd.).. A jak się czegoś nie robi, to z głowy wylatuje i później taki niby błahy ale problem..<br />Dzięki za podpowiedź.<br />Jedynie interesuje mnie jedna rzecz - dlaczego dodanie jakiejś dowolnej instrukcji w pętli spowodowało, że działało? Chodzi o optymalizację kompilatora, coś nagle innego &quot;zobaczył&quot; ?<br /><br />W zasadzie zauważyłem, że nie jest potrzebne dawanie tego warunku if(ON_SIG) a za chwilę pętli while(ON_SIG)... wystarczy sama pętla, też działa poprawnie.<br />Ale może niech mnie ktoś poprawi jeśli się mylę ...<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=16778">arturssp</a> — 17 lip 2020, o 21:47</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2020-07-17T21:25:08+01:00</updated>
<published>2020-07-17T21:25:08+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23253&amp;p=228340#p228340</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23253&amp;p=228340#p228340"/>
<title type="html"><![CDATA[Re: Dziwny sposób wykonywania się pętli while()]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23253&amp;p=228340#p228340"><![CDATA[
<div class="quotetitle">arturssp napisał(a):</div><div class="quotecontent"><br />zadeklarowałem jako volatile i zaczęło działać poprawnie!<br /></div><br />W ikonkach widać że masz Bluebooka - sięgnij do niego i poczytaj o volatile, poza tym dodatkowo rozszerzenie tej wiedzy o szczegóły na blogu (gdzie akurat jest opisany nomen omen - praktycznie twój przypadek)<br /><br /><!-- m --><a class="postlink" href="https://mirekk36.blogspot.com/2011/08/test.html" >https://mirekk36.blogspot.com/2011/08/test.html</a><!-- m --><br /><br />i na przyszłość zapamiętaj to o czym mowa w BB n/t volatile <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> będzie mniej rwania włosów z głowy<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 17 lip 2020, o 21:25</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Adam12]]></name></author>
<updated>2020-07-17T21:15:49+01:00</updated>
<published>2020-07-17T21:15:49+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23253&amp;p=228339#p228339</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23253&amp;p=228339#p228339"/>
<title type="html"><![CDATA[Re: Dziwny sposób wykonywania się pętli while()]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23253&amp;p=228339#p228339"><![CDATA[
Kompilator optymalizuje instrukcje ze zwykłymi zmiennymi. Obstawiam, że jeśli zmienna &quot;tog_led&quot; ma na początku wartość zero i nie zmienia się w głównym programie to kompilator wyrzuca z kodu wszystkie instrukcje, które nie mają szansy się wykonać. W tym wypadku pewnie cały pokazany przez Ciebie kod zaczynający się od if (ON_SIG). Dodanie jakiejkolwiek instrukcji w pętli while wymusza jej bezwarunkowe wykonanie więc kompilator dołącza resztę instrukcji i zaczynają działać normalnie. Dlatego zmienne używane w przerwaniach powinny być deklarowane jako volatile, nie są one wtedy optymalizowane i pomijane w głównym programie.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=16417">Adam12</a> — 17 lip 2020, o 21:15</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[arturssp]]></name></author>
<updated>2020-07-17T20:43:24+01:00</updated>
<published>2020-07-17T20:43:24+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23253&amp;p=228337#p228337</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23253&amp;p=228337#p228337"/>
<title type="html"><![CDATA[Re: Dziwny sposób wykonywania się pętli while()]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23253&amp;p=228337#p228337"><![CDATA[
Nie, jako zwykła zmienna.<br />Ale dzięki wielkie za podpowiedź, zadeklarowałem jako volatile i zaczęło działać poprawnie! <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br />Pytanie tylko dlaczego wcześniej nie chciało - chodzi mi o przyczynę, i dlaczego dodanie jakiejkolwiek instrukcji do tej pętli spowodowało, że już działała dobrze?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=16778">arturssp</a> — 17 lip 2020, o 20:43</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Adam12]]></name></author>
<updated>2020-07-17T20:36:05+01:00</updated>
<published>2020-07-17T20:36:05+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23253&amp;p=228336#p228336</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23253&amp;p=228336#p228336"/>
<title type="html"><![CDATA[Re: Dziwny sposób wykonywania się pętli while()]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23253&amp;p=228336#p228336"><![CDATA[
zmienna &quot;tog_led&quot; jest zdefiniowana jako volatile?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=16417">Adam12</a> — 17 lip 2020, o 20:36</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[arturssp]]></name></author>
<updated>2020-07-17T18:04:06+01:00</updated>
<published>2020-07-17T18:04:06+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23253&amp;p=228332#p228332</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23253&amp;p=228332#p228332"/>
<title type="html"><![CDATA[Dziwny sposób wykonywania się pętli while()]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23253&amp;p=228332#p228332"><![CDATA[
Witam,<br />Piszę prosty program który ma sterować elektrozaworem hydraulicznym. Dawno nie pisałem w C, więc wybaczcie może prosty temat...<br />Po włączeniu zasilania modułu, jeśli nawet sygnał sterujący jest podany to elektrozawór nie może się włączyć. (chodzi o to, gdyby ktoś zostawił przełącznik w pozycji załączony a maszynę wyłączył, to po ponownym uruchomieniu nie może się ten zawór otworzyć, tylko trzeba cofnąć przełącznik sterujący do pozycji wyłączony i załączyć ponownie). <br />Poniżej warunek który to sprawdza (gdy wraz z zasilaniem podany jest sygnał sterujący, ma sygnalizować to miganiem dwóch diod LED):<br />[syntax=c]if (ON_SIG){<br /><br />while(ON_SIG){<br /><br />if (tog_led)<br />{<br />wdt_reset();<br />TOG_LED_G;<br />TOG_LED_R;<br />tog_led = 0;<br />}<br />_delay_us(1);   &lt;&lt;&lt;&lt;&lt; Bez jakiejkolwiek instrukcji tutaj nie działa!<br />}<br />}[/syntax]<br />Jest on umieszczony zaraz na początku funkcji main, po inicjalizacji portów, przetwornika ADC, zmiennych itd. <br />Chodzi o to, że gdy nie dam tego _delay_us(1); lub jakiejkolwiek innej instrukcji to procek wchodzi w pętlę, ale nie wykonuje się instrukcja if, układ jest resetowany przez WDT, nawet jak ustawię WTD na 2s... Ale w pętlę wchodzi, ponieważ gdy zabiorę sygnał sterujący, to ładnie wychodzi z tego warunku i działa dalej normalnie. Sprawdziłem to wyłączając WDT - jest w pętli, tylko nie wykonuje instrukcji warunkowej. Zmienną &quot;tog_led&quot; ustawiam w przerwaniu od ADC w trybie FreeRun. Dlaczego musi być dosłownie &quot;cokolwiek&quot; dopisane w samej pętli żeby to działało?<br />Program pisany w AtmelStudio 6.<br /><br />Pozdrawiam<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=16778">arturssp</a> — 17 lip 2020, o 18:04</p><hr />
]]></content>
</entry>
</feed>