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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2015-06-10T13:32:37+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=8&amp;t=11949&amp;mode</id>
<entry>
<author><name><![CDATA[Panicz74]]></name></author>
<updated>2015-06-10T13:32:37+01:00</updated>
<published>2015-06-10T13:32:37+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=11949&amp;p=131411#p131411</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=11949&amp;p=131411#p131411"/>
<title type="html"><![CDATA[Re: Atmega644 - pytanie dotyczące prescalera]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=11949&amp;p=131411#p131411"><![CDATA[
Faktycznie z preskaler = 1 jest lepiej. Dzięki wielkie za pomoc, dużo się wyjaśniło <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=9088">Panicz74</a> — 10 cze 2015, o 13:32</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[daro2020]]></name></author>
<updated>2015-06-10T12:25:28+01:00</updated>
<published>2015-06-10T12:25:28+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=11949&amp;p=131404#p131404</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=11949&amp;p=131404#p131404"/>
<title type="html"><![CDATA[Re: Atmega644 - pytanie dotyczące prescalera]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=11949&amp;p=131404#p131404"><![CDATA[
<div class="quotetitle">Panicz74 napisał(a):</div><div class="quotecontent"><br />...zmiana CS10 na CS11 powoduje brak działania. Można jakoś zmienić preskaler na =8?<br /></div><br />Na CS=11 też musi działać tylko, że 8 razy wolniej. Jeśli upierasz się na preskaler=8, to:<br />[syntax=c]OCR1A = 5000-1;//2,5ms@16MHz<br />TIMSK1 |= (1&lt;&lt;OCIE1A);<br />TCCR1B |= (1&lt;&lt;WGM12)|(1&lt;&lt;CS11);//CTC<br />sei();[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1608">daro2020</a> — 10 cze 2015, o 12:25</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Panicz74]]></name></author>
<updated>2015-06-10T11:57:44+01:00</updated>
<published>2015-06-10T11:57:44+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=11949&amp;p=131401#p131401</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=11949&amp;p=131401#p131401"/>
<title type="html"><![CDATA[Re: Atmega644 - pytanie dotyczące prescalera]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=11949&amp;p=131401#p131401"><![CDATA[
No ok, racja. Działa. My bad. Ale zmiana CS10 na CS11 powoduje brak działania. Można jakoś zmienić preskaler na =8?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=9088">Panicz74</a> — 10 cze 2015, o 11:57</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[daro2020]]></name></author>
<updated>2015-06-10T11:22:52+01:00</updated>
<published>2015-06-10T11:22:52+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=11949&amp;p=131398#p131398</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=11949&amp;p=131398#p131398"/>
<title type="html"><![CDATA[Re: Atmega644 - pytanie dotyczące prescalera]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=11949&amp;p=131398#p131398"><![CDATA[
Hmm, zmiksowałeś mój kod, ze swoim i dziwisz się?<br /><br />Wyrzuć ten kod:<br />[syntax=c]TCCR1A |= 1&lt;&lt;WGM11;<br />        TCCR1B |= 1&lt;&lt;WGM12 | 1&lt;&lt;CS11;<br />        TIMSK1 |= 1&lt;&lt;OCIE1A;<br /> <br />        OCR1A = 39999;//rozciagnij, zawez okres<br /> <br />        sei();//uruchomienie przerwań[/syntax]<br /><br />i wstaw mój:<br />[syntax=c]OCR1A = 40000-1;//2,5ms@16MHz<br />TIMSK1 |= (1&lt;&lt;OCIE1A);<br />TCCR1B |= (1&lt;&lt;WGM12)|(1&lt;&lt;CS10);//CTC<br />sei();[/syntax]<br /><br />Po prostu skopiuj i wklej, nie cuduj.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1608">daro2020</a> — 10 cze 2015, o 11:22</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Panicz74]]></name></author>
<updated>2015-06-10T09:20:12+01:00</updated>
<published>2015-06-10T09:20:12+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=11949&amp;p=131382#p131382</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=11949&amp;p=131382#p131382"/>
<title type="html"><![CDATA[Re: Atmega644 - pytanie dotyczące prescalera]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=11949&amp;p=131382#p131382"><![CDATA[
Kod pierwotnie wyglądał tak:<br /><br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br /><br /><br />#define KEY1    (1&lt;&lt;PA0)<br />#define KEY2    (1&lt;&lt;PA1)<br />#define KEY3    (1&lt;&lt;PA2)<br />#define KEY4    (1&lt;&lt;PA3)<br />#define KEY5    (1&lt;&lt;PA4)<br />#define KEY6    (1&lt;&lt;PA5)<br />#define KEY7    (1&lt;&lt;PA6)<br />#define KEY8    (1&lt;&lt;PA7)<br /><br />#define KEY1_DOWN ( !(PINA &amp; KEY1) )<br />#define KEY2_DOWN ( !(PINA &amp; KEY2) )<br />#define KEY3_DOWN ( !(PINA &amp; KEY3) )<br />#define KEY4_DOWN ( !(PINA &amp; KEY4) )<br />#define KEY5_DOWN ( !(PINA &amp; KEY5) )<br />#define KEY6_DOWN ( !(PINA &amp; KEY6) )<br />#define KEY7_DOWN ( !(PINA &amp; KEY7) )<br />#define KEY8_DOWN ( !(PINA &amp; KEY8) )<br /><br />#define SERVO1 (1&lt;&lt;PD4)<br />#define SERVO2 (1&lt;&lt;PD5)<br />#define SERVO3 (1&lt;&lt;PD6)<br />#define SERVO4 (1&lt;&lt;PD7)<br /><br />#define SERVO_MID       2700<br />#define SERVO_MIN       800<br />#define SERVO_MAX       4600<br />#define HAND_CLOSE      3100<br />#define HAND_OPEN       4500<br /><br />uint16_t servo1, servo2, servo3, servo4;<br />volatile uint8_t key_flag;//informacja dla kompilatora zeby mi sam nie zmienil tej zmiennej<br /><br />int main(void)<br />{<br />        servo1 = servo2 = servo3 = SERVO_MID;<br />        servo4 = HAND_OPEN;<br />        PORTA |= KEY1 | KEY2 | KEY3 | KEY4 | KEY5 | KEY6 | KEY7 | KEY8; //podciagnięcie wejsc<br />        DDRD |= SERVO1 | SERVO2 | SERVO3 | SERVO4; //wyjscia<br />        TCCR1A |= 1&lt;&lt;WGM11;<br />        TCCR1B |= 1&lt;&lt;WGM12 | 1&lt;&lt;WGM13 | 1&lt;&lt;CS10;<br />        TIMSK1 |= 1&lt;&lt;OCIE1A;<br /><br />        ICR1 = 19999;//rozciagnij, zawez okres<br /><br />        sei();//uruchomienie przerwań<br /><br />        while(1)<br />        {<br />                if(key_flag)<br />                {<br />                        key_flag = 0;<br />                        if (KEY1_DOWN) //klawisz 1 wcisniety<br />                        {<br />                                servo1+=5;<br />                        }<br />                        if (KEY2_DOWN) //klawisz 2 wcisniety<br />                        {<br />                                servo1-=5;<br />                        }<br /><br />                        if (KEY3_DOWN) //klawisz 3 wcisniety<br />                        {<br />                                servo2+=20;<br />                        }<br />                        if (KEY4_DOWN) //klawisz 4 wcisniety<br />                        {<br />                                 servo2-=20;<br />                        }<br /><br />                        if (KEY5_DOWN) //klawisz 5 wcisniety<br />                        {<br />                                servo3+=5;<br />                        }<br />                        if (KEY6_DOWN) //klawisz 6 wcisniety<br />                        {<br />                                servo3-=5;<br />                        }<br />                        if (KEY7_DOWN) //klawisz 7 wcisniety<br />                        {<br />                                servo4 = HAND_OPEN;<br />                        }<br />                        if (KEY8_DOWN) //klawisz 8 wcisniety<br />                        {<br />                                servo4 = HAND_CLOSE;<br />                        }<br /><br /><br />                }<br />                if(TCNT1 &gt; servo1) PORTD &amp;= ~SERVO1; //nakierowanie mechanizmu przerwania<br />                if(TCNT1 &gt; servo2) PORTD &amp;= ~SERVO2;<br />                if(TCNT1 &gt; servo3) PORTD &amp;= ~SERVO3;<br />                if(TCNT1 &gt; servo4) PORTD &amp;= ~SERVO4;<br />        }<br />}<br /><br />ISR (TIMER1_COMPA_vect)<br />{<br />        PORTD |= SERVO1 | SERVO2 | SERVO3 | SERVO4;<br />        key_flag = 1;<br />}[/syntax]<br /><br />Po zmianach wygląda tak:<br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br /><br /><br />#define KEY1    (1&lt;&lt;PA0)<br />#define KEY2    (1&lt;&lt;PA1)<br />#define KEY3    (1&lt;&lt;PA2)<br />#define KEY4    (1&lt;&lt;PA3)<br />#define KEY5    (1&lt;&lt;PA4)<br />#define KEY6    (1&lt;&lt;PA5)<br />#define KEY7    (1&lt;&lt;PA6)<br />#define KEY8    (1&lt;&lt;PA7)<br /><br />#define KEY1_DOWN ( !(PINA &amp; KEY1) )<br />#define KEY2_DOWN ( !(PINA &amp; KEY2) )<br />#define KEY3_DOWN ( !(PINA &amp; KEY3) )<br />#define KEY4_DOWN ( !(PINA &amp; KEY4) )<br />#define KEY5_DOWN ( !(PINA &amp; KEY5) )<br />#define KEY6_DOWN ( !(PINA &amp; KEY6) )<br />#define KEY7_DOWN ( !(PINA &amp; KEY7) )<br />#define KEY8_DOWN ( !(PINA &amp; KEY8) )<br /><br />#define SERVO1 (1&lt;&lt;PD4)<br />#define SERVO2 (1&lt;&lt;PD5)<br />#define SERVO3 (1&lt;&lt;PD6)<br />#define SERVO4 (1&lt;&lt;PD7)<br /><br />#define SERVO_MID       5400<br />#define SERVO_MIN       1600<br />#define SERVO_MAX       9200<br />#define HAND_CLOSE      6200<br />#define HAND_OPEN       9000<br /><br />uint16_t servo1, servo2, servo3, servo4;<br />volatile uint8_t key_flag;//informacja dla kompilatora zeby mi sam nie zmienil tej zmiennej<br /><br />int main(void)<br />{<br />        servo1 = servo2 = servo3 = SERVO_MID;<br />        servo4 = HAND_OPEN;<br />        PORTA |= KEY1 | KEY2 | KEY3 | KEY4 | KEY5 | KEY6 | KEY7 | KEY8; //podciagnięcie wejsc<br />        DDRD |= SERVO1 | SERVO2 | SERVO3 | SERVO4; //wyjscia<br />        TCCR1A |= 1&lt;&lt;WGM11;<br />        TCCR1B |= 1&lt;&lt;WGM12 | 1&lt;&lt;CS11;<br />        TIMSK1 |= 1&lt;&lt;OCIE1A;<br /><br />        OCR1A = 39999;//rozciagnij, zawez okres<br /><br />        sei();//uruchomienie przerwań<br /><br />        while(1)<br />        {<br />                if(key_flag)<br />                {<br />                        key_flag = 0;<br />                        if (KEY1_DOWN) //klawisz 1 wcisniety<br />                        {<br />                                servo1+=20;<br />                        }<br />                        if (KEY2_DOWN) //klawisz 2 wcisniety<br />                        {<br />                                servo1-=20;<br />                        }<br /><br />                        if (KEY3_DOWN) //klawisz 3 wcisniety<br />                        {<br />                                servo2+=20;<br />                        }<br />                        if (KEY4_DOWN) //klawisz 4 wcisniety<br />                        {<br />                                 servo2-=20;<br />                        }<br /><br />                        if (KEY5_DOWN) //klawisz 5 wcisniety<br />                        {<br />                                servo3+=5;<br />                        }<br />                        if (KEY6_DOWN) //klawisz 6 wcisniety<br />                        {<br />                                servo3-=5;<br />                        }<br />                        if (KEY7_DOWN) //klawisz 7 wcisniety<br />                        {<br />                                servo4 = HAND_OPEN;<br />                        }<br />                        if (KEY8_DOWN) //klawisz 8 wcisniety<br />                        {<br />                                servo4 = HAND_CLOSE;<br />                        }<br /><br /><br />                }<br />                if(TCNT1 &gt; servo1) PORTD &amp;= ~SERVO1; //nakierowanie mechanizmu przerwania<br />                if(TCNT1 &gt; servo2) PORTD &amp;= ~SERVO2;<br />                if(TCNT1 &gt; servo3) PORTD &amp;= ~SERVO3;<br />                if(TCNT1 &gt; servo4) PORTD &amp;= ~SERVO4;<br />        }<br />}<br /><br />ISR (TIMER1_COMPA_vect)<br />{<br />        PORTD |= SERVO1 | SERVO2 | SERVO3 | SERVO4;<br />        key_flag = 1;<br />}[/syntax]<br /><br />Niestety w takim wyglądzie w ogóle nie rusza... Kompilator nie wykrywa żadnych błędów. Jakieś inne pomysły, sugestie?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=9088">Panicz74</a> — 10 cze 2015, o 09:20</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[daro2020]]></name></author>
<updated>2015-06-09T11:43:14+01:00</updated>
<published>2015-06-09T11:43:14+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=11949&amp;p=131325#p131325</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=11949&amp;p=131325#p131325"/>
<title type="html"><![CDATA[Re: Atmega644 - pytanie dotyczące prescalera]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=11949&amp;p=131325#p131325"><![CDATA[
8<div class="quotetitle">daro2020 napisał(a):</div><div class="quotecontent"><br />Wpisałeś do rejestru TCCR1B bit CS10, który odpowiada za prescaler = 1, nie powinno być CS11?<br /></div><br />To zależy co ile ms chcesz przerwanie. Ja podałem wartości dla CS10=1 (preskaler=1), a więc 2,5ms. Ustawiając CS11  (preskaler=8) uzyskasz 20ms.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1608">daro2020</a> — 9 cze 2015, o 11:43</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Panicz74]]></name></author>
<updated>2015-06-09T11:01:14+01:00</updated>
<published>2015-06-09T11:01:14+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=11949&amp;p=131321#p131321</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=11949&amp;p=131321#p131321"/>
<title type="html"><![CDATA[Re: Atmega644 - pytanie dotyczące prescalera]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=11949&amp;p=131321#p131321"><![CDATA[
Dokładnie, serwa są sterowane w przerwaniu. Wieczorem jak najbardziej sprawdzę <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br />Tylko takie pytanie:<br /><br />- Wpisałeś do rejestru TCCR1B bit CS10, który odpowiada za prescaler = 1, nie powinno być CS11?<br /><br />Jak się dostanę do Eclipsa to wyślę cały kod <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=9088">Panicz74</a> — 9 cze 2015, o 11:01</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[daro2020]]></name></author>
<updated>2015-06-08T20:47:45+01:00</updated>
<published>2015-06-08T20:47:45+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=11949&amp;p=131289#p131289</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=11949&amp;p=131289#p131289"/>
<title type="html"><![CDATA[Re: Atmega644 - pytanie dotyczące prescalera]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=11949&amp;p=131289#p131289"><![CDATA[
Z Twojego  kodu wynika, że chcesz uzyskać przerwanie co 2,5ms i tam realizować sterowanie serwo. A więc dajesz:<br />[syntax=c]OCR1A = 40000-1;//2,5ms@16MHz<br />TIMSK1 |= (1&lt;&lt;OCIE1A);<br />TCCR1B |= (1&lt;&lt;WGM12)|(1&lt;&lt;CS10);//CTC<br />sei();[/syntax]<br />No i oczywiście makro dla obsługi przerwania.<br />[syntax=c]ISR(TIMER1_COMPA_vect)<br />{<br />//kod do obsługi serwo<br />}[/syntax]<br />Oczywiście dla sprawdzenia czy działa togluj leda w przerwaniu ustawiając tymczasowo preskaler clk/64, co da ok 3 mrugnięcia ledem /sek.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1608">daro2020</a> — 8 cze 2015, o 20:47</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Panicz74]]></name></author>
<updated>2015-06-08T16:11:03+01:00</updated>
<published>2015-06-08T16:11:03+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=11949&amp;p=131257#p131257</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=11949&amp;p=131257#p131257"/>
<title type="html"><![CDATA[Re: Atmega644 - pytanie dotyczące prescalera]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=11949&amp;p=131257#p131257"><![CDATA[
<div class="quotetitle">daro2020 napisał(a):</div><div class="quotecontent"><br />A zatem przejdź w tryb CTC, przestawiając bity WGM i zamiast do rejestri ICR1 załaduj wyliczone wartości do OCR1.<br /></div><br /><br />Nie wiem w jaki sposób przestawić bity WGM... Przecież są zgodne z tabelą. (???)<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=9088">Panicz74</a> — 8 cze 2015, o 16:11</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[daro2020]]></name></author>
<updated>2015-06-08T08:27:12+01:00</updated>
<published>2015-06-08T08:27:12+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=11949&amp;p=131229#p131229</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=11949&amp;p=131229#p131229"/>
<title type="html"><![CDATA[Re: Atmega644 - pytanie dotyczące prescalera]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=11949&amp;p=131229#p131229"><![CDATA[
Czy do sterowania serwami chcesz używać sprzętowego PWM (a taki wybrałeś ustwiając bity WGM)? Jeśli tak, to dedykowane sprzętowe wyjścia PWM w porcie D (Mega644) są tylko 2. Chociaż z drugiej strony jeśli ustawiłeś przerwanie OCIE1A, to raczej chcesz wywołać zwykłe przerwanie od timera i tam dokonywań zmian PWM programowo. A zatem przejdź w tryb CTC, przestawiając bity WGM i zamiast do rejestri ICR1 załaduj wyliczone wartości do OCR1.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1608">daro2020</a> — 8 cze 2015, o 08:27</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Panicz74]]></name></author>
<updated>2015-06-08T06:01:48+01:00</updated>
<published>2015-06-08T06:01:48+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=11949&amp;p=131223#p131223</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=11949&amp;p=131223#p131223"/>
<title type="html"><![CDATA[Atmega644 - pytanie dotyczące prescalera]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=11949&amp;p=131223#p131223"><![CDATA[
Właśnie na to wpadłem. Program steruje 4 serwami w przerwaniu, więc trzeba ustawić prescaler i tu mi się zrodziło takie pytanie:<br /><br />Jest dana część kodu:<br />[syntax=c]#define SERVO_MID       2700<br />#define SERVO_MIN       800<br />#define SERVO_MAX       4600<br />#define HAND_CLOSE      3100<br />#define HAND_OPEN       4500<br /><br />uint16_t servo1, servo2, servo3, servo4;<br />volatile uint8_t key_flag;<br /><br />int main(void)<br />{<br />        servo1 = servo2 = servo3 = SERVO_MID;<br />        servo4 = HAND_OPEN;<br />        PORTA |= KEY1 | KEY2 | KEY3 | KEY4 | KEY5 | KEY6 | KEY7 | KEY8; //podciagnięcie wejsc<br />        DDRD |= SERVO1 | SERVO2 | SERVO3 | SERVO4; //wyjscia<br />        TCCR1A |= 1&lt;&lt;WGM11;<br />        TCCR1B |= 1&lt;&lt;WGM12 | 1&lt;&lt;WGM13 | 1&lt;&lt;CS10;<br />        TIMSK1 |= 1&lt;&lt;OCIE1A;<br /><br />        ICR1 = 19999;//rozciagnij, zawez okres<br /><br />        sei();//uruchomienie przerwań[/syntax]<br /><br />I tak, procesor jest taktowany 16MHz, więc liczę sobie preskaler według takiej zasady:<br />[syntax=c]prescaler = 1 -&gt; ICR1 = 1000000 / 1 / 50 = 20000 <br />prescaler = 8 -&gt; ICR1 = 1000000 / 8 / 50 = 2500 <br />prescaler = 64 -&gt; ICR1 = 1000000 / 64 / 50 = 312,5 <br />prescaler = 256 -&gt; ICR1 = 1000000 / 256 / 50 = 78,125 <br />prescaler = 1024 -&gt; ICR1 = 1000000 / 1024 / 50 = 19,53125[/syntax]<br /><br />No ale przecież procesor jest taktowany 16MHz więc:<br />[syntax=c]prescaler = 1 -&gt; ICR1 = 16000000/1/50 = 320000<br />prescaler = 8 -&gt; ICR1 = 16000000/8/50 = 40000<br />prescaler = 64 -&gt; ICR1 = 16000000/64/50 = 5000<br />itd.[/syntax]<br /><br />Jest to timer 16-bit, więc wiadomo że zakres musi się zmieścić w 0-65335. W związku z tym najlepszym rozwiązaniem tutaj będzie prescaler = 8 i widełki 0-39999, ponieważ wtedy otrzymam najwyższą dokładność. Czy mam rację? Bo wszędzie rozwiązanie tego widziałem 0-19999.<br /><br />No ale ok, matematyka nie kłamie... Sprawdzam sobie w nocie Atmegi644 i widzę:<br /><a href="http://forum.atnel.pl/_obrazki/o/9088/dfb81edad20f0c4304c87a3ca0f0b513.jpg"  class="postlink"><img src="http://forum.atnel.pl/_obrazki/o/thumb/9088/dfb81edad20f0c4304c87a3ca0f0b513.jpg" alt="Obrazek" /></a><br /><br />Co od razu każe mi zmieniać bit CS10 na CS11 w rejestrze TCCR1B. Robię dalej, przeliczam zakresy i powstaje taki kawałek kodu:<br />[syntax=c]#define SERVO_MID       5400<br />#define SERVO_MIN       1600<br />#define SERVO_MAX       9200<br />#define HAND_CLOSE      6200<br />#define HAND_OPEN       9000<br /><br />uint16_t servo1, servo2, servo3, servo4;<br />volatile uint8_t key_flag;<br /><br />int main(void)<br />{<br />        servo1 = servo2 = servo3 = SERVO_MID;<br />        servo4 = HAND_OPEN;<br />        PORTA |= KEY1 | KEY2 | KEY3 | KEY4 | KEY5 | KEY6 | KEY7 | KEY8; //podciagnięcie wejsc<br />        DDRD |= SERVO1 | SERVO2 | SERVO3 | SERVO4; //wyjscia<br />        TCCR1A |= 1&lt;&lt;WGM11;<br />        TCCR1B |= 1&lt;&lt;WGM12 | 1&lt;&lt;WGM13 | 1&lt;&lt;CS11;<br />        TIMSK1 |= 1&lt;&lt;OCIE1A;<br /><br />        ICR1 = 39999;//rozciagnij, zawez okres<br /><br />        sei();//uruchomienie przerwań[/syntax]<br /><br />I nie działa... A przecież powinno... Czy ktoś mądrzejszy ode mnie może mnie nakierować, gdzie zrobiłem babola tudzież czy moje rozumowanie jest złe???<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=9088">Panicz74</a> — 8 cze 2015, o 06:01</p><hr />
]]></content>
</entry>
</feed>