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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2013-06-08T12:51:17+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=3284&amp;mode</id>
<entry>
<author><name><![CDATA[Paweł_1985]]></name></author>
<updated>2013-06-08T12:51:17+01:00</updated>
<published>2013-06-08T12:51:17+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3284&amp;p=38741#p38741</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3284&amp;p=38741#p38741"/>
<title type="html"><![CDATA[I2C slave]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3284&amp;p=38741#p38741"><![CDATA[
Witam<br /><br />Zrobiłem komunikację pomiędzy dwoma Atmegami16 po I2C. Jeden pełni rolę slave, drugi mastera. <br />Poniżej zamieszczam program slave (ze względu na to że program jest rozbudowany o odczyt z wykorzystaniem przerwania przetwornika ADC oraz obsługę wyświetlacza z nokii zamieszczam tylko częśc dotyczącą I2C):<br />[syntax=c]//pliki nagłówkowe<br />#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;avr/pgmspace.h&gt;<br />#include &quot;lcd.h&quot;<br />#include &lt;util/twi.h&gt;<br /><br />//definicje zmiennych<br />volatile uint16_t v_right;  //kanał = 0<br />volatile uint16_t h_right;  //kanał = 1<br />volatile uint16_t v_left;  //kanał = 2<br />volatile uint16_t h_left;  //kanał = 3<br />volatile uint8_t numer_pomiaru=0;<br />int PWM;<br />volatile int test = 0;<br /><br /><br />//prototypy funkcji<br />void ADC_init(void);<br />void Switch_init(void);<br />void wyswietl (void);<br />void i2dig(int t, unsigned char tab&#91;&#93;);<br />void lcd_d_t(unsigned char *s, unsigned char x, unsigned char y);<br />void I2C_init(void);<br /><br />int main (void)<br />{<br />sei();<br />ADC_init();<br />I2C_init();<br />Switch_init();<br />DDRD |=(1&lt;&lt;PD1);<br />ADCSRA |=(1&lt;&lt;ADSC);<br />/* Inicjuje wyświetlacz */<br />lcd_init();<br />lcd_clear();<br />lcd_image(tlo_img,0,0,84,6);<br />PORTD |= (1&lt;&lt;PD1);<br />    <br />for (;;)<br />{<br />wyswietl(); <br /><br /><br />if (h_right &gt;= HRightLeft)<br />{<br />lcd_image(ArrowLeft,66,1,6,1);<br />lcd_image(empty8x8,78,1,6,1);<br />}<br /><br /><br />if (h_right &lt;= HRightRight)<br />{<br />lcd_image(ArrowRight,78,1,6,1);<br />lcd_image(empty8x8,66,1,6,1);<br />}<br /><br />if ((h_right &gt; HRightRight) &amp;&amp; (h_right &lt; HRightLeft))<br />{<br />lcd_image(empty8x8,78,1,6,1);<br />lcd_image(empty8x8,66,1,6,1);<br />}<br /><br /><br />if (v_right &gt;= VRightUp)<br />{<br />lcd_image(ArrowUp,72,0,6,1);<br />lcd_image(empty8x8,72,2,6,1);<br />}<br /><br /><br />if (v_right &lt;= VRightDown)<br />{<br />lcd_image(ArrowDown,72,2,6,1);<br />lcd_image(empty8x8,72,0,6,1);<br />}<br /><br />if ((v_right &gt; VRightDown) &amp;&amp; (v_right &lt; VRightUp))<br />{<br />lcd_image(empty8x8,72,0,6,1);<br />lcd_image(empty8x8,72,2,6,1);<br />}<br />}<br /><br />}<br /><br />/////////////////////////////////////////////////////I2C//////////////////////////////////////////////////<br />void I2C_init(void)<br />{<br />TWAR = I2C_addres;<br />TWCR = (1&lt;&lt;TWEN)|(1&lt;&lt;TWEA)|(1&lt;&lt;TWINT)|(1&lt;&lt;TWIE);<br />TWAR &amp;= ~(1&lt;&lt;TWGCE);<br />}<br /><br />ISR (TWI_vect)<br />{<br /><br />switch (TW_STATUS)<br />  {<br />case TW_SR_SLA_ACK: break;<br />case TW_SR_STOP: TWCR &amp;=~(1&lt;&lt;TWEA); break;<br />//wysyłanie informacji I2C<br />case TW_ST_SLA_ACK: break; <br />case TW_ST_DATA_ACK: TWDR = PWM; break;<br />case TW_ST_DATA_NACK: break; <br />//case TW_ST_LAST_DATA: TWDR = PWM; break;<br />default: TWCR = (1&lt;&lt;TWEN)|(1&lt;&lt;TWEA)|(1&lt;&lt;TWINT)|(1&lt;&lt;TWIE);<br />}<br />test++;<br />TWCR|= (1&lt;&lt;TWINT);<br />}[/syntax]<br /><br />Program mastera [/syntax]:<br />[syntax=c]//********************************************** pliki nagłówkowe **********************************************<br />#include &lt;avr/io.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &lt;stddef.h&gt;<br />#include &quot;hd44780.h&quot;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;stdbool.h&gt;<br />#include &lt;avr/pgmspace.h&gt;<br />#include &lt;stdint.h&gt;<br />#include &lt;stdio.h&gt;<br />#include &lt;stdlib.h&gt; <br />#include &lt;util/twi.h&gt;<br /><br />//********************************************* definicje ******************************************************<br />#define BAUD 9600<br />#define MYUBRR 51<br />#define I2C_read_addres 0x21<br />#define I2C_write_addres 0x20<br />#define F_CPU 8000000UL<br />#define MY_SCL_RATE500000<br />#define TWBR_number(F_CPU/MY_SCL_RATE-16)/2<br />har r;<br />uint8_t kierunek;<br />uint8_t PWM;<br />char bufor &#91;8&#93;;<br />uint8_t a = 0;<br />uint8_t a1 = 0;<br />uint8_t a2 = 0;<br />uint8_t I2C_Error;<br />uint8_t z;<br /><br /><br /><br />//************************************************* FUNCKJE ***************************************************<br />void Panel_glowny(void);<br />uint8_t klaw(void);<br />void send_to_PC(void);<br />void TWI_start(void);<br />void TWI_stop(void); <br />void TWI_write (uint8_t bajt);<br />uint8_t TWI_read(uint8_t ack) ;<br /><br />int main(void)<br />{<br />sei();<br />//USART_Init ( MYUBRR );  //inicjalizacja USART<br />LCD_Initalize();<br />Panel_glowny();<br />TWSR&amp;=~(1&lt;&lt;TWPS1);<br />TWSR&amp;=~(1&lt;&lt;TWPS0);<br />TWBR = TWBR_number;<br />//*********************************************************<br />for(;;)<br />{<br />a =1 + klaw();<br />if (a2 == 3) a2=4;<br />Panel_glowny();<br /><br />TWI_start();<br />if (a2 == 4) a2=5;<br />Panel_glowny();<br />TWI_write(I2C_read_addres);<br />a1 = TWI_read(0);<br />TWI_start();<br />TWI_stop();<br />a2 = 3;<br />Panel_glowny();<br />/*<br />TWI_start();<br />TWI_write(I2C_write_addres);<br />TWI_write (a);<br />TWI_stop();<br />*/<br />/*if (r == 2)<br />{<br />send_to_PC();<br />}*/<br />}<br />//******************************************************<br />}<br /><br /><br />//****************************************************** I2C ******************************************************<br />void TWI_start(void)<br />{<br /><br />TWCR = (1&lt;&lt;TWINT) |(1&lt;&lt;TWEN) | (1&lt;&lt;TWSTA);<br />while (! (TWCR&amp; (1&lt;&lt;TWINT))) ;<br /><br />}<br />void TWI_stop(void) <br />{ <br />TWCR = (1&lt;&lt;TWINT) |(1&lt;&lt;TWEN) | (1&lt;&lt;TWSTO) ;<br />while (! (TWCR&amp; (1&lt;&lt;TWSTO))) ;<br />}<br /><br />void TWI_write (uint8_t bajt) <br />{<br />TWDR = bajt;<br />TWCR = (1&lt;&lt;TWINT) |(1&lt;&lt;TWEN)  ;<br />while (! (TWCR&amp; (1&lt;&lt;TWINT)));<br />}<br /><br /><br />uint8_t TWI_read(uint8_t ack) <br />{<br />TWCR = (1&lt;&lt;TWINT) | (ack&lt;&lt;TWEA)|(1&lt;&lt;TWEN) ;<br />while (! (TWCR &amp; (1&lt;&lt;TWINT))) ;<br />return TWDR;<br />}[/syntax]<br /><br />Niestety nie działa tutaj poprawnie wysyłanie parametru ze slave do mastera. Po jednokrotnym wysłaniu parametru, przy kolejnej próbie wysyłania program zawiesza się na sygnale start. Czy ktoś może miał podobny problem?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1009">Paweł_1985</a> — 8 cze 2013, o 12:51</p><hr />
]]></content>
</entry>
</feed>