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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2013-11-27T13:56:28+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=3328&amp;mode</id>
<entry>
<author><name><![CDATA[The River]]></name></author>
<updated>2013-11-27T13:56:28+01:00</updated>
<published>2013-11-27T13:56:28+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3328&amp;p=58725#p58725</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3328&amp;p=58725#p58725"/>
<title type="html"><![CDATA[Re: SPI - Sprzętowa obsługa master &lt;-&gt; slave]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3328&amp;p=58725#p58725"><![CDATA[
Dzięki faktycznie jest tam poruszany ten problem.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=508">The River</a> — 27 lis 2013, o 13:56</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[The River]]></name></author>
<updated>2013-11-27T11:51:39+01:00</updated>
<published>2013-11-27T11:51:39+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3328&amp;p=58718#p58718</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3328&amp;p=58718#p58718"/>
<title type="html"><![CDATA[Re: SPI - Sprzętowa obsługa master &lt;-&gt; slave]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3328&amp;p=58718#p58718"><![CDATA[
Witam<br /><br />Podobnie jak kolega Jeżyk-1 robię transmisję przez SPI pomiędzy dwoma w moim przypadku atmegami (32 i 48). Linie MISO, MOSI i SCK połączyłem bezpośrednio ze sobą bez żadnych rezystorów i mam taki problem że programując programatorem USBasp z wykorzystaniem ISP musze rozłączyć połączenie między atmegą32 i atmegą48 bo inaczej programator nie wykrywa żadnego z nich. Przy programowaniu prototypu to nie był jakiś wielki problem, ale teraz chcę to zmontować w jeden obwód drukowany więc nie będzie fizycznej możliwości rozłączenia tego połączenia, no chyba że jakimiś zworkami, innego pomysłu nie mam. Próbowałem linie łączyć jak kolega wyżej miał na schemacie, rezystorami 2,2k ale to nic nie dało. Może ktoś podpowie coś ? Czy po prostu to musi być rozłączone i nie ma innej opcji.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=508">The River</a> — 27 lis 2013, o 11:51</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Jeżyk-1]]></name></author>
<updated>2013-06-16T11:52:17+01:00</updated>
<published>2013-06-16T11:52:17+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3328&amp;p=39394#p39394</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3328&amp;p=39394#p39394"/>
<title type="html"><![CDATA[Re: SPI - Sprzętowa obsługa master &lt;-&gt; slave]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3328&amp;p=39394#p39394"><![CDATA[
No dużo ładniej to wygląda <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br />Dziękuje za poradę <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br />Pozdrawiam.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=493">Jeżyk-1</a> — 16 cze 2013, o 11:52</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[jacekk232]]></name></author>
<updated>2013-06-16T11:47:54+01:00</updated>
<published>2013-06-16T11:47:54+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3328&amp;p=39393#p39393</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3328&amp;p=39393#p39393"/>
<title type="html"><![CDATA[Re: SPI - Sprzętowa obsługa master &lt;-&gt; slave]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3328&amp;p=39393#p39393"><![CDATA[
Myślałem nad czymś takim<br />[syntax=c]uint8_t TransferSpi(uint8_t bajt, uint8_t which_slave) {<br />        if (which_slave == 1) CS1_0;<br />        else if (which_slave == 2) CS2_0;<br />        <br />        SPDR = bajt;<br />        while (!(SPSR &amp; (1 &lt;&lt; SPIF)));<br />        return SPDR;<br />        <br />        if (which_slave == 1) CS1_1;<br />        else if (which_slave == 2) CS2_1;        <br /><br />}[/syntax]<br />Pisane z głowy. Nietestowane.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=204">jacekk232</a> — 16 cze 2013, o 11:47</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Jeżyk-1]]></name></author>
<updated>2013-06-16T11:20:59+01:00</updated>
<published>2013-06-16T11:20:59+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3328&amp;p=39391#p39391</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3328&amp;p=39391#p39391"/>
<title type="html"><![CDATA[Re: SPI - Sprzętowa obsługa master &lt;-&gt; slave]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3328&amp;p=39391#p39391"><![CDATA[
Np coś takiego:<br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;avr/pgmspace.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &quot;lcd.h&quot;<br /><br />#define MASTER 0        //jeżeli master to 1, jeżeli slave to 0<br />#if MASTER ==1<br /><br />#define MOSI PB5<br />#define MISO PB6<br />#define SCK PB7<br />#define CS1 PB4<br />#define CS2 PB3<br />#define CS1_0 PORTB &amp;= ~(1&lt;&lt;CS1)<br />#define CS1_1 PORTB |= (1&lt;&lt;CS1)<br />#define CS2_0 PORTB &amp;= ~(1&lt;&lt;CS2)<br />#define CS2_1 PORTB |= (1&lt;&lt;CS2)<br /><br />//deklaracja funkcji:<br />void InitSpiMaster(void);<br />uint8_t TransferSpi(uint8_t which_slave);<br /><br />int main(void) {<br />DDRC |= (1 &lt;&lt; PC1); //podświetlenie LCD<br />PORTC |= (1 &lt;&lt; PC1);<br />lcd_init(); //inicjalizacja wyświetlacza<br />InitSpiMaster(); //inicjalizacja SPI<br />lcd_locate(1, 0);<br />lcd_str(&quot;M&quot;);<br />uint8_t cnt1 = 0;//definicj zmiennej licznika cnt1<br /><br />while (1) {<br /><br />cnt1++;//zwiększane wastości licznika do 99<br />if (cnt1 == 99)<br />cnt1 = 0;<br /><br /><br />lcd_cls();<br />lcd_locate(1, 2);<br />lcd_str(&quot;W1:&quot;);<br />lcd_int(cnt1); //Wyświetlenie wartości cnt na LCD<br /><br />lcd_locate(0, 9);<br />lcd_str(&quot;O1:&quot;);<br />lcd_int(TransferSpi(1)); //Wyświetlenie wartości danych z slave 1<br /><br />lcd_locate(1, 9);<br />lcd_str(&quot;O2:&quot;);<br />lcd_int(TransferSpi(2)); //Wyświetlenie wartości danych z slave 2<br /><br />_delay_ms(400);<br />}<br />}<br />//inicjalizacja SPI<br />void InitSpiMaster(void) {<br />CS1_1;//stan wysoki na lini CS1<br />CS2_1;//stan wysoki na lini CS2<br />//ustawienie kierunku wyjściowego dla linii MOSI, SCK, CS1 i CS2<br />DDRB |= (1 &lt;&lt; MOSI) | (1 &lt;&lt; SCK) | (1 &lt;&lt; CS1) | (1 &lt;&lt; CS2);<br />//ustawienia kierunku wejścia dla lini MISO<br />DDRB &amp;= ~(1 &lt;&lt; MISO);<br />// aktywacja  SPI, tryb pracy Master, prędkość zegara Fosc/128<br />SPCR |= (1 &lt;&lt; SPE) | (1 &lt;&lt; MSTR) | (1 &lt;&lt; SPR1) | (1 &lt;&lt; SPR0);<br />}<br /><br />uint8_t TransferSpi(uint8_t which_slave) {<br />if(which_slave == 1){<br />CS1_0;<br />SPDR = 0;<br />while (!(SPSR &amp; (1 &lt;&lt; SPIF)));<br />CS1_1;<br />which_slave =2;<br />return SPDR;<br />}<br />else if(which_slave == 2){<br />CS2_0;<br />SPDR = 0;<br />while (!(SPSR &amp; (1 &lt;&lt; SPIF)));<br />CS2_1;<br />which_slave =1;<br />return SPDR;<br />}<br />else return 0;<br />}<br /><br />#endif<br /><br />//-----------------------------SLAVE<br /><br />#if MASTER == 0<br /><br />#define MOSI PB5<br />#define MISO PB6<br />#define SCK PB7<br />#define CS1 PB4<br />//deklaracja funkcji:<br />void InitSpiSlave(void);<br />volatile uint8_t byte;//definicja zmiennej byte<br />volatile uint8_t cnt =0; //definicja zmiennej licznika cnt<br />int main(void) {<br /><br />DDRC |= (1&lt;&lt;PC1); //Podświetlenie LCD<br />PORTC |= (1&lt;&lt;PC1);<br />lcd_init(); //inicjalizacja wyświetlacza<br />InitSpiSlave(); // inicjalizacja SPI<br />sei();//przerwanie globalne<br />lcd_locate(1, 0);<br />lcd_str(&quot;Slave 1&quot;); //wyświetlenie napisu<br /><br /><br />while(1) {<br />_delay_ms(500);<br /><br />uint8_t dane = byte;//Przepisane danych<br /><br />cnt=cnt+2; //Dodanie wartości licznika slave1 +2 slave2 +3<br />if (cnt&gt;=99) cnt=0; //jeżeli licznik ==99 zeruje zmienną cnt<br /><br />lcd_locate(0,0);<br />lcd_str(&quot;W:&quot;);<br />lcd_int( cnt ); //Wyświetlenie wartości licznika na LCD<br /><br />lcd_locate(10,0);<br />lcd_str(&quot;O:&quot;);<br />lcd_int(dane); //wyświetlenie odebranych danych<br /><br />}<br /><br />}<br /><br />void InitSpiSlave(void) {<br />// ustawienie kierunku wyjściowego dla linii MOSI<br />DDRB |= (1&lt;&lt;MISO);<br />//ustwienie kierunku wejściowego dla CS1, MOSI, SCK<br />DDRB &amp;= ~(1&lt;&lt;CS1) &amp; ~(1&lt;&lt;MOSI) &amp; ~(1&lt;&lt;SCK);<br />// aktywacja  SPI, tryb pracy SLAVE,<br />SPCR |= (1&lt;&lt;SPE) | (1&lt;&lt;SPIE);<br />}<br />//przerwanie SPI<br />ISR(SPI_STC_vect)<br />{<br />byte = SPDR;<br />SPDR = cnt;<br />}<br /><br />#endif[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=493">Jeżyk-1</a> — 16 cze 2013, o 11:20</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[jacekk232]]></name></author>
<updated>2013-06-16T10:24:43+01:00</updated>
<published>2013-06-16T10:24:43+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3328&amp;p=39387#p39387</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3328&amp;p=39387#p39387"/>
<title type="html"><![CDATA[Re: SPI - Sprzętowa obsługa master &lt;-&gt; slave]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3328&amp;p=39387#p39387"><![CDATA[
Jeśli układy slave mają wysyłać dane do mastera to mogą to mogą odbierać od mastera same zera. Nic temu nie przeszkadza.<br /><br />Jak ja bawiłem się SPI to master wysyłał dane do slava, a slave w funkcji odbiorczej odbierał dane i wysyłał pusty bajt do mastera.<br /><br />Tak na gorąco to zmienił bym w kodzie od mastera funkcję TransferSpi. Zamiast dwóch osobnych funkcji zrobił bym jedną. A za pomocą argumentów przekazywanych do niej można by wybierać do którego procka przeznaczone są dane. <br />No chyba, że te dwie funkcje zastosowałeś na czas testów.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=204">jacekk232</a> — 16 cze 2013, o 10:24</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Jeżyk-1]]></name></author>
<updated>2013-06-16T10:11:02+01:00</updated>
<published>2013-06-16T10:11:02+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3328&amp;p=39385#p39385</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3328&amp;p=39385#p39385"/>
<title type="html"><![CDATA[Re: SPI - Sprzętowa obsługa master &lt;-&gt; slave]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3328&amp;p=39385#p39385"><![CDATA[
Wykonałem kod odbioru danych od dwóch slave który wygląda na to że działa.<br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;avr/pgmspace.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &quot;lcd.h&quot;<br /><br />#define MASTER 1        //jeżeli master to 1, jeżeli slave to 0<br />#if MASTER ==1<br /><br />#define MOSI PB5<br />#define MISO PB6<br />#define SCK PB7<br />#define CS1 PB4<br />#define CS2 PB3<br />#define CS1_0 PORTB &amp;= ~(1&lt;&lt;CS1)<br />#define CS1_1 PORTB |= (1&lt;&lt;CS1)<br />#define CS2_0 PORTB &amp;= ~(1&lt;&lt;CS2)<br />#define CS2_1 PORTB |= (1&lt;&lt;CS2)<br /><br />//deklaracja funkcji:<br />void InitSpiMaster(void);<br />uint8_t TransferSpi1(uint8_t byte);<br />uint8_t TransferSpi2(uint8_t byte);<br /><br />int main(void) {<br />DDRC |= (1 &lt;&lt; PC1); //podświetlenie LCD<br />PORTC |= (1 &lt;&lt; PC1);<br />lcd_init(); //inicjalizacja wyświetlacza<br />InitSpiMaster(); //inicjalizacja SPI<br />lcd_locate(1, 0);<br />lcd_str(&quot;M&quot;);<br />uint8_t cnt1 = 0;//definicj zmiennej licznika cnt1<br /><br />while (1) {<br /><br />cnt1++;//zwiększane wastości licznika do 99<br />if (cnt1 == 99)<br />cnt1 = 0;<br /><br />uint8_t dane;//zmienna &quot;dane&quot; która będzie zawierać dane przesyłane od slave 1<br />uint8_t dane2;//zmienna &quot;dane&quot; która będzie zawierać dane przesyłane od slave 2<br />CS1_0;//stan niski na lini CS1<br />//TransferSpi1(); //Wysłanie wartości zmiennej<br />dane = TransferSpi1(0); //odbieranie dany z slave 1<br />CS1_1;//stan wysoki na lini CS1<br /><br />CS2_0;//stan niski na lini CS2<br />//TransferSpi1(); //Wysłanie wartości zmiennej<br />dane2 = TransferSpi2(0); //odbieranie danych z slave 2<br />CS2_1;//stan wysoki na lini CS2<br />lcd_cls();<br />lcd_locate(1, 2);<br />lcd_str(&quot;W1:&quot;);<br />lcd_int(cnt1); //Wyświetlenie wartości cnt na LCD<br /><br />lcd_locate(0, 9);<br />lcd_str(&quot;O1:&quot;);<br />lcd_int(dane); //Wyświetlenie wartości danych z slave 1<br /><br />lcd_locate(1, 9);<br />lcd_str(&quot;O2:&quot;);<br />lcd_int(dane2); //Wyświetlenie wartości danych z slave 2<br /><br />_delay_ms(400);<br />}<br />}<br />//inicjalizacja SPI<br />void InitSpiMaster(void) {<br />CS1_1;//stan wysoki na lini CS1<br />CS2_1;//stan wysoki na lini CS2<br />//ustawienie kierunku wyjściowego dla linii MOSI, SCK, CS1 i CS2<br />DDRB |= (1 &lt;&lt; MOSI) | (1 &lt;&lt; SCK) | (1 &lt;&lt; CS1) | (1 &lt;&lt; CS2);<br />//ustawienia kierunku wejścia dla lini MISO<br />DDRB &amp;= ~(1 &lt;&lt; MISO);<br />// aktywacja  SPI, tryb pracy Master, prędkość zegara Fosc/128<br />SPCR |= (1 &lt;&lt; SPE) | (1 &lt;&lt; MSTR) | (1 &lt;&lt; SPR1) | (1 &lt;&lt; SPR0);<br />}<br /><br />uint8_t TransferSpi1(uint8_t byte) {<br />SPDR = byte;<br />while (!(SPSR &amp; (1 &lt;&lt; SPIF)))<br />;<br />return SPDR;<br />}<br />// definicja funkcji odbioru i wysłaniu do slave2<br />uint8_t TransferSpi2(uint8_t byte) {<br />SPDR = byte;<br />while (!(SPSR &amp; (1 &lt;&lt; SPIF)))<br />;<br />return SPDR;<br />}<br /><br />#endif<br /><br />//-----------------------------SLAVE<br /><br />#if MASTER == 0<br /><br />#define MOSI PB5<br />#define MISO PB6<br />#define SCK PB7<br />#define CS1 PB4<br />//deklaracja funkcji:<br />void InitSpiSlave(void);<br />volatile uint8_t byte;//definicja zmiennej byte<br />volatile uint8_t cnt =0; //definicja zmiennej licznika cnt<br />int main(void) {<br /><br />DDRC |= (1&lt;&lt;PC1); //Podświetlenie LCD<br />PORTC |= (1&lt;&lt;PC1);<br />lcd_init(); //inicjalizacja wyświetlacza<br />InitSpiSlave(); // inicjalizacja SPI<br />sei();//przerwanie globalne<br />lcd_locate(1, 0);<br />lcd_str(&quot;Slave 2&quot;); //wyświetlenie napisu<br /><br /><br />while(1) {<br />_delay_ms(500);<br /><br />uint8_t dane = byte;//Przepisane danych<br /><br />cnt=cnt+3; //Dodanie wartości licznika slave1 +2 slave2 +3<br />if (cnt&gt;=99) cnt=0; //jeżeli licznik ==99 zeruje zmienną cnt<br /><br />lcd_locate(0,0);<br />lcd_str(&quot;W:&quot;);<br />lcd_int( cnt ); //Wyświetlenie wartości licznika na LCD<br /><br />lcd_locate(10,0);<br />lcd_str(&quot;O:&quot;);<br />lcd_int(dane); //wyświetlenie odebranych danych<br /><br />}<br /><br />}<br /><br />void InitSpiSlave(void) {<br />// ustawienie kierunku wyjściowego dla linii MOSI<br />DDRB |= (1&lt;&lt;MISO);<br />//ustwienie kierunku wejściowego dla CS1, MOSI, SCK<br />DDRB &amp;= ~(1&lt;&lt;CS1) &amp; ~(1&lt;&lt;MOSI) &amp; ~(1&lt;&lt;SCK);<br />// aktywacja  SPI, tryb pracy SLAVE,<br />SPCR |= (1&lt;&lt;SPE) | (1&lt;&lt;SPIE);<br />}<br />//przerwanie SPI<br />ISR(SPI_STC_vect)<br />{<br />byte = SPDR;<br />SPDR = cnt;<br />}<br /><br />#endif[/syntax]<br /><br />Tylko mnie zastanawia czy to jest prawidłowo zrobione ?<br />Głównie mi zależało na odbieraniu danych od układów slave, dlatego slave może odbierać zero.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=493">Jeżyk-1</a> — 16 cze 2013, o 10:11</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[jacekk232]]></name></author>
<updated>2013-06-16T10:06:35+01:00</updated>
<published>2013-06-16T10:06:35+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3328&amp;p=39384#p39384</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3328&amp;p=39384#p39384"/>
<title type="html"><![CDATA[Re: SPI - Sprzętowa obsługa master &lt;-&gt; slave]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3328&amp;p=39384#p39384"><![CDATA[
Wydaje mi się, że drugi sposób powinien być dobry. SPI to magistrala dwukierunkowa. Więc slave, w czasie odczytu danych z mastera, jednocześnie zapisuje dane do rejestru wyjściowego SPDR. I te dane zostaną wysłane do mastera wtedy gdy master będzie wysyłał cokolwiek do slava. Master, w czasie odbioru danych z slava, nie musi wysyłać konkretnych danych. Może wysyłać np. same zera.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=204">jacekk232</a> — 16 cze 2013, o 10:06</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Jeżyk-1]]></name></author>
<updated>2013-06-16T05:48:45+01:00</updated>
<published>2013-06-16T05:48:45+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3328&amp;p=39379#p39379</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3328&amp;p=39379#p39379"/>
<title type="html"><![CDATA[Re: SPI - Sprzętowa obsługa master &lt;-&gt; slave]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3328&amp;p=39379#p39379"><![CDATA[
No tak Tu był pies pogrzebany. <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br />Zmieniłem te rezystory na 2k2 i u mnie też działa. <br />Mam teraz kolejne pytanie, by wysłać coś do master jak to prawidłowo zrobić ?<br />W przerwaniu muszę zastosować opóźnienie tego typu:<br />[syntax=c]while (!(SPSR &amp; (1 &lt;&lt; SPIF)));[/syntax]<br />czy wystarczy jak zrobię tak:<br />[syntax=c]ISR(SPI_STC_vect)<br />    {<br />            bajt_o = SPDR;<br />            SPDR = cnt;<br />    }[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=493">Jeżyk-1</a> — 16 cze 2013, o 05:48</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[jacekk232]]></name></author>
<updated>2013-06-15T20:38:31+01:00</updated>
<published>2013-06-15T20:38:31+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3328&amp;p=39355#p39355</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3328&amp;p=39355#p39355"/>
<title type="html"><![CDATA[Re: SPI - Sprzętowa obsługa master &lt;-&gt; slave]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3328&amp;p=39355#p39355"><![CDATA[
A spróbuj dwie atmegi połączyć bezpośrednio, czyli pomjając te rezystory 4,7k. Bo z tego co widzę to przy takim połączeniu oba procki są połączone przez 2 rezystory co daję ok. 9,5k. Może tu tkwi problem?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=204">jacekk232</a> — 15 cze 2013, o 20:38</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Jeżyk-1]]></name></author>
<updated>2013-06-15T20:22:13+01:00</updated>
<published>2013-06-15T20:22:13+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3328&amp;p=39351#p39351</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3328&amp;p=39351#p39351"/>
<title type="html"><![CDATA[Re: SPI - Sprzętowa obsługa master &lt;-&gt; slave]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3328&amp;p=39351#p39351"><![CDATA[
To co może być nie tak. <br />Mam taki schemat :<br /><a href="http://forum.atnel.pl/_obrazki/o/493/15b4abc0645baaa4328f3c2b6e6893a0.png"  class="postlink"><img src="http://forum.atnel.pl/_obrazki/o/thumb/493/15b4abc0645baaa4328f3c2b6e6893a0.png" alt="Obrazek" /></a><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=493">Jeżyk-1</a> — 15 cze 2013, o 20:22</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[jacekk232]]></name></author>
<updated>2013-06-15T20:07:15+01:00</updated>
<published>2013-06-15T20:07:15+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3328&amp;p=39349#p39349</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3328&amp;p=39349#p39349"/>
<title type="html"><![CDATA[Re: SPI - Sprzętowa obsługa master &lt;-&gt; slave]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3328&amp;p=39349#p39349"><![CDATA[
Jeżyk przetestowałem Twój kod. <br />Master na Atmedze32, a slave na Atmedze8. I wszystko działa. Master nadaje a sleve ładnie odbiera dane i wyświetla na LCD.<br />Oba procki taktowałem wewnętrznym oscylatorem 8MHz.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=204">jacekk232</a> — 15 cze 2013, o 20:07</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Jeżyk-1]]></name></author>
<updated>2013-06-15T11:24:47+01:00</updated>
<published>2013-06-15T11:24:47+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3328&amp;p=39336#p39336</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3328&amp;p=39336#p39336"/>
<title type="html"><![CDATA[SPI - Sprzętowa obsługa master &lt;-&gt; slave]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3328&amp;p=39336#p39336"><![CDATA[
Witam. <br />Próbuję nauczyć się komunikacji między trzema AVR lecz problem mam już z dwoma. <br />Wcześniej doszedłem do efektu że dwie atmegi 16 wysyłały w jedną i drugą stronę informacje. Gdy przerobiłem kod by obsługiwał trzecią atmege wszystko się posypało. I chyba lepiej będzie jak wykorzystam przerwanie SPI_STC_vect w układzie slave. <br />Więc zabrałem się za kod i już na samym początku nie działa mi.<br />Próbuję wysłać zmieniającą się wartość z master do slave w taki sposób:<br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;avr/pgmspace.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &quot;lcd.h&quot;<br /><br />#define MASTER 0//jeżeli master to 1, jeżeli slave to 0<br /><br />#if MASTER ==1<br /><br />#define MOSI PB5<br />#define SCK PB7<br />#define CS1 PB4<br />#define CS2 PB3<br />#define CS1_0 PORTB &amp;= ~(1&lt;&lt;CS1)<br />#define CS1_1 PORTB |= (1&lt;&lt;CS1)<br />#define CS2_0 PORTB &amp;= ~(1&lt;&lt;CS2)<br />#define CS2_1 PORTB |= (1&lt;&lt;CS2)<br /><br />void InitSpiMaster(void);<br />uint8_t TransferSpi1(uint8_t byte);<br /><br />int main(void) {<br />DDRC |= (1 &lt;&lt; PC1);//podświetlenie LCD<br />PORTC |= (1 &lt;&lt; PC1);<br />lcd_init(); //inicjalizacja wyświetlacza<br />InitSpiMaster();//inicjalizacja SPI dla master<br />lcd_locate(1, 0);<br />lcd_str(&quot;M&quot;);<br /> uint8_t cnt1 = 0;<br /><br />while (1) {<br /><br />cnt1++;<br />if (cnt1 == 99)<br />cnt1 = 0;<br /><br />//wysyłanie1:<br />CS1_0;<br />TransferSpi1(cnt1); //Wysłanie wartości zmiennej do slave1<br />CS1_1;<br /><br />lcd_locate(1, 2);<br />lcd_str(&quot;W1:&quot;);<br />lcd_int(cnt1); //Wyświetlenie wartości cnt na LCD<br /><br />_delay_ms(400);<br />}<br />}<br />//inicjalizacja SPI<br />void InitSpiMaster(void) {<br />CS1_1;<br />CS2_1;<br />//ustawienie kierunku wyjściowego dla linii MOSI, SCK, CS1 i CS2<br />DDRB |= (1 &lt;&lt; MOSI) | (1 &lt;&lt; SCK) | (1 &lt;&lt; CS1) | (1 &lt;&lt; CS2);<br />// aktywacja  SPI, tryb pracy Master, prędkość zegara Fosc/128<br />SPCR |= (1 &lt;&lt; SPE) | (1 &lt;&lt; MSTR) | (1 &lt;&lt; SPR1) | (1 &lt;&lt; SPR0);<br />}<br />// definicja funkcji odbioru i wysłaniu do slave1<br /><br />uint8_t TransferSpi1(uint8_t byte) {<br />SPDR = byte;<br />while (!(SPSR &amp; (1 &lt;&lt; SPIF)));<br />return SPDR;<br />}<br /><br />#endif<br /><br />//-----------------------------SLAVE<br /><br />#if MASTER == 0<br /><br />#define MISO PB6<br />#define CS1 PB4<br /><br />void InitSpiSlave(void);<br />volatile uint8_t bajt_o;<br />int main(void) {<br /><br />DDRC |= (1&lt;&lt;PC1); //Podświetlenie LCD<br />PORTC |= (1&lt;&lt;PC1);<br />lcd_init(); //inicjalizacja wyświetlacza<br />InitSpiSlave(); // inicjalizacja SPI dla master<br />sei();<br />lcd_locate(1, 0);<br />lcd_str(&quot;Slave 1&quot;); //wyświetlenie napisu<br />uint8_t cnt =0; // Zmienna licznika<br /><br />while(1) {<br /><br />uint8_t dane = bajt_o;<br /><br />cnt=cnt+2; //Dodanie wartości licznika +2<br />if (cnt==99) cnt=0; //jeżeli licznik ==99 zeruje zmienną cnt<br /><br />lcd_locate(0,0);<br />lcd_str(&quot;W:&quot;);<br />lcd_int( cnt ); //Wyświetlenie wartości cnt na LCD<br /><br />lcd_locate(10,0);<br />lcd_str(&quot;O:&quot;);<br />lcd_int(dane); //wyświetlenie odebranych danych<br /><br />}<br /><br />}<br /><br />void InitSpiSlave(void) {<br />// ustawienie kierunku wyjściowego dla linii MOSI<br />DDRB |= (1&lt;&lt;MISO);<br />DDRB &amp;= ~(1&lt;&lt;CS1);<br />// aktywacja  SPI, tryb pracy SLAVE,<br />SPCR |= (1&lt;&lt;SPE) | (1&lt;&lt;SPIE);<br />}<br /><br />ISR(SPI_STC_vect)<br />{<br /><br />bajt_o = SPDR;<br />}<br /><br />#endif[/syntax]<br /><br />Gdzieś popełniam błąd ponieważ slave wyświetla cały czas 0. Połączenie między układami było wcześniej testowane innym kodem więc wykluczam błędne podłączenie.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=493">Jeżyk-1</a> — 15 cze 2013, o 11:24</p><hr />
]]></content>
</entry>
</feed>