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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2019-06-05T17:40:36+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=22308&amp;mode</id>
<entry>
<author><name><![CDATA[andrews]]></name></author>
<updated>2019-06-05T17:40:36+01:00</updated>
<published>2019-06-05T17:40:36+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=22308&amp;p=219536#p219536</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=22308&amp;p=219536#p219536"/>
<title type="html"><![CDATA[Re: Błędnie działająca pętla for]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=22308&amp;p=219536#p219536"><![CDATA[
Ostatnio nawał pracy, więc nie miałem czasu odpowiedzieć, ale chyba jeszcze coś bym musiał wyjaśnić, pomimo tego, że autor wątku już zastosował się do mojej porady.<br /><div class="quotetitle">Adam12 napisał(a):</div><div class="quotecontent"><br /><div class="quotetitle">andrews napisał(a):</div><div class="quotecontent">Ja bym zaczął od przeniesienia definicji funkcji rgb(), kolor_plus() i kolor_minus() poza funkcję main().<br />Wewnątrz funkcji main() powinny być tylko wywołania tych funkcji.<br /></div><br />Też bym od tego zaczął, chociaż o dziwo to działa. Ale umieszczanie funkcji w ciele innej funkcji nie jest chyba zgodne ze standardem C ?</div><br />Ja nie napisałem, że to nie będzie działać, ani że to jest przyczyna problemów. To, że działa, w sumie też wcale nie jest dziwne. GCC akurat udostępnia taką funkcjonalność (i może jeszcze inne kompilatory, ale raczej nie wszystkie), jednak jest to rozszerzenie, bo standard C nie dopuszcza takiej sytuacji.<br /><br />Jeśli już zagnieżdżanie funkcji jest wspierane przez kompilator, funkcje zdefiniowane wewnątrz innej funkcji będą miały zasięg lokalny, czyli będą mogły być tylko wewnątrz tej funkcji wywołane. Gdyby została napisana dodatkowa funkcja, poza funkcją <strong><em>main()</em></strong>, która chciałaby z tych funkcji korzystać, to kompilacja zakończy się błędem <strong><em>undefined reference</em></strong>, nawet jeśli będzie wywołana z funkcji <strong><em>main()</em></strong>.<br />Gdybyśmy przykładowo stworzyli poza funkcją <strong><em>main()</em></strong> taką funkcję[syntax=c]void set_color(uint8_t red, uint8_t green, uint8_t blue) {<br />    rgb(red, green, blue);<br />}[/syntax]<br />i próbowali ją wywołać z funkcji <strong><em>main()</em></strong>, to podczas kompilacji otrzymamy błąd <strong><em>undefined reference to rgb</em></strong>.<br /><br />Stosowanie zagnieżdżania jest więc moim zdaniem uzasadnione tylko wtedy, kiedy chcemy &quot;ukryć&quot; jakąś funkcję i ograniczyć jej używanie tylko wewnątrz innej funkcji, ale taki sam efekt można uzyskać np. poprzez stosowanie budowy modułowej programu i definiowaniu funkcji jako <strong><em>static</em></strong>, co jest (IMHO) bardziej eleganckim rozwiązaniem i w dodatku zgodnym ze standardem.<br /><br />W tym przypadku zagnieżdżanie jest moim zdaniem nieuzasadnione i nie przynosi żadnej korzyści, za to zmniejsza czytelność kodu oraz utrudnia analizę. Poza tym kompilator i tak najprawdopodobniej przekształci to na funkcje <strong><em>inline</em></strong>, czyli umieści kod tych funkcji w miejscu wywołania, więc równie dobrze możemy to zrobić sami. Dlatego zasygnalizowałem, że dobrze byłoby zdefiniować funkcje w standardowy sposób.<br /><br />Ogólnie osobiście nie polecam takiego stylu pisania programu, nawet jeśli &quot;o dziwo działa&quot; <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" />, szczególnie, jeśli ktoś chce zająć się programowaniem bardziej &quot;na poważnie&quot;.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=14165">andrews</a> — 5 cze 2019, o 17:40</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[r88]]></name></author>
<updated>2019-06-05T11:08:28+01:00</updated>
<published>2019-06-05T11:08:28+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=22308&amp;p=219533#p219533</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=22308&amp;p=219533#p219533"/>
<title type="html"><![CDATA[Re: Błędnie działająca pętla for]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=22308&amp;p=219533#p219533"><![CDATA[
<div class="quotetitle"><b>Quote:</b></div><div class="quotecontent"><br />Zmieniaj jasność w większym zakresie np. od 1 do 100 i zmniejsz wtedy czas na 7ms. Po prostu w takim zakresie jak na początku nie widać różnicy w jasności świecenia diody.<br /></div><br /><br />Masz racje teraz działa idealnie jak zwiększyłem przedział, wcześniej mogła być mała rozpiętość ,bo malało wykładniczo.Wielkie dzieki Adam12 i innym za rady. Problem rozwiązany <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=20614">r88</a> — 5 cze 2019, o 11:08</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Adam12]]></name></author>
<updated>2019-06-04T23:09:33+01:00</updated>
<published>2019-06-04T23:09:33+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=22308&amp;p=219528#p219528</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=22308&amp;p=219528#p219528"/>
<title type="html"><![CDATA[Re: Błędnie działająca pętla for]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=22308&amp;p=219528#p219528"><![CDATA[
<div class="quotetitle">r88 napisał(a):</div><div class="quotecontent"><br />teraz dioda świeci się jednostajnie z maksymalna jasnością i nic więcej.<br /></div><br />Zmieniaj jasność w większym zakresie np. od 1 do 100 i zmniejsz wtedy czas na 7ms. Po prostu w takim zakresie jak na początku nie widać różnicy w jasności świecenia diody. Poczytaj sobie o korekcji gamma: <a href="http://mirekk36.blogspot.com/2013/09/gamma-correction-nowe-narzedzie-w.html"  class="postlink">http://mirekk36.blogspot.com/2013/09/gamma-correction-nowe-narzedzie-w.html</a><br /><div class="quotetitle">mirekk36 napisał(a):</div><div class="quotecontent"><br />Polecam ci próbę zrozumienia co oznacza termin &quot;pisanie programów/funkcji NIEBLOKUJĄCYCH&quot; ... bo teraz lecisz po równi pochyłej i z yymi delajami - szczególnie - nie znajdziesz rozwiązania. <br /><br />Myślę że warto zacząć od Bluebooka: <!-- m --><a class="postlink" href="https://atnel.pl/mikrokontrolery-avr-jezyk-c.html" >https://atnel.pl/mikrokontrolery-avr-jezyk-c.html</a><!-- m --><br /></div><br />Mirek, ale w tym wypadku te delaye i tak nie mają znaczenia, nic nie blokują. PWM i tak działa w przerwaniu od licznika. A kolega uczy się właśnie z Bluebooka i na ATB. Pisał o tym w pierwszym poście. <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=16417">Adam12</a> — 4 cze 2019, o 23:09</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2019-06-04T21:18:57+01:00</updated>
<published>2019-06-04T21:18:57+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=22308&amp;p=219527#p219527</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=22308&amp;p=219527#p219527"/>
<title type="html"><![CDATA[Re: Błędnie działająca pętla for]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=22308&amp;p=219527#p219527"><![CDATA[
<div class="quotetitle">r88 napisał(a):</div><div class="quotecontent"><br />jednak po wklejeniu twojego kodu teraz dioda świeci się jednostajnie z maksymalna jasnością i nic więcej.<br /></div><br />Polecam ci próbę zrozumienia co oznacza termin &quot;pisanie programów/funkcji NIEBLOKUJĄCYCH&quot; ... bo teraz lecisz po równi pochyłej i z yymi delajami - szczególnie - nie znajdziesz rozwiązania. <br /><br />Myślę że warto zacząć od Bluebooka: <!-- m --><a class="postlink" href="https://atnel.pl/mikrokontrolery-avr-jezyk-c.html" >https://atnel.pl/mikrokontrolery-avr-jezyk-c.html</a><!-- m --><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 4 cze 2019, o 21:18</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[r88]]></name></author>
<updated>2019-06-04T21:05:31+01:00</updated>
<published>2019-06-04T21:05:31+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=22308&amp;p=219526#p219526</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=22308&amp;p=219526#p219526"/>
<title type="html"><![CDATA[Re: Błędnie działająca pętla for]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=22308&amp;p=219526#p219526"><![CDATA[
Dzięki Adam12,wyjaśniłeś mi przebieg pętli, jednak po wklejeniu twojego kodu teraz dioda świeci się jednostajnie z maksymalna jasnością i nic więcej.<br />Uwzględniłem wszystkie wasze uwagi i teraz mój kod w całości wygląda tak:(oczywiście 0 błędów i warningów)<br /><br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br /><br />// Atmega 32<br />volatile uint8_t r, g, b ;<br />uint8_t jasnosc;<br />#define czas 75<br /><br />void rgb (uint8_t red , uint8_t green , uint8_t blue){<br />r=red;<br />g=green;<br />b=blue;<br />}<br />void kolor_minus (void){<br />uint8_t r1=r, g1=g, b1=b;<br />                  for (jasnosc=100 ; jasnosc&gt;=80 ; jasnosc--){<br />                      rgb ((r1*jasnosc)/100 , (g1*jasnosc)/100 , (b1*jasnosc)/100);<br />                      _delay_ms(czas);<br />                  }<br />                }<br /><br />void kolor_plus (void){<br />uint8_t r1=r, g1=g, b1=b;<br />                  for (jasnosc=80 ; jasnosc&lt;100 ; jasnosc++){<br />                      rgb ((r1*jasnosc)/100 , (g1*jasnosc)/100 , (b1*jasnosc)/100);<br />                      _delay_ms(czas);<br />                  }<br />                }<br /><br />int main (void){<br /><br />//Dla RGB ze wspolna anoda<br />DDRD |= (1&lt;&lt;PD7)|(1&lt;&lt;PD6)|(1&lt;&lt;PD2);<br />PORTD |= (1&lt;&lt;PD7)|(1&lt;&lt;PD6)|(1&lt;&lt;PD2);//wyłączenie diody ze wspólną anodą<br /><br />// ustawienia TIMER2 w tryb CTC<br />TCCR2 |= (1&lt;&lt;WGM21);// tryb  CTC<br />TCCR2 |= (1&lt;&lt;CS20);// preskaler = 1<br />OCR2 = 199;// dodatkowy podział częsttotliwości przez 200<br />TIMSK |= (1&lt;&lt;OCIE2);// zezwolenie na przerwanie CompareMatch<br /><br />sei();// odblokowanie globalne przerwań<br /><br />while(1){<br />//seledynowy<br />rgb (172,225,175);  //kolor bazowy 100%<br />kolor_minus();      //koniec 80%<br />_delay_ms(500);<br /><br />rgb (172,225,175);  //kolor bazowy 100%<br />kolor_plus();       //start od 80%<br />_delay_ms(500);<br />}<br />}<br /><br />ISR( TIMER2_COMP_vect )<br />{<br />static uint8_t cnt; // definicja naszego licznika PWM<br /><br />// bezpośrednie sterowanie wyjściami kanałów PWM<br />if(cnt&gt;=r) PORTD |= (1&lt;&lt;PD7); else PORTD &amp;= ~(1&lt;&lt;PD7);<br />if(cnt&gt;=g) PORTD |= (1&lt;&lt;PD6); else PORTD &amp;= ~(1&lt;&lt;PD6);<br />if(cnt&gt;=b) PORTD |= (1&lt;&lt;PD2); else PORTD &amp;= ~(1&lt;&lt;PD2);<br /><br />cnt++;// zwiększanie licznika o 1<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=20614">r88</a> — 4 cze 2019, o 21:05</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Adam12]]></name></author>
<updated>2019-06-04T20:18:45+01:00</updated>
<published>2019-06-04T20:18:45+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=22308&amp;p=219524#p219524</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=22308&amp;p=219524#p219524"/>
<title type="html"><![CDATA[Re: Błędnie działająca pętla for]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=22308&amp;p=219524#p219524"><![CDATA[
Tak na szybko napisałem i działało:<br />[syntax=c]void kolor_minus (void){<br />                  uint8_t r1=r, g1=g, b1=b;<br />                  for (jasnosc=100 ; jasnosc&gt;=80 ; jasnosc--){<br />                      rgb ((r1*jasnosc)/100 , (g1*jasnosc)/100 , (b1*jasnosc)/100);<br />                      _delay_ms(czas);<br />                  }<br />                }<br /><br />                void kolor_plus (void){<br />                  uint8_t r1=r, g1=g, b1=b;<br />                  for (jasnosc=80 ; jasnosc&lt;100 ; jasnosc++){<br />                      rgb ((r1*jasnosc)/100 , (g1*jasnosc)/100 , (b1*jasnosc)/100);<br />                      _delay_ms(czas);<br />                  }<br />                }<br /><br />        while(1){<br />//seledynowy<br /><br />            rgb (172,225,175);//kolor bazowy 100%<br />            kolor_minus();//koniec 80%<br />            _delay_ms(500);<br /><br />            rgb (172,225,175);//kolor bazowy 100%<br />            kolor_plus();//start od 80%<br />            _delay_ms(500);<br /><br />        }[/syntax]<br /><br />Reszta kodu jak u Ciebie.<br /><br />Co do zmniejszania wartości rgb w pętli kolor plus to możesz sobie rozpisać po kolei obiegi pętli:<br />1. jasnosc=80, r=172  -&gt; r = r*jasnosc/100 = 172 * 80/100 = 137;<br />2. jasnosc=81, r=137  -&gt; r = r*jasnosc/100 = 137 * 81/100 = 110;<br />3. jasnosc=82, r=110  -&gt; r = r*jasnosc/100 = 110 * 82/100 = 90;<br />itd. <br /><br />Jak widzisz mimo, że jasnosc wzrasta to r gwałtownie maleje bo cały czas jest podstawiana jej nowa mniejsza wartość.<br /><br /><div class="quotetitle">andrews napisał(a):</div><div class="quotecontent"><br />Ja bym zaczął od przeniesienia definicji funkcji rgb(), kolor_plus() i kolor_minus() poza funkcję main().<br />Wewnątrz funkcji main() powinny być tylko wywołania tych funkcji.<br /></div><br /><br />Też bym od tego zaczął, chociaż o dziwo to działa. Ale umieszczanie funkcji w ciele innej funkcji nie jest chyba zgodne ze standardem C ?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=16417">Adam12</a> — 4 cze 2019, o 20:18</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[andrews]]></name></author>
<updated>2019-06-04T19:01:43+01:00</updated>
<published>2019-06-04T19:01:43+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=22308&amp;p=219523#p219523</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=22308&amp;p=219523#p219523"/>
<title type="html"><![CDATA[Re: Błędnie działająca pętla for]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=22308&amp;p=219523#p219523"><![CDATA[
Ja bym zaczął od przeniesienia definicji funkcji rgb(), kolor_plus() i kolor_minus() poza funkcję main().<br />Wewnątrz funkcji main() powinny być tylko wywołania tych funkcji.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=14165">andrews</a> — 4 cze 2019, o 19:01</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[r88]]></name></author>
<updated>2019-06-04T16:51:50+01:00</updated>
<published>2019-06-04T16:51:50+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=22308&amp;p=219519#p219519</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=22308&amp;p=219519#p219519"/>
<title type="html"><![CDATA[Re: Błędnie działająca pętla for]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=22308&amp;p=219519#p219519"><![CDATA[
<div class="quotetitle">Adam12 napisał(a):</div><div class="quotecontent"><br />Pętle jak to zwykle bywa w języku C, działają jak najbardziej poprawnie <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> Błędnie podajesz wartości do tych pętli. Do funkcji rgb(...)  wpisujesz wartości r,g,b które są następnie w każdym obiegu pętli zmniejszane przez pomnożenie przez jasność i znowu podstawiane czyli zmniejszają się w postępie geometrycznym. W pętli kolor_plus, wartości r,g,b są także z każdym obiegiem pętli zmniejszane przez kolejne podstawienia tylko wolniej.<br /><br />Powinieneś sobie zapamiętywać początkowe wartości r,g,b przed wejściem do pętli i takie podstawiać do obliczania jasności. Poza tym przed wejściem w kolor_plus musisz podstawić wartości początkowe r,g,b. Inaczej po wejściu do pętli jasność najpierw zmniejsza się do 80% i dopiero od tej wartości rośnie w górę.<br /></div><br /><br /><br />Czy mógłbym prosić z przykładem na moim kodzie? Rozumiem co trzeba zrobić,ale nie mam wyobraźni jak i po za tym wciąż nie rozumiem jak pętla kolor_plus wciąż zmniejsza wartości r,g,b.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=20614">r88</a> — 4 cze 2019, o 16:51</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Adam12]]></name></author>
<updated>2019-06-04T15:53:40+01:00</updated>
<published>2019-06-04T15:53:40+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=22308&amp;p=219517#p219517</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=22308&amp;p=219517#p219517"/>
<title type="html"><![CDATA[Re: Błędnie działająca pętla for]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=22308&amp;p=219517#p219517"><![CDATA[
Pętle jak to zwykle bywa w języku C, działają jak najbardziej poprawnie <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> Błędnie podajesz wartości do tych pętli. Do funkcji rgb(...)  wpisujesz wartości r,g,b które są następnie w każdym obiegu pętli zmniejszane przez pomnożenie przez jasność i znowu podstawiane czyli zmniejszają się w postępie geometrycznym. W pętli kolor_plus, wartości r,g,b są także z każdym obiegiem pętli zmniejszane przez kolejne podstawienia tylko wolniej.<br /><br />Powinieneś sobie zapamiętywać początkowe wartości r,g,b przed wejściem do pętli i takie podstawiać do obliczania jasności. Poza tym przed wejściem w kolor_plus musisz podstawić wartości początkowe r,g,b. Inaczej po wejściu do pętli jasność najpierw zmniejsza się do 80% i dopiero od tej wartości rośnie w górę.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=16417">Adam12</a> — 4 cze 2019, o 15:53</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[r88]]></name></author>
<updated>2019-06-04T14:24:04+01:00</updated>
<published>2019-06-04T14:24:04+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=22308&amp;p=219516#p219516</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=22308&amp;p=219516#p219516"/>
<title type="html"><![CDATA[Re: Błędnie działająca pętla for]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=22308&amp;p=219516#p219516"><![CDATA[
Biorąc pod uwagę te dwie pętle następujące po sobie z pół sekundową przerwą, dziwne jest to,że jedna realizując dekrementację a druga inkrementację, dioda najpierw zpełnej jasności ściemnia się w pętli kolor_minus a potem od miejsca w którym się poprzednia skończyła ściemnia ponownie tamta wartość do zera w pętli kolor_plus.Nie jestem w stanie pojąć tego,bo chyba podstawiając &quot;jasnosc&quot; do wzorow rgb wartosći w drugiej pętli powinny wzrastać<br />[syntax=c]void kolor_minus (void){<br />for (jasnosc=100 ; jasnosc&gt;80 ; jasnosc--){<br />rgb ((r*jasnosc)/100 , (g*jasnosc)/100 , (b*jasnosc)/100);<br />_delay_ms(czas);<br />}<br />}<br /><br />void kolor_plus (void){<br />for (jasnosc=80 ; jasnosc&lt;100 ; jasnosc++){<br />rgb ((r*jasnosc)/100 , (g*jasnosc)/100 , (b*jasnosc)/100);<br />_delay_ms(czas);<br />}<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=20614">r88</a> — 4 cze 2019, o 14:24</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Tom92]]></name></author>
<updated>2019-06-04T13:48:57+01:00</updated>
<published>2019-06-04T13:48:57+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=22308&amp;p=219515#p219515</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=22308&amp;p=219515#p219515"/>
<title type="html"><![CDATA[Re: Błędnie działająca pętla for]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=22308&amp;p=219515#p219515"><![CDATA[
Przy starcie masz włączoną diodę RGB.<br /><br />Na początek zmień to:<br /> [syntax=c]//Dla RGB ze wspolna anoda<br />        DDRD |= 0xff;<br />        PORTD &amp;= ~0xff;[/syntax]<br /><br />na (lepiej się patrzy):<br /> [syntax=c]//Dla RGB ze wspolna anoda<br />        DDRD |= (1&lt;&lt;PD7)|(1&lt;&lt;PD6)|(1&lt;&lt;PD2);<br />        PORTD |= (1&lt;&lt;PD7)|(1&lt;&lt;PD6)|(1&lt;&lt;PD2);  // wyłączenie diody ze wspólną anodą[/syntax]<br /><br />Kolejna rzecz to taka, że w pętli while ustawiasz kolor seledynowy i go ściemniasz, następnie znowu seledynowy i znowu ściemniasz itd. tak mi się wydaje, nie sprawdzałem kodu u siebie bo narazie nie mam jak. Wyrzuć z kodu #define F_CPU 8000000UL.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=11336">Tom92</a> — 4 cze 2019, o 13:48</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[r88]]></name></author>
<updated>2019-06-04T13:08:30+01:00</updated>
<published>2019-06-04T13:08:30+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=22308&amp;p=219514#p219514</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=22308&amp;p=219514#p219514"/>
<title type="html"><![CDATA[Błędnie działająca pętla for]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=22308&amp;p=219514#p219514"><![CDATA[
Witam<br />To mój pierwszy post i jeden z pierwszych programów napisanych w eclipse. Jest to program ,który ma dowolnie wybrany kolor RGB ściemniać a potem rozjaśniać i przechodzić do następnego koloru,jednak dla uproszczenia wkleje kod tylko dla jednego koloru.Zrealizowałem dwie pętle podobnie jak z przykładu bluebooka o sterowaniu pwm,z której to książki aktualnie się uczę.Od razu podkreślam,że korzystam z płytki atb rev 1.05 czyli produktu firmy Atnel,której to forum promuje <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" />  <br />Problem polega na tym,że obie te pętle chociaż jedna ma ściemniać a druga rozjaśniać obie ściemniają nieważne jak skonstruuje warunki pętli.<br />Jestem początkujący i może się to okazać banalnym błędem w kodzie,ale decyduje się tylko dlatego napisać ten post,że kod wydaje mi się jak najbardziej logicznym i takim,który powinien normalnie zadziałać.<br /><br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br /><br />// Atmega 32<br /># define F_CPU 8000000UL<br />volatile uint8_t r, g, b ;<br />uint8_t jasnosc;<br />#define czas 75<br /><br />int main (void){<br /><br />//Dla RGB ze wspolna anoda<br />DDRD |= 0xff;<br />PORTD &amp;= ~0xff;<br /><br />// ustawienia TIMER2 w tryb CTC<br />TCCR2 |= (1&lt;&lt;WGM21);// tryb  CTC<br />TCCR2 |= (1&lt;&lt;CS20);// preskaler = 1<br />OCR2 = 199;// dodatkowy podział częsttotliwości przez 200<br />TIMSK |= (1&lt;&lt;OCIE2);// zezwolenie na przerwanie CompareMatch<br /><br />sei();// odblokowanie globalne przerwań<br /><br />void rgb (uint8_t red , uint8_t green , uint8_t blue){<br />r=red;<br />g=green;<br />b=blue;<br />}<br /><br />void kolor_minus (void){<br />for (jasnosc=100 ; jasnosc&gt;80 ; jasnosc--){<br />rgb ((r*jasnosc)/100 , (g*jasnosc)/100 , (b*jasnosc)/100);<br />_delay_ms(czas);<br />}<br />}<br /><br />void kolor_plus (void){<br />for (jasnosc=80 ; jasnosc&lt;100 ; jasnosc++){<br />rgb ((r*jasnosc)/100 , (g*jasnosc)/100 , (b*jasnosc)/100);<br />_delay_ms(czas);<br />}<br />}<br /><br />while(1){<br />//seledynowy<br />rgb (172,225,175);<br />kolor_minus();<br />_delay_ms(500);<br />kolor_plus();<br />_delay_ms(500);<br />}<br />}<br /><br />ISR( TIMER2_COMP_vect )<br />{<br />static uint8_t cnt; // definicja naszego licznika PWM<br /><br />// bezpośrednie sterowanie wyjściami kanałów PWM<br />if(cnt&gt;=r) PORTD |= (1&lt;&lt;PD7); else PORTD &amp;= ~(1&lt;&lt;PD7);<br />if(cnt&gt;=g) PORTD |= (1&lt;&lt;PD6); else PORTD &amp;= ~(1&lt;&lt;PD6);<br />if(cnt&gt;=b) PORTD |= (1&lt;&lt;PD2); else PORTD &amp;= ~(1&lt;&lt;PD2);<br /><br />cnt++;// zwiększanie licznika o 1<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=20614">r88</a> — 4 cze 2019, o 13:08</p><hr />
]]></content>
</entry>
</feed>