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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2015-08-29T23:42:09+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=12740&amp;mode</id>
<entry>
<author><name><![CDATA[Jaglarz]]></name></author>
<updated>2015-08-29T23:42:09+01:00</updated>
<published>2015-08-29T23:42:09+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=12740&amp;p=138601#p138601</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=12740&amp;p=138601#p138601"/>
<title type="html"><![CDATA[Re: Komunikacja po I2C Atmega 328P (slave) -&gt; Atmega644 (mas]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=12740&amp;p=138601#p138601"><![CDATA[
Nie odświeżamy tematów...<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=471">Jaglarz</a> — 29 sie 2015, o 23:42</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[ps19]]></name></author>
<updated>2015-08-29T20:05:20+01:00</updated>
<published>2015-08-29T20:05:20+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=12740&amp;p=138593#p138593</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=12740&amp;p=138593#p138593"/>
<title type="html"><![CDATA[Re: Komunikacja po I2C Atmega 328P (slave) -&gt; Atmega644 (mas]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=12740&amp;p=138593#p138593"><![CDATA[
refresh<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=230">ps19</a> — 29 sie 2015, o 20:05</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[ps19]]></name></author>
<updated>2015-08-29T13:11:04+01:00</updated>
<published>2015-08-29T13:11:04+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=12740&amp;p=138577#p138577</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=12740&amp;p=138577#p138577"/>
<title type="html"><![CDATA[Re: Komunikacja po I2C Atmega 328P (slave) -&gt; Atmega644 (mas]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=12740&amp;p=138577#p138577"><![CDATA[
Chyba znalazłem w czym leży problem:<br /><br />Errata procka:<br /><div class="codetitle"><b>Code:</b></div><div class="codecontent">2. TWI Data setup time can be too short<br />When running the device as a TWI slave with a system clock above 2MHz, the data setup time for the first<br />bit after ACK may in some cases be too short. This may cause a false start or stop condition on the TWI<br />line.<br />Problem Fix/Workaround<br />Insert a delay between setting TWDR and TWCR.</div><br /><br />Teraz pytanie jak zrealizować to opóźnienie skoro ustawianie TWDR jak i TWCR odbywa się w prerwaniu<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=230">ps19</a> — 29 sie 2015, o 13:11</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[ps19]]></name></author>
<updated>2015-08-28T14:44:39+01:00</updated>
<published>2015-08-28T14:44:39+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=12740&amp;p=138544#p138544</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=12740&amp;p=138544#p138544"/>
<title type="html"><![CDATA[Re: Komunikacja po I2C Atmega 328P (slave) -&gt; Atmega644 (mas]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=12740&amp;p=138544#p138544"><![CDATA[
1.Do wysłania danych adres musi być parzysty. Zmieniłem adres na parzysty i zaczęło działać.<br /><br />Zrobiłem funkcję do wysyłania kilku parametrów, ale o ile mogę wysłać jeden parametr to w przypadku jak wysyłam &quot;identyfikator&quot; , a potem chcę odebrać odpowiednie dane to w rejestrze TWDR slave`a dostaję adres odbioru (adres +1) .<br /><br />Funkcja odbierająca (master):<br /><br />[syntax=c]i2c_start();<br />i2c_write(DEVADDR); //adres<br />i2c_write(0x01); //dane<br />i2c_start();<br />i2c_write(DEVADDR+1); //adres<br />odczyt1 = i2c_read(0);<br />i2c_stop();[/syntax]<br /><br />Slave main:<br /><br />[syntax=c]int main(void)<br />{<br />while(1)<br />{<br />if(BUF_status.st_ready)<br />{<br />switch(Buf&#91;0&#93;)<br />{<br />case 0x01:<br />sensor_data = sensor1.odleglosc;<br />break;<br />}<br />BUF_status.st_transmitting=1;<br />}<br />//....odczyt danych z czujników<br />}<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=230">ps19</a> — 28 sie 2015, o 14:44</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Krauser]]></name></author>
<updated>2015-08-26T19:11:13+01:00</updated>
<published>2015-08-26T19:11:13+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=12740&amp;p=138394#p138394</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=12740&amp;p=138394#p138394"/>
<title type="html"><![CDATA[Re: Komunikacja po I2C Atmega 644 (slave) -&gt; Atmega8 (master]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=12740&amp;p=138394#p138394"><![CDATA[
Dodaj opóźnienie w tej pętli while, bo procesor będzie co chwilę w przerwaniu od wysłania bajtu. Za dużo przerwań jednego rodzaju powoduje opóźnioną reakcję przerwania o niższym priorytecie.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=465">Krauser</a> — 26 sie 2015, o 19:11</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[ps19]]></name></author>
<updated>2015-08-26T18:49:35+01:00</updated>
<published>2015-08-26T18:49:35+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=12740&amp;p=138386#p138386</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=12740&amp;p=138386#p138386"/>
<title type="html"><![CDATA[Re: Komunikacja po I2C Atmega 644 (slave) -&gt; Atmega8 (master]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=12740&amp;p=138386#p138386"><![CDATA[
plik main_slave.c<br /><br />[syntax=c]int main(void)<br />{<br />I2C_Slave_Init();<br />USART_Init(__UBRR);<br /><br />        DDRC &amp;= ~_BV(7);<br /><br />sei();<br /><br />       term_cls(1);<br /><br />while(1)<br />{<br />PORTC |= _BV(7);<br />uart_putint(TW_STATUS,16);<br />}<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=230">ps19</a> — 26 sie 2015, o 18:49</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Krauser]]></name></author>
<updated>2015-08-25T23:28:34+01:00</updated>
<published>2015-08-25T23:28:34+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=12740&amp;p=138336#p138336</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=12740&amp;p=138336#p138336"/>
<title type="html"><![CDATA[Re: Komunikacja po I2C Atmega 644 (slave) -&gt; Atmega8 (master]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=12740&amp;p=138336#p138336"><![CDATA[
A co z plikiem main.c układu slave?<br /><br />W układzie slave ustaw maskę TWAMR na 0xFE i wtedy każdy adres będzie dobry.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=465">Krauser</a> — 25 sie 2015, o 23:28</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[ps19]]></name></author>
<updated>2015-08-27T22:49:19+01:00</updated>
<published>2015-08-24T20:48:54+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=12740&amp;p=138244#p138244</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=12740&amp;p=138244#p138244"/>
<title type="html"><![CDATA[Komunikacja po I2C Atmega 328P (slave) -&gt; Atmega644 (master)]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=12740&amp;p=138244#p138244"><![CDATA[
Witam<br /><br />Próbuję uruchomić komunikację po I2C pomiędzy dwoma atmegami Atmega 644PA jako slave i Atmega8 jako master.<br /><br />Z Atmegi8 wylatują dane (sprawdzane na oscyloskopie, komunikowałem procka z akcelerometrem także kod od mastera jest ok) ale nie mogę ich odebrać - dostaję cały czas status 0xF8 przy odczycie z TW_STATUS.<br /><br />Wysyłałem też dane tak jak to robiłem z akcelerometrem (zmieniłem adres slave`a na taki jak acc...), ale również bez skutku.<br /><br />Dane z TW_STATUS odczytywałem przez UARTA.<br /><br />SDA i SCL oczywiście podciągnięte do VCC (4,7k)<br /><br />i2c_slave.c<br />[syntax=c]#include &lt;avr\io.h&gt;<br />#include &lt;stdlib.h&gt;<br />#include &lt;util\twi.h&gt;<br />#include &lt;avr\interrupt.h&gt;<br /><br />#include &quot;../main.h&quot;<br />#include &quot;i2c_slave.h&quot;<br /><br />char Buf&#91;BUFSIZE&#93;;//Bufor na odebraną ramkę<br />volatile struct Buf_status BUF_status;<br /><br />struct Buf_status<br />{<br />union<br />{<br />struct<br />{<br />uint8_t st_ready         : 1;<br />uint8_t st_receiving     : 1;<br />uint8_t st_transmitting  : 1;<br />uint8_t counter          : 5;<br />};<br />uint8_t byte;<br />};<br />};<br /><br />typedef union<br />{<br />uint16_t word;<br />uint8_t byte&#91;2&#93;;<br />} WORD;<br /><br />void BUFEmpty()<br />{<br />BUF_status.byte=0;<br />TWCR|=_BV(TWEA);<br />}<br /><br />ISR(TWI_vect)<br />{<br />uint8_t status = TW_STATUS;<br />switch(status)<br />{<br />PORTC &amp;= ~_BV(7);<br />//Obsługa slave receive<br />case TW_SR_SLA_ACK:BUF_status.counter=0; BUF_status.st_receiving=1; break;//Rozpoczęto transmisję<br />case TW_SR_STOP:if(BUF_status.st_receiving)<br />{<br />BUF_status.st_ready=1;<br />BUF_status.st_receiving=0;<br />TWCR &amp;= ~(_BV(TWEA)); //Nie generuj ACK<br />} else<br />{<br />TWCR |= _BV(TWEA);<br />BUF_status.counter=0; BUF_status.st_receiving=1;<br />}<br />break;//Zakończono odbiór ramki<br />case TW_SR_GCALL_DATA_ACK:<br />case TW_SR_GCALL_ACK: break;<br />case TW_SR_DATA_ACK:  Buf&#91;BUF_status.counter++&#93;=TWDR;break; //Odebrano bajt danych<br />case TW_SR_DATA_NACK: Buf&#91;BUF_status.counter++&#93;=TWDR;<br />BUF_status.st_ready=1;<br />BUF_status.st_receiving=0;<br />TWCR &amp;= ~(_BV(TWEA)); //Nie generuj ACKbreak<br />break;<br />//Obsługa slave transmit<br />case TW_ST_SLA_ACK:   BUF_status.counter=0; BUF_status.st_transmitting=1;<br />//case TW_ST_DATA_ACK:TWDR=((WORD)Send_Data()).byte&#91;BUF_status.counter++&#93;; break;<br />case TW_ST_DATA_NACK: BUF_status.st_transmitting=0; break;<br />case TW_ST_LAST_DATA: break;<br />default:              TWCR =_BV(TWEN) | _BV(TWEA) | _BV(TWIE) | _BV(TWINT);<br />BUF_status.byte=0;<br />}<br />if(BUF_status.counter&gt;=BUFSIZE) BUF_status.counter=0;//Zapobiega przepełnieniu bufora<br />TWCR |= _BV(TWINT);//Zwolnij linię SCL<br />}<br /><br />void I2C_Slave_Init()<br />{<br />TWAR=DEVADDR;<br />TWAMR=0;<br />TWCR= _BV(TWEN) | _BV(TWEA) | _BV(TWIE) | _BV(TWINT);//Odblokuj TWI, przerwanie TWI i automatyczne generowanie ACK<br />}[/syntax]<br /><br />i2c_slave.h<br />[syntax=c]#ifndef I2C_TWI_I2C_SLAVE_H_<br />#define I2C_TWI_I2C_SLAVE_H_<br /><br />#define DEVADDR      190 //Adres urządzenia slave<br />#define BUFSIZE      20<br />#define ST_READY     1<br />#define ST_RECEIVING 2<br /><br />void I2C_Slave_Init();<br />void BUFEmpty();<br /><br />extern char Buf&#91;BUFSIZE&#93;;//Bufor na odebraną ramkę<br /><br />#endif /* I2C_TWI_I2C_SLAVE_H_ */[/syntax]<br /><br />master.c<br />[syntax=c]int main(void)<br />{<br />sei();<br /><br />i2cSetBitrate(100);<br /><br />while(1)<br />{<br />i2c_start(); <br />i2c_write(190); //adres<br />i2c_write(5); //dane<br />i2c_stop();<br />}<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=230">ps19</a> — 24 sie 2015, o 20:48</p><hr />
]]></content>
</entry>
</feed>