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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2015-05-28T22:50:52+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=11747&amp;mode</id>
<entry>
<author><name><![CDATA[Panicz74]]></name></author>
<updated>2015-05-28T22:50:52+01:00</updated>
<published>2015-05-28T22:50:52+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=11747&amp;p=130327#p130327</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=11747&amp;p=130327#p130327"/>
<title type="html"><![CDATA[Re: Atmega644 - ustawianie serw według kolejki]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=11747&amp;p=130327#p130327"><![CDATA[
Już wykombinowałem <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> Oto kawałek kodu, który pomógł:<br /><br />[syntax=c]if(key_flag) // jeśli flaga = 0, wykonaj program<br />                {<br />                        key_flag = 0;<br /><br />                        if (KEY1_DOWN) //klawisz 1 wcisniety<br />                        {<br />                        if(KEY1_DOWN &amp;&amp; servo1!=SERVO_MAX)<br />                        {<br />                        servo1+=20;<br />                }<br />                        if (KEY1_DOWN &amp;&amp; servo2!=SERVO_MAX &amp;&amp; servo1==SERVO_MAX)<br />                        {<br />                                servo2+=20;<br />                        }<br />                        if (KEY1_DOWN &amp;&amp; servo3!=SERVO_MAX &amp;&amp; servo2==SERVO_MAX)<br />                        {<br />                        servo3+=20;<br />                        }<br />                        if (KEY1_DOWN &amp;&amp; servo4!=SERVO_MAX &amp;&amp; servo3==SERVO_MAX)<br />                        {<br />                                servo4 +=20;<br />                        }<br />                        if (KEY1_DOWN &amp;&amp; servo5!=SERVO_MAX &amp;&amp; servo4==SERVO_MAX)<br />                        {<br />                                servo5 +=20;<br />                        }<br />                        }[/syntax]<br /><br />Tutaj wrzucam filmik z działaniem:<br /><!-- m --><a class="postlink" href="https://www.youtube.com/watch?v=AAyQoECwwXM" >https://www.youtube.com/watch?v=AAyQoECwwXM</a><!-- m --><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=9088">Panicz74</a> — 28 maja 2015, o 22:50</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Krauser]]></name></author>
<updated>2015-05-22T19:55:14+01:00</updated>
<published>2015-05-22T19:55:14+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=11747&amp;p=129851#p129851</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=11747&amp;p=129851#p129851"/>
<title type="html"><![CDATA[Re: Atmega644 - ustawianie serw według kolejki]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=11747&amp;p=129851#p129851"><![CDATA[
<div class="quotetitle">Panicz74 napisał(a):</div><div class="quotecontent"><br />Niestety, program działa jak ten pierwotny  Wszystkie serwa ruszają jednocześnie.<br /></div><br />Sprawdź to jeszcze raz. Ostatecznie zmodyfikuj kod w ten sposób, a zamiast serw podłącz LEDy<br />[syntax=c]//0<br />//if (TCNT1 &gt;= servo1) PORTB &amp;= ~SERVO1;<br />//if (TCNT1 &gt;= servo2) PORTB &amp;= ~SERVO2;<br />//if (TCNT1 &gt;= servo3) PORTB &amp;= ~SERVO3;<br />//if (TCNT1 &gt;= servo4) PORTB &amp;= ~SERVO4;<br />//if (TCNT1 &gt;= servo5) PORTB &amp;= ~SERVO5;[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=465">Krauser</a> — 22 maja 2015, o 19:55</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Panicz74]]></name></author>
<updated>2015-05-20T23:16:34+01:00</updated>
<published>2015-05-20T23:16:34+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=11747&amp;p=129742#p129742</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=11747&amp;p=129742#p129742"/>
<title type="html"><![CDATA[Re: Atmega644 - ustawianie serw według kolejki]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=11747&amp;p=129742#p129742"><![CDATA[
Niestety, program działa jak ten pierwotny <img src="https://forum.atnel.pl/images/smilies/icon_e_sad.gif" alt=":(" title="Smutny" /> Wszystkie serwa ruszają jednocześnie. Tak sobie pomyślałem, czy istnieje jakiś sposób by zapauzować w danym miejscu program, aby go wznowić należałoby wcisnąć ponownie przycisk i by działał do momentu wystąpienia kolejnej pauzy?<br /><br />Na przykład takie coś:<br />[syntax=c]while (1) {<br />                if (key_flag) // jeśli flaga = 1 wykonaj<br />                {<br />                        key_flag = 0;<br />                        if (KEY1_DOWN) //klawisz 1 wcisniety<br />                        {<br />                                servo1 = SERVO_MAX;<br />                                servo2 = SERVO_MIN;<br /><br />                        //pauza, oczekiwanie na KEY1_DOWN<br /><br />                                servo3 = SERVO_MAX;<br />                                servo4 = SERVO_MIN;<br /><br />                        //pauza, oczekiwanie na KEY1_DOWN<br /><br />                                servo5 = SERVO_MAX;<br /><br />                        }<br />.<br />.<br />.[/syntax]<br /><br />Jest na to jakiś sposób?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=9088">Panicz74</a> — 20 maja 2015, o 23:16</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Krauser]]></name></author>
<updated>2015-05-20T16:14:08+01:00</updated>
<published>2015-05-20T16:14:08+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=11747&amp;p=129703#p129703</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=11747&amp;p=129703#p129703"/>
<title type="html"><![CDATA[Re: Atmega644 - ustawianie serw według kolejki]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=11747&amp;p=129703#p129703"><![CDATA[
To co podałem wcześniej opóźnia na bardzo krótko (rzędu ms). To co próbowałeś nie zadziałało z 3 powodów:<br />- i jest w warunkach przycisków, a po starcie program wcale nie wymaga aby jakikolwiek był wciśnięty bo ustawia serwa na pozycje środkowe<br />- jeśli wszystkie klawisze byłyby wciśnięte to po spełnieniu warunku i jest zwiększone i w następnym warunku ma odpowiednią wartość<br />- i tworzysz już w warunku i zawsze a taką samą wartość w każdym obiegu pętli<br /><br />Spróbuj jak poniżej. Dołożone są dodatkowe zmienne. Po starcie są zerami, a serwa zostaną uruchomione jak będą miały wartość różną od zera. W cyklicznym przerwaniu z pomocą dodatkowego licznika są one ustawiane po pewnym czasie od startu programu. Raz ustawione nie są już zmieniane.<br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;util/delay.h&gt;<br /><br />#define KEY1    (1&lt;&lt;PA0)                                // definicja pinow przycisków<br />#define KEY2    (1&lt;&lt;PA1)<br />#define KEY3    (1&lt;&lt;PA3)<br /><br />#define KEY1_DOWN ( !(PINA &amp; KEY1) )    // definicja wciśniętego przycisku<br />#define KEY2_DOWN ( !(PINA &amp; KEY2) )<br />#define KEY3_DOWN ( !(PINA &amp; KEY3) )<br /><br />#define SERVO1 (1&lt;&lt;PB0)                                 // definicja pinow silników<br />#define SERVO2 (1&lt;&lt;PB1)<br />#define SERVO3 (1&lt;&lt;PB2)<br />#define SERVO4 (1&lt;&lt;PB3)<br />#define SERVO5 (1&lt;&lt;PB4)<br /><br />#define SERVO_MID       1500                    // definicja położenia silnika<br />#define SERVO_MIN       1000<br />#define SERVO_MAX       2000<br /><br />uint16_t servo1, servo2, servo3, servo4, servo5;<br /><br />volatile uint8_t key_flag;                  // zmienne uzywana przez main i przerwanie<br />volatile uint8_t servo1_enable, servo2_enable, servo3_enable, servo4_enable, servo5_enable;<br /><br />int main(void) {<br />servo1 = servo2 = servo3 = servo4 = servo5 = SERVO_MID; // ustawienie początkowe silników<br />PORTA |= KEY1 | KEY2 | KEY3;                          // pull up - przyciski<br />DDRB |= SERVO1 | SERVO2 | SERVO3 | SERVO4 | SERVO5;   // wyjścia do silników<br />TCCR1A |= 1 &lt;&lt; WGM11;<br />TCCR1B |= 1 &lt;&lt; WGM12 | 1 &lt;&lt; WGM13 | 1 &lt;&lt; CS10; //rejestry odpowiedzialne za PWM<br />TIMSK1 |= 1 &lt;&lt; OCIE1A;                          // timer dla TCCR1B &amp; TCCR1A<br /><br />ICR1 = 19999;                                    //zawez okres<br /><br />sei();<br />//zezwolenie na przerwania<br /><br />while (1) {<br />if (key_flag) // jeśli flaga = 1 wykonaj<br />{<br />key_flag = 0;<br />if (KEY1_DOWN) //klawisz 1 wcisniety<br />{<br />servo1 = SERVO_MAX;<br />servo2 = SERVO_MIN;<br />servo3 = SERVO_MAX;<br />servo4 = SERVO_MIN;<br />servo5 = SERVO_MAX;<br />}<br />if (KEY2_DOWN) //klawisz 2 wcisniety<br />{<br />servo1 = SERVO_MIN;<br />servo2 = SERVO_MAX;<br />servo3 = SERVO_MIN;<br />servo4 = SERVO_MAX;<br />servo5 = SERVO_MIN;<br />}<br />if (KEY3_DOWN) //klawisz 3 wcisniety<br />{<br />servo1 = SERVO_MID;<br />servo2 = SERVO_MID;<br />servo3 = SERVO_MID;<br />servo4 = SERVO_MID;<br />servo5 = SERVO_MID;<br />}<br /><br />}<br />//1<br />if (TCNT1 &gt;= 0 &amp;&amp; TCNT1 &lt; servo1 &amp;&amp; servo1_enable) PORTB |= SERVO1;<br />if (TCNT1 &gt;= 0 &amp;&amp; TCNT1 &lt; servo2 &amp;&amp; servo2_enable) PORTB |= SERVO2;<br />if (TCNT1 &gt;= 0 &amp;&amp; TCNT1 &lt; servo3 &amp;&amp; servo3_enable) PORTB |= SERVO3;<br />if (TCNT1 &gt;= 0 &amp;&amp; TCNT1 &lt; servo4 &amp;&amp; servo4_enable) PORTB |= SERVO4;<br />if (TCNT1 &gt;= 0 &amp;&amp; TCNT1 &lt; servo5 &amp;&amp; servo5_enable) PORTB |= SERVO5;<br />//0<br />if (TCNT1 &gt;= servo1) PORTB &amp;= ~SERVO1;<br />if (TCNT1 &gt;= servo2) PORTB &amp;= ~SERVO2;<br />if (TCNT1 &gt;= servo3) PORTB &amp;= ~SERVO3;<br />if (TCNT1 &gt;= servo4) PORTB &amp;= ~SERVO4;<br />if (TCNT1 &gt;= servo5) PORTB &amp;= ~SERVO5;<br />}<br />}<br />ISR (TIMER1_COMPA_vect) //przerwanie co 20 ms<br />{<br />static uint16_t counter; //zmienna zachowywana po wyjsciu z funkcji<br />key_flag = 1;<br /><br />++counter;<br />if(counter &gt; 100) // po 100*20 ms = 2 s<br />servo1_enable = 1;<br />if(counter &gt; 200) // po 200*20 ms = 4 s<br />servo2_enable = 1;<br />if(counter &gt; 300) // po 300*20 ms = 6 s<br />servo3_enable = 1;<br />if(counter &gt; 400) // po 400*20 ms = 8 s<br />servo4_enable = 1;<br />if(counter &gt; 500) // po 500*20 ms = 10 s<br />servo5_enable = 1;<br />}[/syntax]<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 2 pikosekundach ]</span></strong><br /><br /><div class="quotetitle">Panicz74 napisał(a):</div><div class="quotecontent"><br />A jest jakaś możliwość aby zmniejszyć prędkość serw?<br /></div><br />Tak jeśli przykładowo do zmiennej servo1 nie przypiszesz od razu docelowej liczby tylko z stopniowo będziesz ją zwiększał, aż do wymaganej wartości.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=465">Krauser</a> — 20 maja 2015, o 16:14</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Panicz74]]></name></author>
<updated>2015-05-19T23:22:08+01:00</updated>
<published>2015-05-19T23:22:08+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=11747&amp;p=129657#p129657</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=11747&amp;p=129657#p129657"/>
<title type="html"><![CDATA[Re: Atmega644 - ustawianie serw według kolejki]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=11747&amp;p=129657#p129657"><![CDATA[
Niestety, bez zmian... A jest jakaś możliwość aby zmniejszyć prędkość serw? W tym momencie ruszają one z całą mocą...<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 33 minutach ]</span></strong><br /><br />Spróbowałem wstawić licznik ale to nic nie daje. Dalej serwa ruszają jednocześnie.<br /><br />[syntax=c]while(1)<br />        {<br />                if(key_flag) // jeśli flaga = 0, wykonaj program<br />                {<br />                        key_flag = 0;<br />                        int i = 0;<br />                        if (KEY1_DOWN &amp;&amp; i==0) //klawisz 1 wcisniety<br />                        {<br />                        servo1 = SERVO_MAX; i++;<br />                        }<br />                        if (KEY1_DOWN &amp;&amp; i==1)<br />                        {<br />                                servo2 = SERVO_MIN; i++;<br />                        }<br />                        if (KEY1_DOWN &amp;&amp; i==2)<br />                        {<br />                                servo3 = SERVO_MAX; i++;<br />        }<br />                        if (KEY1_DOWN &amp;&amp; i==3)<br />                        {<br />                                servo4 = SERVO_MIN; i++;<br />                        }<br />                        if (KEY1_DOWN &amp;&amp; i==4)<br />                        {<br />                                servo5 = CHWYTAK_MAX; i++;<br />                        }<br />                        i = 0;<br />.<br />.<br />.[/syntax]<br /><br />Chodzi mi o to abym mógł sobie ustawić przerwy pomiędzy ruchem kolejnych silników... Jakieś pomysły? <img src="https://forum.atnel.pl/images/smilies/icon_e_sad.gif" alt=":(" title="Smutny" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=9088">Panicz74</a> — 19 maja 2015, o 23:22</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Krauser]]></name></author>
<updated>2015-05-19T21:37:40+01:00</updated>
<published>2015-05-19T21:37:40+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=11747&amp;p=129651#p129651</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=11747&amp;p=129651#p129651"/>
<title type="html"><![CDATA[Re: Atmega644 - ustawianie serw według kolejki]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=11747&amp;p=129651#p129651"><![CDATA[
Nie zrobi to znacznej różnicy, a w sumie nie wiadomo w jakim odstępie to ma być:<br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;util/delay.h&gt;<br /><br />#define KEY1    (1&lt;&lt;PA0)                                // definicja przycików<br />#define KEY2    (1&lt;&lt;PA1)<br />#define KEY3    (1&lt;&lt;PA3)<br /><br />#define KEY1_DOWN ( !(PINA &amp; KEY1) )    // definicja wciśniętego przycisku<br />#define KEY2_DOWN ( !(PINA &amp; KEY2) )<br />#define KEY3_DOWN ( !(PINA &amp; KEY3) )<br /><br />#define SERVO1 (1&lt;&lt;PB0)                                 // definicja silników<br />#define SERVO2 (1&lt;&lt;PB1)<br />#define SERVO3 (1&lt;&lt;PB2)<br />#define SERVO4 (1&lt;&lt;PB3)<br />#define SERVO5 (1&lt;&lt;PB4)<br /><br />#define SERVO1_START 0<br />#define SERVO2_START 3000<br />#define SERVO3_START 6000<br />#define SERVO4_START 9000<br />#define SERVO5_START 12000 //zawsze &lt; 19 999<br /><br />#define SERVO_MID       1500                    // definicja położenia silnika<br />#define SERVO_MIN       1000<br />#define SERVO_MAX       2000<br /><br />uint16_t servo1, servo2, servo3, servo4, servo5;<br />volatile uint8_t key_flag;                  // zmienna pomijana przez kompilator<br /><br />int main(void) {<br />servo1 = servo2 = servo3 = servo4 = servo5 = SERVO_MID; // ustawienie początkowe silników<br />PORTA |= KEY1 | KEY2 | KEY3;                          // wyjścia - przyciski<br />DDRB |= SERVO1 | SERVO2 | SERVO3 | SERVO4 | SERVO5;   // wyjścia do silników<br />TCCR1A |= 1 &lt;&lt; WGM11;<br />TCCR1B |= 1 &lt;&lt; WGM12 | 1 &lt;&lt; WGM13 | 1 &lt;&lt; CS10; //rejestry odpowiedzialne za PWM<br />TIMSK1 |= 1 &lt;&lt; OCIE1A;                          // timer dla TCCR1B &amp; TCCR1A<br /><br />ICR1 = 19999;                                    //rozciagnij, zawez okres<br /><br />sei();<br />//uruchomienie przerwań<br /><br />while (1) {<br />if (key_flag) // jeśli flaga = 0, wykonaj program<br />{<br />key_flag = 0;<br />if (KEY1_DOWN) //klawisz 1 wcisniety<br />{<br /><br />servo1 = SERVO1_START + SERVO_MAX;<br />servo2 = SERVO2_START + SERVO_MIN;<br />servo3 = SERVO3_START + SERVO_MAX;<br />servo4 = SERVO4_START + SERVO_MIN;<br />servo5 = SERVO5_START + SERVO_MAX;<br /><br />}<br />if (KEY2_DOWN) //klawisz 2 wcisniety<br />{<br />servo1 = SERVO1_START + SERVO_MIN;<br />servo2 = SERVO2_START + SERVO_MAX;<br />servo3 = SERVO3_START + SERVO_MIN;<br />servo4 = SERVO4_START + SERVO_MAX;<br />servo5 = SERVO5_START + SERVO_MIN;<br /><br />}<br />if (KEY3_DOWN) //klawisz 3 wcisniety<br />{<br />servo1 = SERVO1_START + SERVO_MID;<br />servo2 = SERVO2_START + SERVO_MID;<br />servo3 = SERVO3_START + SERVO_MID;<br />servo4 = SERVO4_START + SERVO_MID;<br />servo5 = SERVO5_START + SERVO_MID;<br /><br />}<br /><br />}<br />//0<br />if (TCNT1 &gt;= servo1) PORTB &amp;= ~SERVO1; //nakierowanie mechanizmu przerwania<br />if (TCNT1 &gt;= servo2) PORTB &amp;= ~SERVO2;<br />if (TCNT1 &gt;= servo3) PORTB &amp;= ~SERVO3;<br />if (TCNT1 &gt;= servo4) PORTB &amp;= ~SERVO4;<br />if (TCNT1 &gt;= servo5) PORTB &amp;= ~SERVO5;<br />//1<br />if (TCNT1 &gt;= SERVO1_START &amp;&amp; TCNT1 &lt; servo1) PORTB |= SERVO1; //nakierowanie mechanizmu przerwania<br />if (TCNT1 &gt;= SERVO2_START &amp;&amp; TCNT1 &lt; servo2) PORTB |= SERVO2;<br />if (TCNT1 &gt;= SERVO3_START &amp;&amp; TCNT1 &lt; servo3) PORTB |= SERVO3;<br />if (TCNT1 &gt;= SERVO4_START &amp;&amp; TCNT1 &lt; servo4) PORTB |= SERVO4;<br />if (TCNT1 &gt;= SERVO5_START &amp;&amp; TCNT1 &lt; servo5) PORTB |= SERVO5;<br /><br />}<br />}<br />ISR (TIMER1_COMPA_vect) {<br />key_flag = 1;                        // jeśli flaga = 1, program sie wykonał<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=465">Krauser</a> — 19 maja 2015, o 21:37</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Panicz74]]></name></author>
<updated>2015-05-19T15:51:50+01:00</updated>
<published>2015-05-19T15:51:50+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=11747&amp;p=129595#p129595</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=11747&amp;p=129595#p129595"/>
<title type="html"><![CDATA[Atmega644 - ustawianie serw według kolejki]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=11747&amp;p=129595#p129595"><![CDATA[
Zakładam nowy temat bo w starym już zbyt wiele kwestii poruszono.<br /><br />Dany jest testowy kod, który steruje 5 serwomechanizmami:<br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;util/delay.h&gt;<br /><br />#define KEY1    (1&lt;&lt;PA0)// definicja przycików<br />#define KEY2    (1&lt;&lt;PA1)<br />#define KEY3    (1&lt;&lt;PA3)<br /><br />#define KEY1_DOWN ( !(PINA &amp; KEY1) )// definicja wciśniętego przycisku<br />#define KEY2_DOWN ( !(PINA &amp; KEY2) )<br />#define KEY3_DOWN ( !(PINA &amp; KEY3) )<br /><br />#define SERVO1 (1&lt;&lt;PB0)// definicja silników<br />#define SERVO2 (1&lt;&lt;PB1)<br />#define SERVO3 (1&lt;&lt;PB2)<br />#define SERVO4 (1&lt;&lt;PB3)<br />#define SERVO5 (1&lt;&lt;PB4)<br /><br /><br />#define SERVO_MID       1500// definicja położenia silnika<br />#define SERVO_MIN       1000<br />#define SERVO_MAX       2000<br /><br /><br />uint16_t servo1, servo2, servo3, servo4, servo5;<br />volatile uint8_t key_flag;// zmienna pomijana przez kompilator<br /><br />int main(void)<br />{<br />servo1 = servo2 = servo3 = servo4 = servo5 = SERVO_MID;// ustawienie początkowe silników<br />PORTA |= KEY1 | KEY2 | KEY3;// wyjścia - przyciski<br />DDRB |= SERVO1 | SERVO2 | SERVO3 | SERVO4 | SERVO5; // wyjścia do silników<br />TCCR1A |= 1&lt;&lt;WGM11;<br />TCCR1B |= 1&lt;&lt;WGM12 | 1&lt;&lt;WGM13 | 1&lt;&lt;CS10;//rejestry odpowiedzialne za PWM<br />TIMSK1 |= 1&lt;&lt;OCIE1A;// timer dla TCCR1B &amp; TCCR1A<br /><br />ICR1 = 19999;//rozciagnij, zawez okres<br /><br />sei();//uruchomienie przerwań<br /><br />while(1)<br />        {<br />                if(key_flag) // jeśli flaga = 0, wykonaj program<br />                {<br />                        key_flag = 0;<br />                        if (KEY1_DOWN) //klawisz 1 wcisniety<br />                        {<br /><br />                                servo1 = SERVO_MAX;<br />                                servo2 = SERVO_MIN;<br />                                servo3 = SERVO_MAX;<br />                                servo4 = SERVO_MIN;<br />                                servo5 = SERVO_MAX;<br /><br />                        }<br />                        if (KEY2_DOWN) //klawisz 2 wcisniety<br />                        {<br />                                servo1 = SERVO_MIN;<br />                                servo2 = SERVO_MAX;<br />                                servo3 = SERVO_MIN;<br />                                servo4 = SERVO_MAX;<br />                                servo5 = SERVO_MIN;<br /><br />                        }<br />                        if (KEY3_DOWN) //klawisz 3 wcisniety<br />                        {<br />                                servo1 = SERVO_MID;<br />                                servo2 = SERVO_MID;<br />                                servo3 = SERVO_MID;<br />                                servo4 = SERVO_MID;<br />                                servo5 = SERVO_MID;<br /><br />                        }<br /><br />                }<br />                if(TCNT1 &gt;= servo1) PORTB &amp;= ~SERVO1; //nakierowanie mechanizmu przerwania<br />                if(TCNT1 &gt;= servo2) PORTB &amp;= ~SERVO2;<br />                if(TCNT1 &gt;= servo3) PORTB &amp;= ~SERVO3;<br />                if(TCNT1 &gt;= servo4) PORTB &amp;= ~SERVO4;<br />                if(TCNT1 &gt;= servo5) PORTB &amp;= ~SERVO5;<br /><br />        }<br />}<br />ISR (TIMER1_COMPA_vect)<br />{<br />        PORTB |= SERVO1 | SERVO2 | SERVO3 | SERVO4 | SERVO5;<br />        key_flag = 1; // jeśli flaga = 1, program sie wykonał<br />}[/syntax]<br /><br />Problem polega na tym, że serwa startują jednocześnie, zachodzi zjawisko hazardu. Domyślam się, że na pewno chodzi o tę część:<br />[syntax=c]ISR (TIMER1_COMPA_vect)<br />{<br />        PORTB |= SERVO1 | SERVO2 | SERVO3 | SERVO4 | SERVO5;<br />        key_flag = 1; // jeśli flaga = 1, program sie wykonał<br />}[/syntax]<br /><br />Sprawa niby prosta, ale jakakolwiek zmiana powoduje brak działania programu. Czy wie ktoś co zrobić aby uruchamiać serwa po kolei, tzn. od SERVO1 do SERVO5?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=9088">Panicz74</a> — 19 maja 2015, o 15:51</p><hr />
]]></content>
</entry>
</feed>