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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2016-05-21T19:37:29+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=58&amp;t=15426&amp;mode</id>
<entry>
<author><name><![CDATA[radex324]]></name></author>
<updated>2016-05-21T19:37:29+01:00</updated>
<published>2016-05-21T19:37:29+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=15426&amp;p=160981#p160981</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=15426&amp;p=160981#p160981"/>
<title type="html"><![CDATA[Re: Kilka pętli naraz]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=15426&amp;p=160981#p160981"><![CDATA[
Kolega anshar jak zwykle daje najlepsze rady z kodem i opisem łapatologicznym <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> Już się biore za analizę kodu.<br />Pozdrawiam.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=6007">radex324</a> — 21 maja 2016, o 19:37</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[anshar]]></name></author>
<updated>2016-05-21T14:33:23+01:00</updated>
<published>2016-05-21T14:33:23+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=15426&amp;p=160972#p160972</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=15426&amp;p=160972#p160972"/>
<title type="html"><![CDATA[Re: Kilka pętli naraz]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=15426&amp;p=160972#p160972"><![CDATA[
Proponowałbym Ci poczytać o timerach programowych.<br />Zobacz jak to można rozwiązać z wykorzystaniem timera Timer0 (zwróć uwagę, że nie wykorzystuję żadnych delay'ów) tylko dwa timery programowe:<br />[syntax=c]#include &lt;avr/io.h&gt;<br />//#include &lt;util/delay.h&gt;<br />#include &lt;avr/interrupt.h&gt;// dołączenie pl. nagłówkowego potrzebnego do obsł. przerwań<br /><br />#define KEY1 (1&lt;&lt;PD0)<br />#define KEY2 (1&lt;&lt;PD1)<br /><br />volatile uint16_t Timer1, Timer2;// timery programowe 100Hz<br /><br />uint8_t loop_flag;//flaga na potrzeby programu<br />uint16_t key_lock1, key_lock2;<br /><br />uint8_t tab&#91;&#93; = { 128, 64, 32, 16, 8, 4, 2, 1, 2, 4, 8, 16, 32, 64, 128 };<br /><br />int main( void ){<br /><br />DDRB |= 0xff;// cały port jako wyjścia<br />DDRC |= 0xff;// cały port jako wyjścia<br />PORTD |= KEY1 | KEY2;// pull up dla klawiszy<br /><br />// ustawienie TIMER0<br />TCCR0 |= (1&lt;&lt;WGM01);// tryb CTC<br />TCCR0 |= (1&lt;&lt;CS02)|(1&lt;&lt;CS00);// preskaler = 1024<br />OCR0 = (F_CPU / 1024UL / 100UL) - 1; // przerwanie porównania co 10ms (100Hz) np:OCR0 = 107; (dla F_CPU = 11 059 200 Hz)<br />TIMSK |= (1&lt;&lt;OCIE0);// zezwolenie na przerwanie CompareMatch<br /><br />sei();// zezwolenie na przerwania globalne<br /><br />while(1){<br /><br />// klawisz 1<br />if( !key_lock1 &amp;&amp; !(PIND &amp; KEY1 ) ) {<br />key_lock1 = 50000;<br /><br />if(0 == loop_flag) loop_flag = 1;// jeśli loop_flag=0 zmień na loop_flag=1<br />else loop_flag = 0;// jeśli loop_flag!=0 zmień na loop_flag=0<br />}<br />else if( key_lock1 &amp;&amp; (PIND &amp; KEY1) ) key_lock1++;<br /><br />// klawisz 2<br />if( !key_lock2 &amp;&amp; !(PIND &amp; KEY2 ) ) {<br />key_lock2 = 50000;<br /><br />if(0 == loop_flag) loop_flag = 2;// jeśli loop_flag=0 zmień na loop_flag=2<br />else loop_flag = 0;// jeśli loop_flag!=0 zmień na loop_flag=0<br />}<br />else if( key_lock2 &amp;&amp; (PIND &amp; KEY2) ) key_lock2++;<br /><br />// pętla służąca do zapalania/gaszenia diod na portach PORTB i PORTC w zależności od wartości w tablicy tab&#91;&#93;<br />if(!Timer1 &amp;&amp; !loop_flag)// gdy loop_flag=0 (!loop_flag to to samo co (0 == loop_flag)<br />{<br />static uint8_t index;<br />index++;<br />if (index &gt;= 32) index = 0;// jeśli index jest = 32 to go wyzeruj<br />if (index &lt; 16) PORTC = tab&#91;index % 16&#93;;// jeśli index jest mniejsze od 16 to zmieniaj stan na porcie PORTC<br />else PORTB = tab&#91;index % 16&#93;;// jeśli index jest większe od 16 to zmieniaj stan na porcie PORTB<br /><br />Timer1 = 30;// 30 * 10ms = 300ms<br />}<br /><br />// resultat wciśnięcia klawisza 1<br />if(!Timer2 &amp;&amp; (1 == loop_flag ) )// gdy loop_flag=1<br />{<br />PORTB ^= (1&lt;&lt;PB5);// zmiana stanu na PB5 co<br />Timer2 = 50;// 50 * 10ms = 500ms<br />}<br /><br />// resultat wciśnięcia klawisza 2<br />if(!Timer2 &amp;&amp; (2 == loop_flag ) )// gdy loop_flag=2<br />{<br />PORTB ^= (1&lt;&lt;PB6);// zmiana stanu na PB6 co<br />Timer2 = 50;// 50 * 10ms = 500ms<br />}<br />}<br />}<br /><br /><br /><br />// ===== PROCEDURA OBSŁUGI PRZERWANIA – COMPARE MATCH ======<br />ISR(TIMER0_COMP_vect)<br />{<br />static uint16_t n;<br /><br />n = Timer1;// 100Hz Timer1 (10ms)<br />if (n) Timer1 = --n;<br /><br />n = Timer2;// 100Hz Timer1 (10ms)<br />if (n) Timer2 = --n;<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=7157">anshar</a> — 21 maja 2016, o 14:33</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Daro69]]></name></author>
<updated>2016-05-21T14:30:55+01:00</updated>
<published>2016-05-21T14:30:55+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=15426&amp;p=160971#p160971</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=15426&amp;p=160971#p160971"/>
<title type="html"><![CDATA[Re: Kilka pętli naraz]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=15426&amp;p=160971#p160971"><![CDATA[
Witam,<br />Może od tego zacząć.<br /><br />W Twoim kodzie, używasz pętli for.<br />Blokuje ona wszystko dopóty dopóki zmienna &quot;i&quot;, nie przekroczy 16.<br />Tak więc 16 x 100ms=1,6 s.<br />Pomyśl nad  sposobem - albo wykorzystać funkcję nie blokującą, albo obsłużyć klawisze z nóżek z przerwaniem. <br />Do zwiększania zmiennej &quot;i&quot; możesz użyć timer np programowy, który będzie wystawiał co 100ms flagę.<br />Jezeli flaga, wykonaj coś i wyzeruj flagę.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=11549">Daro69</a> — 21 maja 2016, o 14:30</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[radex324]]></name></author>
<updated>2016-05-21T12:48:37+01:00</updated>
<published>2016-05-21T12:48:37+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=15426&amp;p=160970#p160970</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=15426&amp;p=160970#p160970"/>
<title type="html"><![CDATA[Re: Kilka pętli naraz]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=15426&amp;p=160970#p160970"><![CDATA[
Działa tylko raz i potem już nie reagują jak można to proszę bardziej zrozumiale pisać jeszcze nie rozumie wszystkiego.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=6007">radex324</a> — 21 maja 2016, o 12:48</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[atmel]]></name></author>
<updated>2016-05-21T12:27:15+01:00</updated>
<published>2016-05-21T12:27:15+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=15426&amp;p=160968#p160968</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=15426&amp;p=160968#p160968"/>
<title type="html"><![CDATA[Re: Kilka pętli naraz]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=15426&amp;p=160968#p160968"><![CDATA[
Najlepiej używać przerwań zewnętrznych i/lub timer'a, ale w sposób &quot;liniowy&quot; również jest to wykonalne.  <br /><br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;util/delay.h&gt;<br /> <br />#define KEY1 (1&lt;&lt;PD3)<br />#define KEY2 (1&lt;&lt;PD4)<br /> <br />uint8_t tab&#91;&#93; = { 128, 64, 32, 16, 8, 4, 2, 1, 2, 4, 8, 16, 32, 64, 128, 0 };<br /> <br />uint16_t KEY_LOCK;<br />uint16_t KEY_LOCK2;<br /> <br />int main( void )<br />{<br />DDRB |= 0xff;<br />DDRC |= 0xff;<br /> <br />PORTD |= KEY1 | KEY2;<br /> <br />uint8_t Index = 0, Delay = 0;<br /> <br />_delay_ms(10);//oczekwainie na stan wysoki<br />while(1) {<br /><br />if(!KEY_LOCK &amp;&amp; !(PIND &amp; KEY1)) {<br />KEY_LOCK = 50000;<br /> PORTB ^= (1&lt;&lt;PB5);<br />} else if (KEY_LOCK &amp;&amp; (PIND &amp; KEY1)) KEY_LOCK++;<br /> <br />if( !KEY_LOCK2 &amp;&amp; !(PIND &amp; KEY2)) {<br />KEY_LOCK2 = 50000;<br />PORTB ^= (1&lt;&lt;PB6);<br />} else if(KEY_LOCK2 &amp;&amp; (PIND &amp; KEY2)) KEY_LOCK2++;<br /> <br />if (Delay == 0) {<br />Delay = 10;<br />Index++;<br />if (Index &gt;= 32)<br />Index = 0;<br />if (Index &lt; 16)<br />PORTC = tab&#91;Index % 16&#93;;<br />else PORTB = tab&#91;Index % 16&#93;;<br />} else _delay_ms(10);  <br />Delay--;<br />}<br />}<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1183">atmel</a> — 21 maja 2016, o 12:27</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[radex324]]></name></author>
<updated>2016-05-21T11:44:57+01:00</updated>
<published>2016-05-21T11:44:57+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=15426&amp;p=160963#p160963</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=15426&amp;p=160963#p160963"/>
<title type="html"><![CDATA[Kilka pętli naraz]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=15426&amp;p=160963#p160963"><![CDATA[
Witam mam problem z kodem:[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;util/delay.h&gt;<br /><br />#define KEY1 (1&lt;&lt;PD3)<br />#define KEY2 (1&lt;&lt;PD4)<br /><br /><br />uint8_t tab&#91;&#93; = { 128, 64, 32, 16, 8, 4, 2, 1, 2, 4, 8, 16, 32, 64, 128, 0 };<br /><br /><br />uint16_t KEY_LOCK;<br />uint16_t KEY_LOCK2;<br /><br /><br /><br />int main( void ){<br /><br />        DDRB |= 0xff;<br />        DDRC |= 0xff;<br /><br />        PORTD |= KEY1 | KEY2;<br /><br />        uint8_t i;<br /><br />        _delay_ms(10);//oczekwainie na stan wysoki<br />        while(1){<br /><br />        if(!KEY_LOCK &amp;&amp; !(PIND &amp; KEY1)){<br />        KEY_LOCK = 50000;<br />        PORTB ^= (1&lt;&lt;PB5);<br />        } else if (KEY_LOCK &amp;&amp; (PIND &amp; KEY1)) KEY_LOCK++;<br /><br />        if( !KEY_LOCK2 &amp;&amp; !(PIND &amp; KEY2)){<br />        KEY_LOCK2 = 50000;<br />        PORTB ^= (1&lt;&lt;PB6);<br />        }<br />        else if(KEY_LOCK2 &amp;&amp; (PIND &amp; KEY2)) KEY_LOCK2++;<br /><br /><br />            for(i=0; i&lt;16; i++){<br /><br />                    PORTC = tab&#91; i &#93;;<br />                    _delay_ms(100);<br /><br />            }<br /><br /><br />            for(i=0; i&lt;16; i++){<br /><br />                    PORTB = tab&#91; i &#93;;<br />                    _delay_ms(100);<br /><br />                    <br />            }<br /><br /><br /><br /><br />        }<br /><br />}[/syntax] Mam tu klawisze i diody LED które migają ale gdy migają to blokują przyciski, wiem że chodzi o delay'e ale nie wiem jak to rozwiązać. Pomoże ktoś?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=6007">radex324</a> — 21 maja 2016, o 11:44</p><hr />
]]></content>
</entry>
</feed>