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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2014-03-12T18:51:37+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=6188&amp;mode</id>
<entry>
<author><name><![CDATA[frickle]]></name></author>
<updated>2014-03-12T18:51:37+01:00</updated>
<published>2014-03-12T18:51:37+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=6188&amp;p=74017#p74017</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=6188&amp;p=74017#p74017"/>
<title type="html"><![CDATA[Re: Sterowanie serwem - dziwny problem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=6188&amp;p=74017#p74017"><![CDATA[
Dzięki w pomoc. Troche poczytałem, ale jeszcze sporo przede mną. Teraz trochę czasu brakuje, ale jak już się znowu wezmę na ten temat pewnie jeszcze nie jedno pytanie tu padnie.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2566">frickle</a> — 12 mar 2014, o 18:51</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[pagosa747]]></name></author>
<updated>2014-03-02T00:33:26+01:00</updated>
<published>2014-03-02T00:33:26+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=6188&amp;p=72699#p72699</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=6188&amp;p=72699#p72699"/>
<title type="html"><![CDATA[Re: Sterowanie serwem - dziwny problem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=6188&amp;p=72699#p72699"><![CDATA[
<!-- m --><a class="postlink" href="http://hobby.abxyz.bplaced.net/index.php?pid=3&amp;aid=20" >http://hobby.abxyz.bplaced.net/index.php?pid=3&amp;aid=20</a><!-- m --><br /><!-- m --><a class="postlink" href="http://www.rcclub.eu/viewtopic.php?f=7&amp;t=4421" >http://www.rcclub.eu/viewtopic.php?f=7&amp;t=4421</a><!-- m --><br /><!-- m --><a class="postlink" href="http://www.robotyka.net.pl/sterowanie-serwomechanizmem/" >http://www.robotyka.net.pl/sterowanie-serwomechanizmem/</a><!-- m --><br /><!-- m --><a class="postlink" href="https://ccrma.stanford.edu/courses/250a-fall-2003/docs/avrlib-new/servo_8c-source.html" >https://ccrma.stanford.edu/courses/250a ... ource.html</a><!-- m --><br /><!-- m --><a class="postlink" href="http://omegav.ed.ntnu.no/wiki/index.php/AVR/Source/Servo" >http://omegav.ed.ntnu.no/wiki/index.php ... urce/Servo</a><!-- m --><br /><!-- m --><a class="postlink" href="http://www.ermicro.com/blog/?p=771" >http://www.ermicro.com/blog/?p=771</a><!-- m --><br /><!-- m --><a class="postlink" href="http://letsmakerobots.com/node/36528" >http://letsmakerobots.com/node/36528</a><!-- m --><br /><br />Witam .<br />Powyżej wkleiłem kilka linków do stron o tematyce serv. <br />Poczytaj uważnie a wiele rzeczy się wyjaśni .<br />Absolutnie nie mam zamiaru Ciebie krytykować , ale Twoje podejście z delayami jest niestety troszkę nie w tą stronę .<br /><br />Zachęcam do lektury powyższych stron a naprawdę zobaczysz , że obsługa kilku serv nie stanowi problemu , jeżeli odpowiednio podejdziesz do ich obsługi. <br /><br />Pozdrawiam .<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=629">pagosa747</a> — 2 mar 2014, o 00:33</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Sonix]]></name></author>
<updated>2014-03-02T00:19:04+01:00</updated>
<published>2014-03-02T00:19:04+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=6188&amp;p=72692#p72692</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=6188&amp;p=72692#p72692"/>
<title type="html"><![CDATA[Re: Sterowanie serwem - dziwny problem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=6188&amp;p=72692#p72692"><![CDATA[
Z serwami bawiliśmy się dawno temu, myślę że trochę może pomóc wątek:<br /><br /><!-- l --><a class="postlink-local" href="http://forum.atnel.pl/topic1095.html" >topic1095.html</a><!-- l --><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=127">Sonix</a> — 2 mar 2014, o 00:19</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Lukasz89]]></name></author>
<updated>2014-03-01T15:33:25+01:00</updated>
<published>2014-03-01T15:33:25+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=6188&amp;p=72590#p72590</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=6188&amp;p=72590#p72590"/>
<title type="html"><![CDATA[Re: Sterowanie serwem - dziwny problem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=6188&amp;p=72590#p72590"><![CDATA[
o delay-ach do tego zastosowania zapomnij, w szczególności w przerwaniach i to jeszcze dla kilku serw - wtedy to już wogóle nie wiedziałbyś co robi program, który napisałeś ;p Ja swego czasu robiłem program dla dwóch serw, zaś zadajnikiem były sygnał step/dir. Wszystko uruchomione zostało na przerwaniach. <br />Algorytm wygląda następująco:<br />1. timer pierwszy odlicz i uruchamia przerwanie co 20ms które załacza serwo /serwa (daje 1) i startuje timer drugi (drugi logicznie a nie że Tmiere2 z procka)<br />2. drugi timer odlicza czas do zadanego mu czasu i wywołuje przerwanie w którym na wyjście serwa daje stan 0.<br /><br />Dla dwóch serw wykorzystałem timer 1 (16 bitów zapewniło precyzję czasu oraz pokrycie pełnego zakresu wyzwalania) i jego przerwania od OCRxA oraz B do dwóch serw, jeśli Ty potrzebujesz więcej to musisz to obsłużyć programowo w przerwaniu.<br />Żeby któreś z serw nie opóźniało załączenia/wyłączenia kolejnego można zrealizować to jak w punktach 1 i 2 z tym, że najpierw startuje 1 serwo i jest gaszone i następne przerwanie od timera nie następuje po 20ms a po 10ms i wtedy załączane jest serwo 2 (a w przypadku 4 serw po 5 ms). dzięki czemu obsługa serw nie nachodzi na siebie  a procek  się nie nudzić ~18ms.<br />W moim programie dodatkowo, timery sprzętowe liczyły tiki sygnału step, zaś przerwania zew INTx określały kierunek dir.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=590">Lukasz89</a> — 1 mar 2014, o 15:33</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[frickle]]></name></author>
<updated>2014-03-01T13:45:38+01:00</updated>
<published>2014-03-01T13:45:38+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=6188&amp;p=72581#p72581</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=6188&amp;p=72581#p72581"/>
<title type="html"><![CDATA[Re: Sterowanie serwem - dziwny problem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=6188&amp;p=72581#p72581"><![CDATA[
Pomogło faktycznie. Dzięki.<br /><br /><div class="quotetitle">xor napisał(a):</div><div class="quotecontent"><br />Oczywiście delaye w przerwaniu to zły pomysł, ale powiedzmy, w tym przypadku, w celach naukowych, niech będzie <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";-)" title="Puszcza oko" /><br /></div><br /><br />Hmm, no niby tak. Ale docelowo chciałbym wysterować kilka/kilkanaście serw z jednego układu ATMEGA, w którym będą tylko przerwania natomiast program główny będzie pusty. Czy to też wtedy jest tak bardzo niezalecane?<br /><br />Jaka jest alternatywa? PWM?<br />Czy dam radę wysterować kilkanaście serw korzystając z PWM?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2566">frickle</a> — 1 mar 2014, o 13:45</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[xor]]></name></author>
<updated>2014-03-01T12:35:06+01:00</updated>
<published>2014-03-01T12:35:06+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=6188&amp;p=72561#p72561</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=6188&amp;p=72561#p72561"/>
<title type="html"><![CDATA[Re: Sterowanie serwem - dziwny problem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=6188&amp;p=72561#p72561"><![CDATA[
Przyczyną jest być może to że (za <a href="http://www.nongnu.org/avr-libc/user-manual/group__util__delay.html#gab20bfffeacc678cb960944f5519c0c4f"  class="postlink">http://www.nongnu.org/avr-libc/user-manual/group__util__delay.html#gab20bfffeacc678cb960944f5519c0c4f</a>):<br /><div class="quotetitle"><b>Quote:</b></div><div class="quotecontent"><br />The maximal possible delay is 768 us / F_CPU in MHz.<br /><br />If the user requests a delay greater than the maximal possible one, _delay_us() will automatically call _delay_ms() instead. The user will not be informed about this case.<br /></div><br /><br />Poza tym: <br /><div class="quotetitle"><b>Quote:</b></div><div class="quotecontent"><br />In order for these functions to work as intended, compiler optimizations must be enabled, and the delay time must be an expression that is a known constant at compile-time. If these requirements are not met, the resulting delay will be much longer (and basically unpredictable), and applications that otherwise do not use floating-point calculations will experience severe code bloat by the floating-point library routines linked into the application.<br /></div><br /><br />Spróbuj może zrealizować opóźnienie w ten sposób:<br />[syntax=c]for(int us = pozycja;us;us--)<br />   _delay_us(1);[/syntax]<br /><br />Oczywiście delaye w przerwaniu to zły pomysł, ale powiedzmy, w tym przypadku, w celach naukowych, niech będzie <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";-)" title="Puszcza oko" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1774">xor</a> — 1 mar 2014, o 12:35</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Marcin_G]]></name></author>
<updated>2014-03-01T12:29:13+01:00</updated>
<published>2014-03-01T12:29:13+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=6188&amp;p=72560#p72560</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=6188&amp;p=72560#p72560"/>
<title type="html"><![CDATA[Re: Sterowanie serwem - dziwny problem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=6188&amp;p=72560#p72560"><![CDATA[
Serwem się nigdy nie bawiłem, ale z tego co na tym forum wyczytałem to używanie &quot;delaya&quot; w przerwaniu jest ogólnie nie zalecane.<br />Druga rzecz jaka mi się akurat rzuca w oczy, to użycie w pętli głównej _delay_ms();  natomiast w przerwaniu _delay_us(); Dlaczego?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=758">Marcin_G</a> — 1 mar 2014, o 12:29</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[frickle]]></name></author>
<updated>2014-03-01T10:57:35+01:00</updated>
<published>2014-03-01T10:57:35+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=6188&amp;p=72550#p72550</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=6188&amp;p=72550#p72550"/>
<title type="html"><![CDATA[Re: Sterowanie serwem - dziwny problem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=6188&amp;p=72550#p72550"><![CDATA[
REDOX S90<br /><a href="http://forum.atnel.pl/_obrazki/o/2566/63b54903630c2a8acb2bd316f432cfa6.jpg"  class="postlink"><img src="http://forum.atnel.pl/_obrazki/o/thumb/2566/63b54903630c2a8acb2bd316f432cfa6.jpg" alt="Obrazek" /></a><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2566">frickle</a> — 1 mar 2014, o 10:57</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[rayden]]></name></author>
<updated>2014-03-01T10:52:44+01:00</updated>
<published>2014-03-01T10:52:44+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=6188&amp;p=72549#p72549</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=6188&amp;p=72549#p72549"/>
<title type="html"><![CDATA[Re: Sterowanie serwem - dziwny problem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=6188&amp;p=72549#p72549"><![CDATA[
napisz może jakie to serwo konkretnie?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=682">rayden</a> — 1 mar 2014, o 10:52</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[frickle]]></name></author>
<updated>2014-03-01T10:31:06+01:00</updated>
<published>2014-03-01T10:31:06+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=6188&amp;p=72546#p72546</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=6188&amp;p=72546#p72546"/>
<title type="html"><![CDATA[Sterowanie serwem - dziwny problem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=6188&amp;p=72546#p72546"><![CDATA[
Zaczynam zabawę z serwami. Zakupiłem tanie serwo modelarskie i zacząłem bawić się w sterowanie tym dziwadłem. Pierwszy program służący do tego wyglądał mniej więcej tak, że w głównym programie, w pętli załączałem na konkretny czas sygnał na wybrany pin a potem czekałem określony czas, tak aby łącznie czasy sygnału H i L na pinie wynosiły ca. 20ms. <br />[syntax=c]for(int8_t i=0; i&lt;100; i++){<br />     PORTA |= (1&lt;&lt;PA0);<br />     _delay_us(500);<br />     PORTA &amp;= ~(1&lt;&lt;PA0);<br />     _delay_us(19500);<br />}<br /><br />for(int8_t i=0; i&lt;100; i++){<br />     PORTA |= (1&lt;&lt;PA0);<br />     _delay_us(3500);<br />     PORTA &amp;= ~(1&lt;&lt;PA0);<br />     _delay_us(16500);<br />}[/syntax]<br /><br />Sposób siermiężny, ale chodziło o sprawdzenie czy będzie działało. Dodam że wartości opóźnień zostały dobrane doświadczalnie, i cały program miał machać orczykiem z lewa do prawa i z powrotem, co też się udało. Przy tej konfiguracji, serwo zachowało się zgodnie z oczekiwaniami, i kąt obrotu od pozycji minimalnego wychylenia do maksymalnego wynosił z grubsza 180 stopni (tak na prawdę troszeczkę więcej).<br /><br />Aby troszeczkę ładniej to wyglądało, stwierdziłem że trzeba zaprząc do tego przerwania. Pomysł był taki, że będę wykonywał przerwanie co ca. 20 ms a wewnątrz będę generował sygnał o określonej długości (na zasadzie podobnej jak powyżej, z tym że sama częstotliwość wykonywania przerwania, powoduje że wystarczy ustawić stan H na wybranym pinie, odczekać określony czas, np 1500 us, i ustawić na pinie znowu stan L). Kod wygląda z grubsza tak:<br />[syntax=c]volatile int16_t pozycja = 0;<br />volatile int8_t st = 0;<br /><br />int main(void){<br />MCUCR |= (1&lt;&lt;ISC01);<br />MCUCR &amp;= ~(1&lt;&lt;ISC00);<br />GICR |= (1&lt;&lt;INT0);<br /><br />DDRC = (1&lt;&lt;PC0); //ustawienie wyjcia na pin 0 portu C<br /><br />TCCR0 |= (1&lt;&lt;WGM01); //ustawienie trybu pracy timera 0 na CTC ?<br />TCCR0 |= (1&lt;&lt;CS00); //ustawienie prescalera na 1024<br />TCCR0 |= (1&lt;&lt;CS02);<br />OCR0 = 156; //ustawienie rejestru do porównań dla przerwania na timerze 0<br />TIMSK |= (1&lt;&lt;OCIE0);<br /><br />sei(); //globalne zezwolenie na przerwania<br /><br />while(1){<br />pozycja = 500;<br />_delay_ms(500);<br />pozycja = 1000;<br />_delay_ms(500);<br />pozycja = 1500;<br />_delay_ms(500);<br />}<br /><br />}<br /><br />//procedura obsługi przerwania<br />ISR(TIMER0_COMP_vect) {<br />PORTC |= (1&lt;&lt;PC0); //ustawiam stan H na pinie 0 portu C<br />_delay_us(pozycja);<br />PORTC &amp;= ~(1&lt;&lt;PC0); //ustawiam stan L na pinie 0 portu C<br />}[/syntax]<br /><br />Wszystko wydaję się być OK, natomiast przy takim podejściu, serwo wykonuje ruch w zakresie 90 stopni a nie 180. Sprawdziłem wartości rejestrów, wyliczyłem że okres dla przerwania to 20 ms, niby wszystko OK a jednak coś nie bardzo.<br /><br />Być może ktoś z Was miał podobny problem, może po prostu nie zauważam jakiegoś błędu i powielam go za każdym razem, nie mam pojęcia. Proszę o ewentualne naprowadzenie na właściwy tor jeśli gdzieś dałem ciała.<br /><br /><strong>Dodam że pracuję na mikrokontrolerze ATMEGA16A.<br />edit: częstotliwość taktowania: 8 MHz na wewnętrznym oscylatorze.</strong><br /><br />Z góry dzięki za pomoc.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2566">frickle</a> — 1 mar 2014, o 10:31</p><hr />
]]></content>
</entry>
</feed>