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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2017-09-09T09:47:15+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=19127&amp;mode</id>
<entry>
<author><name><![CDATA[Vroobee]]></name></author>
<updated>2017-09-09T09:47:15+01:00</updated>
<published>2017-09-09T09:47:15+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19127&amp;p=194725#p194725</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19127&amp;p=194725#p194725"/>
<title type="html"><![CDATA[Re: ATmega328P - połączenie i2c ze sterownikiem LCD BU9796]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19127&amp;p=194725#p194725"><![CDATA[
Właśnie ostatnio go przeglądałem i chyba jest jeden mały błąd. W poniedziałek sprawdzę i dam znać<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=5942">Vroobee</a> — 9 wrz 2017, o 09:47</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Krauser]]></name></author>
<updated>2017-09-06T21:24:01+01:00</updated>
<published>2017-09-06T21:24:01+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19127&amp;p=194580#p194580</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19127&amp;p=194580#p194580"/>
<title type="html"><![CDATA[Re: ATmega328P - połączenie i2c ze sterownikiem LCD BU9796]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19127&amp;p=194580#p194580"><![CDATA[
Można by sprawdzić schemat. Niektóre wejścia muszą być podpięte do masy.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=465">Krauser</a> — 6 wrz 2017, o 21:24</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Vroobee]]></name></author>
<updated>2017-09-05T21:26:10+01:00</updated>
<published>2017-09-05T21:26:10+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19127&amp;p=194530#p194530</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19127&amp;p=194530#p194530"/>
<title type="html"><![CDATA[Re: ATmega328P - połączenie i2c ze sterownikiem LCD BU9796]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19127&amp;p=194530#p194530"><![CDATA[
Właśnie w ten sposób sprawdziłem sobie ACK tylko wysłałem go po UARTcie, dostawałem zero ale znalazłem błąd i wysyłałem jeden bit za dużo w adresie. Teraz jest ok <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> <br /><br />... z tym, że nadal nie działa. Sekwencje robię po kolei tak jak w datasheet'cie<br /><br />[syntax=c]_delay_ms(100);<br />I2C_STOP();<br /><br />I2C_START();<br />ack = i2cPutbyte(LCD_ADDR);<br />I2C_STOP();<br />if (ack) BKL_ON;<br /><br />I2C_START();<br />i2cPutbyte(LCD_ADDR);<br />i2cPutbyte(SOFT_RESET);<br />i2cPutbyte(DISP_OFF);<br />i2cPutbyte(ADSET);<br />i2cPutbyte(0xFF);<br />i2cPutbyte(0xFF);<br />I2C_STOP();<br /><br />I2C_START();<br />i2cPutbyte(LCD_ADDR);<br />i2cPutbyte(ICSET);<br />ack = i2cPutbyte(DISCTL);<br />i2cPutbyte(BLKCTL);<br />i2cPutbyte(AP_NORM);<br />i2cPutbyte(DISP_ON);<br />I2C_STOP();<br />if (ack) LED_ON;[/syntax]<br /><br /><br />I ciągle nic... Wyświetlacz działa, sprawdzałem miernikiem - pokazywały się lekko segmenty.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=5942">Vroobee</a> — 5 wrz 2017, o 21:26</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Krauser]]></name></author>
<updated>2017-09-05T20:56:35+01:00</updated>
<published>2017-09-05T20:56:35+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19127&amp;p=194520#p194520</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19127&amp;p=194520#p194520"/>
<title type="html"><![CDATA[Re: ATmega328P - połączenie i2c ze sterownikiem LCD BU9796]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19127&amp;p=194520#p194520"><![CDATA[
ACK wysyła i master i slave. Jak master wysyła bajt to save potwierdza, a jak slave wysyła dane to master potwierdza. Na pocżatek:<br />[syntax=c]uint8_t ack = 0;<br />I2C_START();<br />ack = i2cPutbyte(LCD_ADDR);<br />I2C_STOP();<br />if(ack) LED_ON;<br />else LED_OFF;[/syntax]<br />Jeśli chodzi o transmisję to masz dobrze. Najpierw komendy z MSB na 1, a jak następny bajt ma być daną to w komendzie MSB jest równe 0 co realizujesz wysyłając komendę ADSET = 0x00. Ważna jest inicjalizacja i na starcie dobrze dodać co zaleca producent:<br />[syntax=c]_delay_us(100);<br />I2C_STOP();[/syntax]<br />a potem to co masz<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=465">Krauser</a> — 5 wrz 2017, o 20:56</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Vroobee]]></name></author>
<updated>2017-09-05T20:30:04+01:00</updated>
<published>2017-09-05T20:30:04+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19127&amp;p=194516#p194516</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19127&amp;p=194516#p194516"/>
<title type="html"><![CDATA[Re: ATmega328P - połączenie i2c ze sterownikiem LCD BU9796]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19127&amp;p=194516#p194516"><![CDATA[
Wrzucam schemat ramek i komunikacji. Ja zrozumiałem to w ten sposób, że to Master musi wysłać ACK do Slave'a. Ale widzę, że się myliłem. W takim razie może ktoś podpowiedzieć jak powinna wyglądać transmisja ? <br /><br />EDIT:<br />Ok, ogarnąłem jak to sprawdzić, funkcja i2cPutByte zwraca 0 więc to oznacza brak akceptacji ? <br /><br /><a href="https://obrazkiforum.atnel.pl/5942/57d17c18acfedf4a27a2d71dfa5f9b35.jpg"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/5942/57d17c18acfedf4a27a2d71dfa5f9b35.jpg" alt="Obrazek" /></a><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=5942">Vroobee</a> — 5 wrz 2017, o 20:30</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Krauser]]></name></author>
<updated>2017-09-05T20:04:14+01:00</updated>
<published>2017-09-05T20:04:14+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19127&amp;p=194508#p194508</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19127&amp;p=194508#p194508"/>
<title type="html"><![CDATA[Re: ATmega328P - połączenie i2c ze sterownikiem LCD BU9796]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19127&amp;p=194508#p194508"><![CDATA[
<div class="quotetitle">Vroobee napisał(a):</div><div class="quotecontent"><br />czy bibliotekę soft i2c można stosować bez rezystorów podciągających ??<br /></div><br />Nie. Można by ją tak przerobić, ale wewnętrzne rezystory podciągające mają kilkukrotnie większą rezystancję. Zastosuj rezystory podciągające.<br />ACK można sprawdzić. Funkcja i2cPutbyte zwraca informację czy było potwierdzenie i na początku pracy z nowym układem należy posłać start, wysłać adres sprawdzając czy jest potwierdzenie i posłać stop. Jak to nie zadziała to należy sprawdzić czy dobrze rozumiemy co to właśnie jest ten adres.<br /><br />PS.<br />Jak już utworzyłeś  symbol LED_PIN itp. to należy się nim posługiwać, a nie dalej używać (1&lt;&lt;1). Jak zmienisz podączenie LED to będzie trzeba to wszystko przerabiać, a nie tylko jeden wpis.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=465">Krauser</a> — 5 wrz 2017, o 20:04</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Vroobee]]></name></author>
<updated>2017-09-05T19:22:31+01:00</updated>
<published>2017-09-05T19:22:31+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19127&amp;p=194503#p194503</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19127&amp;p=194503#p194503"/>
<title type="html"><![CDATA[ATmega328P - połączenie i2c ze sterownikiem LCD BU9796]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19127&amp;p=194503#p194503"><![CDATA[
Witam,<br /><br />piszę odnośnie uruchomienia wyświetlacza LCD alfanumerycznego przez sterownik BU9796. Może ktoś się z nim spotkał kiedyś ? <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> <br /><br />Mianowicie, wykorzystuję bibliotekę p. Mirka z soft i2c, chociaż mam podłączone linie TWI. Ale próbowałem zarówno z soft i2c i TWI, nic się nie udało. Próbuję wyświetlić cokolwiek na wyświetlaczu (<a href="http://www.buy-lcd.com/index.php?route=product/product&amp;product_id=13997"  class="postlink">http://www.buy-lcd.com/index.php?route=product/product&amp;product_id=13997</a>) za pomocą tego sterownika <a href="http://pl.mouser.com/ProductDetail/ROHM-Semiconductor/BU9796AMUV-E2/?qs=sGAEpiMZZMsE420DPIasPiI4UEU%252b8ZhTMD4jXNBNLFQsUyuLOVVE6g%3d%3d"  class="postlink">http://pl.mouser.com/ProductDetail/ROHM-Semiconductor/BU9796AMUV-E2/?qs=sGAEpiMZZMsE420DPIasPiI4UEU%252b8ZhTMD4jXNBNLFQsUyuLOVVE6g%3d%3d</a> <br /><br />Czytałem notę tego sterownika, na początku wszystko wydawało się proste ale teraz zastanawiam się o co chodzi z &quot;ACKNOLWLEDGE&quot; tzn. wiem, że to jest bit ACK i że po każdym wysłanym bajcie musi on wystąpić ale czy kod programu to realizuje .... wydawało mi się że tak. <br /><br />To moje pierwsze spotkanie z i2c na AVR więc proszę o wyrozumiałość. <br /><br />Jeśli ktoś miałby czas i mógłby się zapoznać z notą tego sterownika i kodem mojego programu to byłbym wdzięczny za wytknięcie błędów. I jeszcze pytanie - czy bibliotekę soft i2c można stosować bez rezystorów podciągających ?? <br /><br />main.c<br />[syntax=c]/*<br /> * main.c<br /> *<br /> *  Created on: 31 lip 2017<br /> *      Author: Vroobee<br /> */<br />#include &lt;avr/io.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;stdio.h&gt;<br />#include &lt;stdlib.h&gt;<br /><br /><br />#include &quot;BU9796Axxx/BU9796Axxx.h&quot;<br /><br />//***************CONSTANTS*****************<br /><br /><br />#define LED_DDRDDRC<br />#define LED_PORTPORTC<br />#define LED_PIN(1&lt;&lt;1)<br />#define LED_ONPORTC |= (1&lt;&lt;1)<br />#define LED_OFFPORTC &amp;=~(1&lt;&lt;1)<br />#define LED_TOGPORTC ^= (1&lt;&lt;1)<br /><br />int main(void)<br />{<br />//********OUTPUTS**********<br />LED_DDR |= LED_PIN;<br />LED_OFF;<br /><br />i2c_init();<br /><br />sei();<br /><br />I2C_START();<br />i2cPutbyte(LCD_ADDR);<br />i2cPutbyte(SOFT_RESET);<br />i2cPutbyte(BLKCTL);<br />i2cPutbyte(DISCTL);<br />i2cPutbyte(ADSET);<br />i2cPutbyte(0x00);//wysłanie przypadkowych danych<br />i2cPutbyte(0x02);<br />i2cPutbyte(0x03);<br />I2C_STOP();<br /><br /><br />while (1) {<br />_delay_ms(500);<br />LED_TOG;<br /><br />I2C_START();<br />i2cPutbyte(LCD_ADDR);<br />i2cPutbyte(DISP_ON);<br />I2C_STOP();<br />}<br />}[/syntax]<br /><br />biblioteki BU9796axxx<br />bu9796.h<br />[syntax=c]#ifndef BU9796AXXX_BU9796AXXX_H_<br />#define BU9796AXXX_BU9796AXXX_H_<br /><br />#ifndef I2C_TWI_H_<br />#define I2C_TWI_H_<br /><br />#include &quot;../makrau.h&quot;<br /><br />#define ACK 1<br />#define NACK 0<br /><br />//SOFT I2C<br />#define SCLPORTC // port zegara i2c - SCL<br />#define SDAPORTC // port danych i2c - SDA<br /><br />#define SCLPC5// i2c pin zegara<br />#define SDAPC4// i2c pin danych<br /><br />// utworzenie typu u08, odpowiednika uint8_t aby kod był bardziej czytelny<br />typedef unsigned char  u08;<br />typedef unsigned short u16;<br /><br />// i2c opóźnienie ćwierć bitu<br />#define QDEL_delay_loop_1(1)<br />// i2c opóźnienie pół bitu<br />#define HDEL_delay_loop_1(2)<br /><br />#define I2C_SDL_LO      PORT(SDAPORT) &amp;= ~(1&lt;&lt;SDA)<br />#define I2C_SDL_HI      PORT(SDAPORT) |= (1&lt;&lt;SDA)<br /><br />#define I2C_SCL_LO      PORT(SCLPORT) &amp;= ~(1&lt;&lt;SCL)<br />#define I2C_SCL_HI      PORT(SCLPORT) |= (1&lt;&lt;SCL)<br /><br />#define I2C_SCL_TOGGLE  HDEL; I2C_SCL_HI; HDEL; I2C_SCL_LO<br /><br /><br />//LCD ADRESS<br />#define LCD_ADDR0b011111100<br /><br />//**************COMMANDS****************<br /><br />// C - 1: CMD, 0: RAM<br /><br />//DISCTL register<br />//--------------------------------------<br />//   D7 D6 D5 D4 D3 D2 D1 D0<br />//    C  0  1 P4 P3 P2 P1 P0<br />//--------------------------------------<br />// PWR SAVE mode FREQUENCY<br />//                     P4 P3<br />// NORMAL_MODE 0  0<br />// PWR save 1 0  1<br />//PWR save 2 1  0<br />//PWR save 3 1  1<br />//<br />// LCD drive WAVEFORM<br />//P2<br />//LINE_INV 0<br />//FRAME_INV 1<br />//<br />// PWR SAVE mode SR<br />//P1 P0<br />//PWR save 1 0  0<br />//PWR save 2 0  1<br />//NORMAL 1  0<br />//HI_PWR 1  1<br /><br />#define DISCTL0b10100010<br /><br />//MODESET register<br />//--------------------------------------<br />//   D7 D6 D5 D4 D3 D2 D1 D0<br />//    C  1  0  * P3 P2  *  *<br />//--------------------------------------<br />// SET DISPLAY ON/OFF<br />//                     P3<br />// DISPLAY OFF 0<br />// DISPLAY ON 1<br />//<br />// SET BIAS LVL<br />//P2<br />//1/3 BIAS 0<br />//1/2 BIAS 1<br /><br />#define MODESET0b11001000<br />#define DISP_OFF0b11000000<br />#define DISP_ON0b11001000<br /><br />//ADSET register<br />//--------------------------------------<br />//   D7 D6 D5 D4 D3 D2 D1 D0<br />//    C  0  0 P4 P3 P2 P1 P0<br />//--------------------------------------<br />//The range of address can be set as 00000 to 10011<br />//Don’t set out of range address, otherwise address will be set 00000<br /><br />#define ADSET0b00000000<br /><br />//ICSET register<br />//--------------------------------------<br />//   D7 D6 D5 D4 D3 D2 D1 D0<br />//    C  1  1  0  1  * P1 P0<br />//--------------------------------------<br />// SOFT RESET EXECUTION<br />//                     P1<br />// NO OPERATION 0<br />// SOFT RESET 1<br />//<br />// OSCILATOR MODE<br />//P0<br />//INTERNAL 0<br />//EXTERNAL 1<br /><br />#define ICSET0b11101000<br />#define SOFT_RESET0b11101010<br /><br />//BLKCTL register<br />//--------------------------------------<br />//   D7 D6 D5 D4 D3 D2 D1 D0<br />//    C  1  1  1  0  * P1 P0<br />//--------------------------------------<br />// BLINK MODE<br />//                     P1 P0<br />// OFF 0  0<br />// 0.5 0  1<br />//1 1  0<br />//2 1  1<br /><br />#define BLKCTL0b11110000<br /><br />//APCTL register<br />//--------------------------------------<br />//   D7 D6 D5 D4 D3 D2 D1 D0<br />//    C  1  1  1  1  1 P1 P0<br />//--------------------------------------<br />// ALL DISPLAY SET ON/OFF<br />//                     P1<br />// NORMAL 0<br />// PIXEL ON 1<br />//<br />//P0<br />//NORMAL 0<br />//PIXEL OFF 1<br /><br />#define AP_ON0b11111110<br />#define AP_OFF0b11111101<br />#define AP_NORM0b11111100<br /><br />//********FUNKCJE****************<br />void I2C_START (void);// i2c START<br />void I2C_REP_START (void);// i2c REPEATED START<br />void I2C_STOP(void);// i2c STOP<br />void i2c_init(void);<br />u08 i2cPutbyte(u08 b);<br />u08 i2cGetbyte(uint8_t ack);<br /><br /><br />void i2cSetBitrate(uint16_t bitrateKHz);<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 />void TWI_write_buf( uint8_t SLA, uint8_t adr, uint8_t len, uint8_t *buf );<br />void TWI_read_buf(uint8_t SLA, uint8_t adr, uint8_t len, uint8_t *buf);<br /><br /><br />#endif /* I2C_TWI_H_ */<br /><br /><br />#endif /* BU9796AXXX_BU9796AXXX_H_ */[/syntax]<br /><br />bu9796.c<br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &quot;BU9796Axxx.h&quot;<br /><br /><br />void I2C_START (void) {<br />I2C_SDL_LO;<br />QDEL;<br />I2C_SCL_LO;<br />}<br /><br />void I2C_REP_START (void) {<br />HDEL;<br />I2C_SCL_HI;<br />I2C_SDL_LO;<br />QDEL;<br />I2C_SCL_LO;<br />}<br /><br />void I2C_STOP(void) {<br />I2C_SDL_LO;<br />HDEL;<br />I2C_SCL_HI;<br />QDEL;<br />I2C_SDL_HI;<br />HDEL;<br />}<br /><br />u08 i2cPutbyte(u08 b) {<br />u08 i=0x80;<br /><br />do {<br />if ( b &amp; i ) I2C_SDL_HI;<br />else I2C_SDL_LO;<br /><br />I2C_SCL_TOGGLE;<br />} while ( i &gt;&gt;= 1 );// wysyłanie bajtu<br /><br />I2C_SDL_HI;// pozostawienie SDA w stanie wysokim<br /><br />DDR(SDAPORT) &amp;= ~(1&lt;&lt;SDA);<br />HDEL;<br />I2C_SCL_HI;<br />b = PIN(SDAPORT) &amp; (1&lt;&lt;SDA);// sprawdzenie bitu ACK<br /><br />HDEL;<br />I2C_SCL_LO;<br />DDR(SDAPORT) |= (1&lt;&lt;SDA);<br />HDEL;<br />return (b == 0);//zwrócenie ACK jako rezultatu funkcji<br />}<br /><br />u08 i2cGetbyte(uint8_t ack) {<br />u08 i;<br />u08 c,b = 0;<br /><br />I2C_SDL_HI;<br />DDR(SDAPORT) &amp;= ~(1&lt;&lt;SDA);<br /><br />for(i=8;i&gt;0;i--) {<br />HDEL;<br />I2C_SCL_HI;<br />c = PIN(SDAPORT) &amp; (1&lt;&lt;SDA);<br />b &lt;&lt;= 1;<br />if(c) b |= 1;<br />HDEL;<br />I2C_SCL_LO;<br />}<br /><br />DDR(SDAPORT) |= (1&lt;&lt;SDA);<br /><br />if (ack) I2C_SDL_LO;// wyślij ACK<br />else I2C_SDL_HI;// wyślij NAK<br /><br />I2C_SCL_TOGGLE;<br />I2C_SDL_HI;<br />return b;<br />}<br /><br />void i2c_init(void) {<br />DDR(SDAPORT) |= (1&lt;&lt;SDA);<br />DDR(SCLPORT) |= (1&lt;&lt;SCL);<br />I2C_SDL_HI;<br />I2C_SCL_HI;<br />}<br /><br /><br /><br /><br />void i2cSetBitrate(uint16_t bitrateKHz) {<br />uint8_t bitrate_div;<br /><br />bitrate_div = ((F_CPU/1000l)/bitrateKHz);<br />if(bitrate_div &gt;= 16)<br />bitrate_div = (bitrate_div-16)/2;<br /><br />TWBR = bitrate_div;<br />}<br /><br />void TWI_start(void) {<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 />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 />TWDR = bajt;<br />TWCR = (1&lt;&lt;TWINT)|(1&lt;&lt;TWEN);<br />while ( !(TWCR&amp;(1&lt;&lt;TWINT)));<br />}<br /><br />uint8_t TWI_read(uint8_t ack) {<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 />}<br /><br /><br /><br />void TWI_write_buf( uint8_t SLA, uint8_t adr, uint8_t len, uint8_t *buf ) {<br /><br />TWI_start();<br />TWI_write(SLA);<br />TWI_write(adr);<br />while (len--) TWI_write(*buf++);<br />TWI_stop();<br />}<br /><br />void TWI_read_buf(uint8_t SLA, uint8_t adr, uint8_t len, uint8_t *buf) {<br /><br />TWI_start();<br />TWI_write(SLA);<br />TWI_write(adr);<br />TWI_start();<br />TWI_write(SLA + 1);<br />while (len--) *buf++ = TWI_read( len ? ACK : NACK );<br />TWI_stop();<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=5942">Vroobee</a> — 5 wrz 2017, o 19:22</p><hr />
]]></content>
</entry>
</feed>