Dobry podvecer,<div>po celodennim boji s I2C to vzdavam a prosim zdejsi profiky o pomoc.</div><div>Mam ATtiny 2313 a k tomu pripojeny teplotni senzor TC74, ktery</div><div>komunikuje pomoci I2C. SCL je pripojeno na PB7 a SDA je na PDB5.</div>
<div>Oba vodice jsou pres odpory 10k pripojeny na Vdd.</div><div><br></div><div>Otazecka pro zacatek, kdyz prijimam ACK pripadne byte z TC74,</div><div>musi byt SDA nastaven jako vstupni myslim tim DDRB &amp;= ~(1&lt;&lt;sda)?</div>
<div>Nebo prikaz (PINB,sda) precte skutecnou hodnotu na pinu..??</div><div><br></div><div>Diky za kazde nakopnuti..</div><div><br></div><div>Zde posilam kod k nahlednuti.</div><div><br></div><div>PS: komentaru si zatim nevsimejte.. :)</div>
<div><br></div><div><div>#include &lt;stdint.h&gt;</div><div>#include &lt;avr/io.h&gt;</div><div>#include &lt;avr/iotn2313.h&gt;</div><div>#include &lt;avr/interrupt.h&gt;</div><div><br></div><div>#define F_CPU 11059200</div>
<div>#define scl PB7</div><div>#define led PB6</div><div>#define sda PB5</div><div><br></div><div>#include &lt;util/delay.h&gt;</div><div><br></div><div>void I2CInit(){</div><div>  </div><div>  PORTB |= (1&lt;&lt;sda)|(1&lt;&lt;scl);<span class="Apple-tab-span" style="white-space:pre">        </span>//sda=1, scl=1</div>
<div>  _delay_us(10);<span class="Apple-tab-span" style="white-space:pre">                        </span>//wait 5us</div><div>}</div><div><br></div><div>void I2CStart(){</div><div>  </div><div>  PORTB |= (1&lt;&lt;scl);<span class="Apple-tab-span" style="white-space:pre">                </span>//scl=1</div>
<div>  _delay_us(10);<span class="Apple-tab-span" style="white-space:pre">                        </span>//wait 5us</div><div>  PORTB &amp;= ~(1&lt;&lt;sda);<span class="Apple-tab-span" style="white-space:pre">                </span>//sda=0</div><div>  _delay_us(10);<span class="Apple-tab-span" style="white-space:pre">                        </span>//wait 5us</div>
<div>  PORTB &amp;= ~(1&lt;&lt;scl);<span class="Apple-tab-span" style="white-space:pre">                </span>//scl=0</div><div>  _delay_us(2);</div><div>}</div><div><br></div><div>void I2CSend(unsigned char Data){</div><div>  unsigned char i;</div>
<div>  </div><div>  for(i=0;i&lt;8;i++){</div><div>    PORTB &amp;= ~(1&lt;&lt;scl);<span class="Apple-tab-span" style="white-space:pre">                </span>//scl=0</div><div>    _delay_us(10);<span class="Apple-tab-span" style="white-space:pre">                </span>//wait 5us</div>
<div>    </div><div>    if((Data&amp;0x80)==0){</div><div>      PORTB &amp;= ~(1&lt;&lt;sda);<span class="Apple-tab-span" style="white-space:pre">        </span>//sda = 0;</div><div>      _delay_us(2);<span class="Apple-tab-span" style="white-space:pre">                </span>//wait 2us</div>
<div>    }</div><div>    else {</div><div>      PORTB |= (1&lt;&lt;sda);<span class="Apple-tab-span" style="white-space:pre">        </span>//sda = 1;</div><div>      _delay_us(2);<span class="Apple-tab-span" style="white-space:pre">                </span>//wait 2us</div>
<div>    }</div><div>    </div><div>    PORTB |= (1&lt;&lt;scl);<span class="Apple-tab-span" style="white-space:pre">                </span>//scl = 1;</div><div>    _delay_us(10);<span class="Apple-tab-span" style="white-space:pre">                </span>//wait 5us</div>
<div>    </div><div>    Data&lt;&lt;=1;<span class="Apple-tab-span" style="white-space:pre">                        </span>//posune MSB doleva, prvni se vysila MSB</div><div>  }</div><div>  </div><div>    PORTB &amp;= ~(1&lt;&lt;scl);<span class="Apple-tab-span" style="white-space:pre">                </span>//scl = 0;</div>
<div>    PORTB |= (1&lt;&lt;sda);<span class="Apple-tab-span" style="white-space:pre">                </span>//sda = 1;</div><div>    _delay_us(2);<span class="Apple-tab-span" style="white-space:pre">                </span>//wait 1us</div><div>}</div>
<div><br></div><div>unsigned char I2CRead(){</div><div>  unsigned char i, data=0;</div><div>  </div><div>  for(i=0;i&lt;8;i++){</div><div>    _delay_us(2);</div><div>    PORTB &amp;= ~(1&lt;&lt;scl);<span class="Apple-tab-span" style="white-space:pre">                </span>//scl = 0</div>
<div>    _delay_us(10);</div><div>    PORTB |= (1&lt;&lt;scl);<span class="Apple-tab-span" style="white-space:pre">                </span>//scl = 1</div><div>    _delay_us(10);</div><div>    if(PINB,sda){</div><div>      data |= 1;</div>
<div>    }</div><div>    data&lt;&lt;=1;</div><div>  }</div><div>        PORTB &amp;= ~(1&lt;&lt;scl);<span class="Apple-tab-span" style="white-space:pre">        </span>//scl = 0</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>PORTB |= (1&lt;&lt;sda);<span class="Apple-tab-span" style="white-space:pre">        </span>//sda = 1</div>
<div>        return (data);</div><div>}</div><div><br></div><div>void I2CAck(){</div><div>  PORTB &amp;= ~(1&lt;&lt;sda);<span class="Apple-tab-span" style="white-space:pre">                </span>//sda = 0</div><div>  _delay_us(10);<span class="Apple-tab-span" style="white-space:pre">                </span>//ceka 10us</div>
<div>  PORTB |= (1&lt;&lt;scl);<span class="Apple-tab-span" style="white-space:pre">                </span>//scl = 1</div><div>  _delay_us(10);<span class="Apple-tab-span" style="white-space:pre">                </span>//ceka 10us</div><div>  PORTB &amp;= ~(1&lt;&lt;scl);<span class="Apple-tab-span" style="white-space:pre">                </span>//scl = 0</div>
<div>  </div><div>  _delay_us(2);<span class="Apple-tab-span" style="white-space:pre">                        </span>//ceka 2us</div><div>  PORTB |= (1&lt;&lt;sda);<span class="Apple-tab-span" style="white-space:pre">                </span>//sda = 1</div><div>
}</div><div><br></div><div>void I2CNack(){</div><div>  PORTB |= (1&lt;&lt;sda);<span class="Apple-tab-span" style="white-space:pre">                </span>//sda = 1</div><div>  _delay_us(10);</div><div>  PORTB |= (1&lt;&lt;scl);<span class="Apple-tab-span" style="white-space:pre">                </span>//scl = 1</div>
<div>  _delay_us(10);</div><div>  PORTB &amp;= ~(1&lt;&lt;scl);<span class="Apple-tab-span" style="white-space:pre">                </span>//scl = 0</div><div>}</div><div><br></div><div>/*</div><div>void blik (void) {</div><div>  unsigned char i;</div>
<div>  for (i=0;i&lt;1;i++) {</div><div>    PORTB |= (1&lt;&lt;led);</div><div>    _delay_ms(100);</div><div>    PORTB &amp;= ~(1&lt;&lt;led);</div><div>    _delay_ms(100);</div><div>  }</div><div>}</div><div>*/</div><div>
<br></div><div>/*</div><div>void svit (void) {</div><div>  PORTB |= (1&lt;&lt;led);</div><div>  _delay_ms(500);</div><div>}</div><div>*/</div><div><br></div><div>int main (void)</div><div>{</div><div>  unsigned char aa;</div>
<div>  int sto, deset, jedna, pom;</div><div>  </div><div>  cli();<span class="Apple-tab-span" style="white-space:pre">                        </span>//zakate preruseni</div><div>  </div><div>  DDRB |= (1&lt;&lt;sda)|(1&lt;&lt;scl)|(1&lt;&lt;led);<span class="Apple-tab-span" style="white-space:pre">        </span>//nastavi sda a scl jako vystup</div>
<div>  PORTB &amp;= ~(1&lt;&lt;led);</div><div>  </div><div>  DDRD |= 0xFF;<span class="Apple-tab-span" style="white-space:pre">                        </span>//nastavi led jako vystup</div><div>  PORTD |= 0xFF;<span class="Apple-tab-span" style="white-space:pre">                </span>//led zhasne</div>
<div>      </div><div>  I2CInit();<span class="Apple-tab-span" style="white-space:pre">                        </span>//init I2C</div><div>  </div><div>  I2CStart();<span class="Apple-tab-span" style="white-space:pre">                        </span>//start</div><div>
  </div><div>  I2CSend(0x91);<span class="Apple-tab-span" style="white-space:pre">                </span>//vysle addressu TC74 0b10010001, posledni bit0 signalizuje READ</div><div>  </div><div>  I2CAck();<span class="Apple-tab-span" style="white-space:pre">                        </span>//ack ???</div>
<div>  </div><div>  aa=I2CRead();</div><div>    </div><div> // I2CNack();</div><div>  </div><div>  pom = aa;</div><div>  pom /= 100;</div><div>  sto = pom;<span class="Apple-tab-span" style="white-space:pre">                        </span>//sto = ulozene stovky</div>
<div>  </div><div>  pom = 136;</div><div>  pom -= 100;</div><div>  pom /= 10;</div><div>  deset = pom;<span class="Apple-tab-span" style="white-space:pre">                        </span>//deset = desitky</div><div>  </div><div>  pom = aa;</div>
<div>  pom -= 100;</div><div>  pom -= (deset*10);</div><div>  jedna = pom;<span class="Apple-tab-span" style="white-space:pre">                        </span>//jedna = jednotky</div><div><br></div><div>  //deset = 5;</div><div><br></div><div>
if (deset == 0) {</div><div>  PORTD = 0b10000001;<span class="Apple-tab-span" style="white-space:pre">                </span>//0</div><div>  _delay_ms(50);</div><div>  }</div><div>  else if (deset == 1) {</div><div>    PORTD = 0b1100111;<span class="Apple-tab-span" style="white-space:pre">                </span>//1</div>
<div>    _delay_ms(50);<span class="Apple-tab-span" style="white-space:pre">                        </span>//ceka 50ms</div><div>  }</div><div>  else if (deset == 2) {<span class="Apple-tab-span" style="white-space:pre">        </span></div><div>    PORTD = 0b10010010;<span class="Apple-tab-span" style="white-space:pre">                </span>//2</div>
<div>    _delay_ms(50);<span class="Apple-tab-span" style="white-space:pre">                        </span>//ceka 50ms</div><div>  }</div><div>  else if (deset == 3) {</div><div>    PORTD = 0b11000010;<span class="Apple-tab-span" style="white-space:pre">                </span>//3</div>
<div>    _delay_ms(50);<span class="Apple-tab-span" style="white-space:pre">                        </span>//ceka 50ms</div><div>  }</div><div>  else if (deset == 4) {</div><div>    PORTD = 0b11100100;<span class="Apple-tab-span" style="white-space:pre">                </span>//4</div>
<div>    _delay_ms(50);<span class="Apple-tab-span" style="white-space:pre">                        </span>//ceka 50ms</div><div>  }</div><div>  else if (deset == 5) {</div><div>    PORTD = 0b11001000;<span class="Apple-tab-span" style="white-space:pre">                </span>//5</div>
<div>    _delay_ms(50);<span class="Apple-tab-span" style="white-space:pre">                        </span>//ceka 50ms</div><div>  }</div><div>  else if (deset == 6) {</div><div>    PORTD = 0b10001000;<span class="Apple-tab-span" style="white-space:pre">                </span>//6</div>
<div>    _delay_ms(50);<span class="Apple-tab-span" style="white-space:pre">                        </span>//ceka 50ms</div><div>  }</div><div>  else if (deset == 7) {</div><div>    PORTD = 0b11100011;<span class="Apple-tab-span" style="white-space:pre">                </span>//7</div>
<div>    _delay_ms(50);<span class="Apple-tab-span" style="white-space:pre">                        </span>//ceka 50ms</div><div>  }</div><div>  else if (deset == 8) {</div><div>    PORTD = 0b10000000;<span class="Apple-tab-span" style="white-space:pre">                </span>//8</div>
<div>    _delay_ms(50);<span class="Apple-tab-span" style="white-space:pre">                        </span>//ceka 50ms</div><div>  }</div><div>  else {</div><div>    PORTD = 0b11000000;<span class="Apple-tab-span" style="white-space:pre">                </span>//9</div>
<div>    _delay_ms(50);<span class="Apple-tab-span" style="white-space:pre">                        </span>//ceka 50ms</div><div>  }</div><div><br></div><div>return(0);</div><div>}</div></div>