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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2014-04-27T18:13:54+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=6885&amp;mode</id>
<entry>
<author><name><![CDATA[Krauser]]></name></author>
<updated>2014-04-27T18:13:54+01:00</updated>
<published>2014-04-27T18:13:54+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=6885&amp;p=79451#p79451</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=6885&amp;p=79451#p79451"/>
<title type="html"><![CDATA[Re: Komunikacja pada PS2 z Atmega8]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=6885&amp;p=79451#p79451"><![CDATA[
void oznacza, że funkcja nie zwraca wartości, a szybkość nie ma nic do tego. Poza tym również funkcję która zwraca wartość można wywołać tak samo jak tą co nie ma return, ale wtedy tracimy informację, którą funkcja przekazuje. Przykładowo jest funkcja bool pad_get_state(), która zwraca 1 gdy komunikacja zakończyła się sukcesem, ale główny wynik tej funkcji to wartości w tablicy <em>tab</em>, które są zamieniane w tej linijce w funkcji pad_cmd:<br />[syntax=c]t&#91;i&#93; = pad_byte(t&#91;i&#93;); //wysłanie kolejnej wartości tablicy funkcją pad_byte i zamiana na otrzymaną odpowiedź[/syntax]<br /><br />Jak w pętli głównej w funkcji main chcesz reagować na zmianę stanu przycisków lub gałek analogowych to może to wyglądać tak:<br />plik main.c<br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &quot;pad.h&quot;<br /><br />#define RY 6 //numer bajtu w tablicy gdzie jest przechowywana informacja o położeniu prawego drążka w osi Y<br />#define LY 8 //numer bajtu w tablicy gdzie jest przechowywana informacja o położeniu lewego drążka w osi Y<br />#define PRZYCISKI2 4 //numer bajtu , gdzie są informacje  przyciskach L2, R2, L1, R1, trójkąt, kółko, krzyżyk, kwadrat<br />#define PRZYCISKI2_TROJKAT (1&lt;&lt;4)<br /><br />#define BUZZER_OUT DDRB |= (1&lt;&lt;0) //ustawienie jako wyjście<br />#define BUZZER_ON PORTB |= (1&lt;&lt;0) //przykładowo do PB.0 można podpiąć sterowanie buzzerem<br />#define BUZZER_OFF PORTB &amp;= ~(1&lt;&lt;0) //przykładowo<br /><br />int main(void)<br />{<br />   pad_init(); //konfiguruje wejścia wyjścia mikrokontrolera oraz konfiguruje ustawienia pada<br />   motors_init(); //konfiguracja wyjść sterujących silnikami<br />   BUZZER_OUT;<br /><br />   while(1)<br />   {<br />      if(pad_get_state()) //jeśli jest komunikacja z padem (to sprawdzenie od razu modyfikuje tablicę tab)<br />      {<br />         left_motor(tab&#91;LY&#93;); //sterowanie drążkiem góra dół jak w czołgu lewym silnikiem<br />         right_motor(tab&#91;RY&#93;); //sterowanie drążkiem góra dół jak w czołgu prawym silnikiem<br />         if( !(tab&#91;PRZYCISKI2&#93; &amp; PRZYCISKI2_TROJKAT) ) //jak przycisk trójkąt wciśnięty (bit 4 wyzerowany)<br />            BUZZER_ON; //klakson<br />         else<br />            BUZZER_OFF;<br />      }<br />   }<br />   return 0;<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=465">Krauser</a> — 27 kwi 2014, o 18:13</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Czaro]]></name></author>
<updated>2014-04-26T21:21:33+01:00</updated>
<published>2014-04-26T21:21:33+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=6885&amp;p=79341#p79341</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=6885&amp;p=79341#p79341"/>
<title type="html"><![CDATA[Re: Komunikacja pada PS2 z Atmega8]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=6885&amp;p=79341#p79341"><![CDATA[
Spoko, trzymaj wiedzę dla siebie :&gt;<br /><br />Co do tych konkretów o których myślałeś to opowiem Ci pewną historię:<br />Mały chłopczyk chcąc nauczyć się jeździć rowerem, najpierw wychodzi z tatą i zaczyna od małego rowerku z dodatkowymi kółkami i tatą trzymającym za siodełko aby synek się nie przewrócił. Rozumiesz? Nie wsiada od razu na BMX-a i nie skacze na hopkach.Tutaj jest to samo, początkujący najpierw potrzebuje kogoś, kto mu 'co nieco' wytłumaczy a dopiero potem jedzie na przykładowe hopki. Tak więc, sterowanie silnikiem już opanowałem. Teraz chcę opanować tą komunikację Pada PS2 z Atmegą aby ostatecznie gdy oba zagadnienia będą w pełni zrozumiałe połączyć je ze sobą i stworzyć taki model. Dodam również, że wykonałem przykład z tej strony <a href="http://hobby.abxyz.bplaced.net/index.php?pid=3&amp;aid=17"  class="postlink">http://hobby.abxyz.bplaced.net/index.php?pid=3&amp;aid=17</a> i w pełni mi ta komunikacja działała, więc nie wiem czemu uważasz ten przykład za słaby skoro można na nim się czegoś nauczyć?<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 9 minutach ]</span></strong><br /><br />Dzięki <strong>Krauser</strong> - dokładnie o taką analizę mi chodziło, oby jak najwięcej takich osób na forum. Teraz na spokojnie muszę przeanalizować to co wstawiłeś i kto wie, może zaraz sam kolejną część opiszę <img src="https://forum.atnel.pl/images/smilies/icon_e_biggrin.gif" alt=":D" title="Bardzo szczęśliwy" /> Po kawałeczku aż do celu, pozdrawiam!<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 48 minutach ]</span></strong><br /><br />[syntax=c]void pad_cmd(unsigned char t&#91;&#93;,unsigned char n) // funkcja na zasadzie jak powyżej + void aby można ją było później szybko wywołać np: za pomocą linijki pad_cmd(tab, 5);<br />{<br />   unsigned char i;<br />   ATT_CLR; // ustawienie 0<br /> <br />   for(i=0; i&lt;n; i++) // pętla od i = 0 do (n-1) , i zwieksza się o jeden<br />      t&#91;i&#93; = pad_byte(t&#91;i&#93;); // tu strzelam, że element tabeli określony przez 'i' równa się wywołanie funkcji pad_byte<br /> <br />   ATT_SET; // ustawienie 1<br />   _delay_us(50); / opóźnienie<br />}[/syntax]<br /><br />Mniej więcej tak ?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2587">Czaro</a> — 26 kwi 2014, o 21:21</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Krauser]]></name></author>
<updated>2014-04-26T21:26:38+01:00</updated>
<published>2014-04-26T21:18:30+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=6885&amp;p=79340#p79340</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=6885&amp;p=79340#p79340"/>
<title type="html"><![CDATA[Re: Komunikacja pada PS2 z Atmega8]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=6885&amp;p=79340#p79340"><![CDATA[
<div class="quotetitle">Czaro napisał(a):</div><div class="quotecontent"><br />Linią COMMAND plastation przesyła komendy do kontrolera. Czy dobrze rozumiem, że:<br />1 linijka rozpoczyna przesyłanie i ustawia 4 bit na porcie C jako wejście z podciągnięciem do VCC ?<br />2 linijka, CMD_CLR co właściwie oznacza i robi?<br />3 linijka kończy wysyłanie i ustawia PC4 jako wyjście?<br /></div><br />To tylko makra i w kodzie kolejność jest inna, a jak CMD skonfigurujesz jako wyjście to 1 linijka ustawia 1, a druga 0 na tym wyjściu.<br />Jak w tej funkcji:<br />[syntax=c]void pad_init(void)<br />{<br />    CMD_DIR_OUT; //konfiguracja jako wyjście<br />    ATT_DIR_OUT; //konfiguracja jako wyjście<br />    CLK_DIR_OUT; //konfiguracja jako wyjście<br />       <br />        DATA_DIR_IN; //konfiguracja jako wejście<br /> <br />    ATT_SET; //stan początkowy 1<br />    CLK_SET; //stan początkowy 1<br />    CMD_SET; //stan początkowy 1<br />       <br />        pad_config(); //wywołanie funkcji<br />}[/syntax]<br />Kolejna kluczowa funkcja:<br />[syntax=c]// Wysyła/odczytuje jeden bajt do/z gamepada<br />unsigned char pad_byte(unsigned char byte)<br />{<br />   unsigned char i,r=0;<br /> <br />   for(i=0; i&lt;8; i++, byte&gt;&gt;=1) //po każdym obiegu pętli od i = 0 do 7 byte jest przesuwany w prawo o 1 pozycję<br />   {          <br />       CLK_CLR; //ustawienie 0<br />       if(byte&amp; 0x01) CMD_SET; else CMD_CLR;      //jak o numerze 0 bit zmiennej byte jest równy 1 to ustawienie 1 na wyjściu CMD, a w przeciwnym razie to 0<br />       _NOP_;    //opóźnienie<br />       CLK_SET; //ustawienie 1<br />       r&gt;&gt;=1; //przesuniecie zmiennej r w prawo o jedną pozycję<br />       if(DATA_IN) r|=0x80; //jak na wejściu DATA jest 1 to bit o numerze 7 zmiennej r jest ustawiany na 1, a w przeciwnym razie zostaje 0<br />   }<br />   CMD_SET; //ustawienie 1<br />   _delay_us(20); //opóźnienie<br />   return r;  //zwrócenie pobranego bajtu<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=465">Krauser</a> — 26 kwi 2014, o 21:18</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[xor]]></name></author>
<updated>2014-04-26T21:02:26+01:00</updated>
<published>2014-04-26T21:02:26+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=6885&amp;p=79336#p79336</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=6885&amp;p=79336#p79336"/>
<title type="html"><![CDATA[Re: Komunikacja pada PS2 z Atmega8]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=6885&amp;p=79336#p79336"><![CDATA[
Aha. Myślałem, że chodzi ci o konkrety, a to ma być takie jakby case study. <br />No cóż, IMHO ten kod to słabizna i raczej szkoda na niego czasu. Sory, naprawdę chciałem coś tam napisać, ale...no nie...<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1774">xor</a> — 26 kwi 2014, o 21:02</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Czaro]]></name></author>
<updated>2014-04-26T19:46:14+01:00</updated>
<published>2014-04-26T19:46:14+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=6885&amp;p=79300#p79300</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=6885&amp;p=79300#p79300"/>
<title type="html"><![CDATA[Re: Komunikacja pada PS2 z Atmega8]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=6885&amp;p=79300#p79300"><![CDATA[
Przeglądałem już wielokrotnie tą stronę co podałeś, schemat połączenia jest mi znany, natomiast protokół komunikacji już nie do końca. Wolałbym się teraz skupić na tym fragmencie kodu co podałem powyżej <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br />Zacznijmy od &quot;pad.h&quot;<br /><br />[syntax=c]#define CMD_SET PORTC |= (1&lt;&lt;4)<br />#define CMD_CLR PORTC &amp;= ~(1&lt;&lt;4)<br />#define CMD_DIR_OUT DDRC |= (1&lt;&lt;4)[/syntax]<br />Linią COMMAND plastation przesyła komendy do kontrolera. Czy dobrze rozumiem, że:<br />1 linijka rozpoczyna przesyłanie i ustawia 4 bit na porcie C jako wejście z podciągnięciem do VCC ?<br />2 linijka, CMD_CLR co właściwie oznacza i robi?<br />3 linijka kończy wysyłanie i ustawia PC4 jako wyjście?  <br /><br />[syntax=c]extern unsigned char tab&#91;9&#93;;[/syntax]<br />Tutaj tworzymy tabele składającą się z 9 elementów znakowych, zakres od 0 do 255,<br /><br />[syntax=c]#define _NOP_ asm volatile(&quot;nop\n\t&quot;&quot;nop\n\t&quot; &quot;nop\n\t&quot; &quot;nop\n\t&quot; ::)[/syntax]<br />Krótkie opóźnienie - dokładniej wstawka z asemblera<br /><br />Opisze ktoś teraz &quot;pad.c&quot; ?<br />Może być podobnie jak powyżej z pytaniami aż w końcu kawałeczek po kawałeczku to rozkminimy, a dodatkowo może każdy z nas się czegoś nauczy <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=2587">Czaro</a> — 26 kwi 2014, o 19:46</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[xor]]></name></author>
<updated>2014-04-26T18:49:13+01:00</updated>
<published>2014-04-26T18:49:13+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=6885&amp;p=79272#p79272</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=6885&amp;p=79272#p79272"/>
<title type="html"><![CDATA[Re: Komunikacja pada PS2 z Atmega8]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=6885&amp;p=79272#p79272"><![CDATA[
Protokół komunikacji z padem PS2 i połączenie drutów: <a href="http://store.curiousinventor.com/guides/PS2"  class="postlink">http://store.curiousinventor.com/guides/PS2</a>. <br />Dobra biblioteka, ale na Arduino: <a href="http://www.billporter.info/2010/06/05/playstation-2-controller-arduino-library-v1-0/"  class="postlink">http://www.billporter.info/2010/06/05/playstation-2-controller-arduino-library-v1-0/</a><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1774">xor</a> — 26 kwi 2014, o 18:49</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[KoWaL]]></name></author>
<updated>2014-04-26T18:27:57+01:00</updated>
<published>2014-04-26T18:27:57+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=6885&amp;p=79268#p79268</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=6885&amp;p=79268#p79268"/>
<title type="html"><![CDATA[Re: Komunikacja pada PS2 z Atmega8]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=6885&amp;p=79268#p79268"><![CDATA[
Też chętnie podepnę się pod temat <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=2114">KoWaL</a> — 26 kwi 2014, o 18:27</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Czaro]]></name></author>
<updated>2014-04-26T13:38:34+01:00</updated>
<published>2014-04-26T13:38:34+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=6885&amp;p=79192#p79192</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=6885&amp;p=79192#p79192"/>
<title type="html"><![CDATA[Komunikacja pada PS2 z Atmega8]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=6885&amp;p=79192#p79192"><![CDATA[
Siemka, <br />pomożecie mi zrozumieć na podstawie poniższego kodu jak odbywa się taka komunikacja? Wiem, że opisanie działania tych linijek zajmie sporo czasu ale może znajdzie się dobra dusza, która się tego podejmie.<br /> Z góry dzięki <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> <br /><br /> [syntax=c]pad.h<br /> <br />#include &lt;avr/io.h&gt;<br />#include &lt;util/delay.h&gt;<br /> <br />// CMD - wyjście<br />#define CMD_SET PORTC |= (1&lt;&lt;4)<br />#define CMD_CLR PORTC &amp;= ~(1&lt;&lt;4)<br />#define CMD_DIR_OUT DDRC |= (1&lt;&lt;4)<br />// ATT - wyjście<br />#define ATT_SET PORTC |= (1&lt;&lt;5)<br />#define ATT_CLR PORTC &amp;= ~(1&lt;&lt;5)<br />#define ATT_DIR_OUT DDRC |= (1&lt;&lt;5)<br />// DATA - wejście<br />#define DATA_DIR_IN DDRC &amp;= ~(1&lt;&lt;2)<br />#define DATA_IN    (PINC&amp;(1&lt;&lt;2))<br />// CLK - wyjście<br />#define CLK_SET PORTC |= (1&lt;&lt;3)<br />#define CLK_CLR PORTC &amp;= ~(1&lt;&lt;3)<br />#define CLK_DIR_OUT DDRC |= (1&lt;&lt;3)<br /> <br />extern unsigned char tab&#91;9&#93;;<br />void pad_init(void);<br />void pad_cmd(unsigned char t&#91;&#93;,unsigned char n);<br />bool pad_get_state();<br />void pad_loop();<br /> <br />pad.c:<br /> <br />#include &quot;pad.h&quot;<br /> <br />// Krotkie opóźnienie<br />#define _NOP_ asm volatile(&quot;nop\n\t&quot;&quot;nop\n\t&quot; &quot;nop\n\t&quot; &quot;nop\n\t&quot; ::)<br /> <br />unsigned char tab&#91;9&#93;;<br /> <br />// Wysyła/odczytuje jeden bajt do/z gamepada<br />unsigned char pad_byte(unsigned char byte)<br />{<br />   unsigned char i,r=0;<br /> <br />   for(i=0; i&lt;8; i++, byte&gt;&gt;=1)<br />   {           <br />       CLK_CLR;<br />       if(byte&amp; 0x01) CMD_SET; else CMD_CLR;       <br />       _NOP_;    <br />       CLK_SET;<br />       r&gt;&gt;=1;<br />       if(DATA_IN) r|=0x80;<br />   }<br />   CMD_SET;<br />   _delay_us(20);<br />   return r;  <br />}<br /> <br />void pad_cmd(unsigned char t&#91;&#93;,unsigned char n)<br />{<br />   unsigned char i;<br />   ATT_CLR;<br /> <br />   for(i=0; i&lt;n; i++)<br />      t&#91;i&#93; = pad_byte(t&#91;i&#93;);<br /> <br />   ATT_SET;<br />   _delay_us(50);<br />}<br /> <br />void pad_config(void)<br />{<br />   // Komenda 0x43 &quot;Go into configuration mode&quot;<br />   tab&#91;0&#93;= 0x01;<br />   tab&#91;1&#93;= 0x43;<br />   tab&#91;2&#93;= 0x00;<br />   tab&#91;3&#93;= 0x01;<br />   tab&#91;4&#93;= 0x00;<br />   pad_cmd(tab, 5);<br /> <br />   // Komenda 0x44 &quot;Turn on analog mode&quot;<br />   tab&#91;0&#93;= 0x01;<br />   tab&#91;1&#93;= 0x44;<br />   tab&#91;2&#93;= 0x00;<br />   tab&#91;3&#93;= 0x01;<br />   tab&#91;4&#93;= 0x03; <br />   tab&#91;5&#93;= 0x00;<br />   tab&#91;6&#93;= 0x00;<br />   tab&#91;7&#93;= 0x00;<br />   tab&#91;8&#93;= 0x00;<br />   pad_cmd(tab, 9);<br /> <br />   // Komenda 0x43 &quot;Exit config mode&quot;, niekonieczna, gdyż 0x42 automatycznie wychodzi z config mode<br />   tab&#91;0&#93; = 0x01;<br />   tab&#91;1&#93; = 0x43;<br />   tab&#91;2&#93; = 0x00;<br />   tab&#91;3&#93; = 0x00;<br />   tab&#91;4&#93; = 0x5A;<br />   tab&#91;5&#93; = 0x5A;<br />   tab&#91;6&#93; = 0x5A;<br />   tab&#91;7&#93; = 0x5A;<br />   tab&#91;8&#93; = 0x5A;<br />   pad_cmd(tab, 9);<br />}<br /> <br />void pad_init(void)<br />{<br />    CMD_DIR_OUT;<br />    ATT_DIR_OUT;<br />    CLK_DIR_OUT;<br />       <br />        DATA_DIR_IN;<br /> <br />    ATT_SET;<br />    CLK_SET;<br />    CMD_SET;<br />       <br />        pad_config();<br />}<br /> <br />bool pad_get_state()<br />{<br />        // komenda 0x42 - Controller poll<br />      tab&#91;0&#93; = 0x01;<br />      tab&#91;1&#93; = 0x42;<br />      tab&#91;2&#93; = 0x00;<br /> <br />      tab&#91;3&#93; = 0x00; // przyciski<br />      tab&#91;4&#93; = 0x00; // przyciski<br />      tab&#91;5&#93; = 0x00; // dżojstik prawy  lewo-prawo<br />      tab&#91;6&#93; = 0x00; // dżojstik prawy  góra-dół<br />      tab&#91;7&#93; = 0x00; // dżojstik lewy   lewo-prawo<br />      tab&#91;8&#93; = 0x00; // dżojstik lewy   gora-dół<br />          pad_cmd(tab, 9);<br />          // analogi w stanie spocczynkowym (na środku) zwracają 0b10000000 = 128, góra = 0, lewo = 0, dół = 255, prawo = 255<br />         <br />          return (tab&#91;0&#93; == 255 &amp;&amp; tab&#91;1&#93; == 115);              //zwracamy czy komunikacja zakończyła się sukcesesm<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2587">Czaro</a> — 26 kwi 2014, o 13:38</p><hr />
]]></content>
</entry>
</feed>