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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2019-08-10T13:06:42+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=30&amp;t=22474&amp;mode</id>
<entry>
<author><name><![CDATA[Adam12]]></name></author>
<updated>2019-08-10T13:06:42+01:00</updated>
<published>2019-08-10T13:06:42+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=22474&amp;p=221156#p221156</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=22474&amp;p=221156#p221156"/>
<title type="html"><![CDATA[Re: oled i2c]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=22474&amp;p=221156#p221156"><![CDATA[
No ja akurat mam OLED'a od Mirka ze sklepu i tam nie ma resetu. Jest to wersja tylko i2c i szczerze mówiąc dopiero teraz się zainteresowałem jak jest podłączony. <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=16417">Adam12</a> — 10 sie 2019, o 13:06</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Lex_]]></name></author>
<updated>2019-08-10T12:06:14+01:00</updated>
<published>2019-08-10T12:06:14+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=22474&amp;p=221153#p221153</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=22474&amp;p=221153#p221153"/>
<title type="html"><![CDATA[Re: oled i2c]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=22474&amp;p=221153#p221153"><![CDATA[
Dzięki za pomoc, teraz widzę jakie zmiany były potrzebne. Uruchamiałeś to na atmedze32 jakim zegarem taktowaną ?<br /> Nie wiem o co chodzi bo nadal nie uruchamia się ten wyświetlacz, może kupiłem jakiś wybrakowany szmelc. Pokombinuje jeszcze.<br /><br />Schemat połączeń:<br />OLED     -      ATB<br />------------------<br />VCC    &lt;-&gt;    VCC<br />GND    &lt;-&gt;    GND<br />DIN     &lt;-&gt;    SDA<br />CLK     &lt;-&gt;    SCL<br />RST    &lt;-&gt;    PINx<br /><br />EDIT:<br />Ogarnąłem. Musi być podłączony jeszcze reset i wysterowany tak jak miałem początkowo w inicjalizacji. Teraz ruszył. Dla potomnych - OLED 0.96 dwukolorowy 128x64px spi / i2c<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2676">Lex_</a> — 10 sie 2019, o 12:06</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Adam12]]></name></author>
<updated>2019-08-09T22:13:12+01:00</updated>
<published>2019-08-09T22:13:12+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=22474&amp;p=221148#p221148</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=22474&amp;p=221148#p221148"/>
<title type="html"><![CDATA[Re: oled i2c]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=22474&amp;p=221148#p221148"><![CDATA[
Powinno działać. Pliki nagłówkowe, oprócz i2c.h, pozostają bez zmian.<br /><br />i2c.h, i2c.c<br />[syntax=c]//deklaracje i2c.h<br />#define SSD1306_DEFAULT_ADDRESS 0x78    //zmiana adresu na 0x78<br /><br />void init(void);<br />void start(void);<br />void write(uint8_t data);<br />void stop(void);<br /><br /><br />//definicje i2c.c<br /><br />void init(void) {<br />TWSR &amp;= ~( (1&lt;&lt;TWPS1)|(1&lt;&lt;TWPS0) );//prescaler = 1<br />uint8_t bitrate = ((F_CPU/1000ul)/400);  //400kHz<br />if(bitrate &gt;= 16) bitrate = (bitrate-16+1)/2;<br />TWBR = bitrate;<br />}<br /><br />//funkcje start, stop, write w najprostszej wersji - bez kontroli błędów<br />void 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 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 write(uint8_t data) {<br />TWDR = data;<br />TWCR = (1&lt;&lt;TWINT)|(1&lt;&lt;TWEN);<br />while ( !(TWCR&amp;(1&lt;&lt;TWINT)));<br />}[/syntax]<br /><br />ssd1306.c<br />[syntax=c]uint8_t SSD1306() {<br />//start();<br />//send_Start_Command(SSD1306_SWITCHCAPVCC, SSD1306_DEFAULT_ADDRESS);<br />sendCommand(SSD1306_SWITCHCAPVCC);<br />    sendCommand(SSD1306_DISPLAYOFF);<br />    sendCommand(SSD1306_SETDISPLAYCLOCKDIV);<br />    sendCommand(0x80);<br /><br />    sendCommand(SSD1306_SETMULTIPLEX);<br />    sendCommand(0x3F);<br /><br />    sendCommand(SSD1306_SETDISPLAYOFFSET);<br />    sendCommand(0x00);<br />    sendCommand(SSD1306_SETSTARTLINE | 0x00);<br /><br />    // We use internal charge pump<br />    sendCommand(SSD1306_CHARGEPUMP);<br />    sendCommand(0x14);<br /><br />    // Horizontal memory mode<br />    sendCommand(SSD1306_MEMORYMODE);<br />    sendCommand(0x00);<br /><br />    sendCommand(SSD1306_SEGREMAP | 0x1);<br />    sendCommand(SSD1306_COMSCANDEC);<br />    sendCommand(SSD1306_SETCOMPINS);<br />    sendCommand(0x12);<br /><br />    // Max contrast<br />    sendCommand(SSD1306_SETCONTRAST);<br />    sendCommand(0xCF);<br /><br />    sendCommand(SSD1306_SETPRECHARGE);<br />    sendCommand(0xF1);<br /><br />    sendCommand(SSD1306_SETVCOMDETECT);<br />    sendCommand(0x40);<br /><br />    sendCommand(SSD1306_DISPLAYALLON_RESUME);<br /><br />    // Non-inverted display<br />    sendCommand(SSD1306_NORMALDISPLAY);<br /><br />    return 0;<br />}<br /><br />void sendCommand(uint8_t command) {<br />    start();//bit startu<br />    write(SSD1306_DEFAULT_ADDRESS);//adres OLED'a - 0x78<br />   // write(0x40);//wysyłka danych<br />    write(0x00);//wysyłka komendy<br />    write(command);<br />    stop();//bit stopu<br />}<br /><br /><br />void sendData(uint8_t data) {<br />    start();//bit startu<br />    write(SSD1306_DEFAULT_ADDRESS);//adres OLED'a - 0x78<br />    write(0x40);//wysyłka danych<br />//    write(0x00);//wysyłka komendy<br />    write(data);<br />    stop();//bit stopu<br />}<br /><br />void sendFramebuffer(uint8_t *buffer) {<br /><br />//start();//tutaj niepotrzebny<br />    sendCommand(SSD1306_COLUMNADDR); <br />    sendCommand(0x00);<br />    sendCommand(0x7F);<br /><br />    sendCommand(SSD1306_PAGEADDR);<br />    sendCommand(0x00);<br />    sendCommand(0x07);<br /><br /><br />    start();  //bit startu - sekwencja wysyłki danych<br />    <br />    // send the buffer as 16 bytes packets<br />    // buffer is 1024 bytes long, 1024/16 = 64<br />    // We have to send 64 packets<br /><br />    write(SSD1306_DEFAULT_ADDRESS);//adres OLED'a<br />    write(0x40);//wysyłka danych<br /><br />    for (uint8_t packet = 0; packet &lt; 64; packet++) {//dane z bufora<br />        for (uint8_t packet_byte = 0; packet_byte &lt; 16; ++packet_byte) {<br />            write(buffer&#91;packet*16+packet_byte&#93;);<br />        }<br /><br />    }<br />    stop();  //bit stopu - koniec wysyłki danych<br />}[/syntax]<br /><br />framebuffer.c<br />[syntax=c]void drawPixel2(uint8_t pos_x, uint8_t pos_y) {<br />    if (pos_x &gt;= SSD1306_WIDTH || pos_y &gt;= SSD1306_HEIGHT) {<br />        return;<br />    }<br /><br />    buffer&#91;pos_x+(pos_y/8)*SSD1306_WIDTH&#93; |= (1 &lt;&lt; (pos_y&amp;7));<br />//    sendFramebuffer(buffer);//wysyłanie z bufora dopiero po zapisie do bufora wszystkich pixeli<br />}[/syntax]<br /><br />main.c<br />[syntax=c]int main(void) {<br /><br />init(); //set bitrate<br />SSD1306();<br />sendCommand(SSD1306_DISPLAYON);//to może być w inicjalizacji SSD1306()<br />clear();<br /><br />//przykładowa sekwencja wysyłki danych - z pominięciem buforowania<br />start();<br />write(SSD1306_DEFAULT_ADDRESS);<br />write(0x40);<br />for (int i = 0; i &lt; 1024; ++i) {<br />write(0xFF);<br />_delay_ms(3);<br />}<br />stop();<br /><br />drawPixel(35, 35, 1);<br /><br />//rysowanie linii z zapisem całej linii do bufora, a następnie wysyłka danych z bufora - inaczej przy<br />//każdym pixelu jest wysyłany cały bufor co trwa wieki<br />drawLine(0,0,80,40);//sendFramebuffer usunięty z drawPixel2 - rysowanie do bufora<br />sendFramebuffer(buffer); //przesłanie danych z bufora do OLED'a - w tym wypadku linii utworzonej za pomocą drawLine<br /><br />while(1);<br />}<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=16417">Adam12</a> — 9 sie 2019, o 22:13</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Adam12]]></name></author>
<updated>2019-08-08T21:46:10+01:00</updated>
<published>2019-08-08T21:46:10+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=22474&amp;p=221131#p221131</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=22474&amp;p=221131#p221131"/>
<title type="html"><![CDATA[Re: oled i2c]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=22474&amp;p=221131#p221131"><![CDATA[
Ok, Twoja biblioteka już działa. Tak jak pisałem, oprócz adresu miałeś strasznie namieszane w funkcjach wysyłania komend i danych przez i2c. Poza tym w funkcji ustawiania bitrate też był błąd. Dzisiaj już nie dam rady, ale jutro postaram się to dokładniej opisać.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=16417">Adam12</a> — 8 sie 2019, o 21:46</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[xentis]]></name></author>
<updated>2019-08-08T20:42:13+01:00</updated>
<published>2019-08-08T20:42:13+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=22474&amp;p=221130#p221130</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=22474&amp;p=221130#p221130"/>
<title type="html"><![CDATA[Re: oled i2c]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=22474&amp;p=221130#p221130"><![CDATA[
<div class="quotetitle">Lex_ napisał(a):</div><div class="quotecontent"><br />na forach oprócz dokumentacji i też była mowa o adresie 0x78 ale na arduino działało właśnie na adresie 0x3C<br /></div><br />Widzisz, kluczem do zrozumienia tych rozbieżności jest zrozumienia zasady działania magistrali TWI/I2C.<br />Na początku transmisji należny zaadresować urządzenie dla którego przeznaczona jest paczka danych, i adres ten jest wysyłany w pierwszym bajcie, ale tylko 7 najstarszych bitów jest za niego odpowiedzialna, bo najmłodszy bit oznacza w zależności czy jest jedynką czy zerem, zapis bądź odczyt z urządzenia.<br />I teraz jak się przyjrzysz adresom 0x3C i 0x78 w postaci binarnej, okaże się że różnią się one tylko przesunięciem o jeden bajt:<br />0x3C =&gt; 0b00111100<br />0x78 =&gt; 0b01111000<br />Różnica jest tylko w tym że arduinowcy przyjęli sobie adres w takiej formie, że bit zapisu/odczytu na żywca wycinają i adresem nazywają to co zostało. Nie wiem może dla niektórych taki zapis jest bardziej logiczny, ale nawet chińczyki na oledach które mają możliwość wyboru adresu zapisuję je jako 0x78 lub 0x7A więc nie wiem skąd w arduino wziął się ten inny zapis, a jest to zapis nieoptymalny z punktu widzenia programu ponieważ aby wysłać taką postać adresu na magistralę trzeba zrobić dwie operacje: przesunąć bitowo o 1 w lewo i dokleić bit zapisu/odczytu:<br />[syntax=c]data = (OLED_ADRES&lt;&lt;1)|bit_zapisu; //gdzie bit zapisu przyjmuje wartości 0b00000001 lub 0b00000000, a OLED_ADRES = 0x3C czyli 0b00111100[/syntax]<br />Natomiast ta druga wersja adresu w najmłodszym bicie ma już miejsce na bit zapisu/odczytu (w adresie zapisuje się tam, czyli na najmłodszym bicie, zawsze poprostu 0) więc nie trzeba robić przesunięcia tylko wrzucenie bitu zapisu/odczytu:<br />[syntax=c]data =  OLED_ADRES|bit_zapisu; //gdzie bit zapisu przyjmuje wartości 0b00000001 lub 0b00000000, a OLED_ADRES = 0x78 czyli 0b01111000[/syntax]<br />Jak widzisz, adres można sobie zapisać na różne sposoby, trzeba tylko później odpowiednio program napisać by we właściwej formie go wysłał na magistralę TWI/I2C.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=6265">xentis</a> — 8 sie 2019, o 20:42</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Lex_]]></name></author>
<updated>2019-08-07T21:56:11+01:00</updated>
<published>2019-08-07T21:56:11+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=22474&amp;p=221087#p221087</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=22474&amp;p=221087#p221087"/>
<title type="html"><![CDATA[Re: oled i2c]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=22474&amp;p=221087#p221087"><![CDATA[
Tak jak kolega Adam12 napisał, ten pusty while jest bez znaczenia - wyżej jest funkcja która powinna zaświecić piksel, jeśli to nie działa to reszta jest zbędna. <br /><br />Podejrzewam że namieszałem, ale też już czuję że się w tym pogubiłem. Przeczytałem sporo różnych wątków na forach oprócz dokumentacji i też była mowa o adresie 0x78 ale na arduino działało właśnie na adresie 0x3C :/ w dokumentacji była mowa o wyłączeniu zasilania na czas inicjalizacji - że należy wystawić stan niski zamiast wysokiego. Efekt - TWI w ogóle nie mogło się zinicjalizować. I nie dziwi mnie to tylko po co w dokumentacji piszą takie rzeczy? Podsyłam potrzebne pliki. Mega dzięki za pomoc - na dole załącznik. <br />Hasło do archiwum tylko dla zainteresowanych.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2676">Lex_</a> — 7 sie 2019, o 21:56</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Adam12]]></name></author>
<updated>2019-08-07T19:12:41+01:00</updated>
<published>2019-08-07T19:12:41+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=22474&amp;p=221085#p221085</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=22474&amp;p=221085#p221085"/>
<title type="html"><![CDATA[Re: oled i2c]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=22474&amp;p=221085#p221085"><![CDATA[
Pętla tutaj nie ma znaczenia. Oled powinien coś wyświetlić zanim program dojdzie do pętli. Przede wszystkim zmień adres na 0x78 bo 0x3C to jest adres arduinowy na 7 bitach. Ale i tak raczej nie będzie działać bo strasznie masz namieszane. Dodaj jeszcze pliki nagłówkowe bo bez nich ciężko to uruchomić i analizować. Też teraz siedzę nad biblioteką do oleda. Postaram się pomóc i Cię naprowadzić na właściwą drogę. <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=16417">Adam12</a> — 7 sie 2019, o 19:12</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[miki53]]></name></author>
<updated>2019-08-07T18:28:33+01:00</updated>
<published>2019-08-07T18:28:33+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=22474&amp;p=221084#p221084</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=22474&amp;p=221084#p221084"/>
<title type="html"><![CDATA[Re: oled i2c]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=22474&amp;p=221084#p221084"><![CDATA[
Cześć Lex_<br /><br />Nic dziwnego że zapala się tylko dioda bo nic innego w pętli while pliku main nie masz<br />zatrzymujesz program na 10 ms zapalasz diodę i zwiększasz wartość zmiennej y2<br />o jeden aż do 255 <br /><br />nie masz ani wywołania jakiejś funkcji <br />ani nie dajesz w tej pętli nic innego do zrobienia oprócz zapalenia diody<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=18503">miki53</a> — 7 sie 2019, o 18:28</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Lex_]]></name></author>
<updated>2019-08-07T15:03:06+01:00</updated>
<published>2019-08-07T15:03:06+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=22474&amp;p=221078#p221078</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=22474&amp;p=221078#p221078"/>
<title type="html"><![CDATA[oled i2c]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=22474&amp;p=221078#p221078"><![CDATA[
Cześć<br /><br />Piszę bo już męczę to od ponad dwóch tygodni. Chcę napisać swoją bibliotekę do oled'a wykorzystując i2c. Przeczytałem dokumentację sterownika i przekonałem się, że informacje tam zawarte niestety nie sprawdzają się w praktyce. <br /><br />Zacząłem od podłączenia do arduino aby szybko przetestować wyświetlacz czy jest żywy i ruszył na bibliotekach Adafruit. Zacząłem więc pisać ją w języku C i mam już wszystko napisane tylko że wyświetlacz nadal nie wstaje. Wykorzystuje sprzętowe TWI. Może ktoś z Was zauważy co robię nie tak albo poda jakiś prosty przykład który działa ? Będę wdzięczny za każdą pomoc. Napisałem już tego sporo, kosztowało dużo czasu i chciałbym to dokończyć.<br /><br />MAIN:<br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;avr/pgmspace.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;string.h&gt;<br />#include &lt;stdlib.h&gt;<br />#include &quot;framebuffer.h&quot;<br />#include &quot;ssd1306.h&quot;<br />#include &quot;LCD/lcd44780.h&quot;<br /><br />uint8_t y2=0;<br /><br />#define LED_PIN1 (1&lt;&lt;PD6)<br />#define LED_OFF1 PORTD &amp;= ~LED_PIN1// makrodefinicja – załączenie diody<br />#define LED_ON1 PORTD |= LED_PIN1// makrodefinicja – wyłączenie diody<br />#define LED_TOG1 PORTD ^= LED_PIN1// makrodefinicja – zmiana stanu diody<br /><br />#define VCC_PIN (1&lt;&lt;PD4)<br />#define VCC_OFF PORTD &amp;= ~VCC_PIN<br />#define VCC_ON PORTD |= VCC_PIN<br />#define VCC_TOG PORTD ^= VCC_PIN<br /><br />int main(void) {<br /><br />DDRD |= (1&lt;&lt;PD7);<br />DDRD |= (1&lt;&lt;PD4) | (1&lt;&lt;PD3);<br /><br />DDRD |= LED_PIN1;<br />LED_ON1;<br />VCC_ON;<br />sei();<br />lcd_init();<br /><br />lcd_cls();<br />lcd_locate(0,0);<br /><br />init(); //set bitrate i2c<br /><br />SSD1306();<br /><br />lcd_cls();<br />lcd_locate(0,0); lcd_str(&quot; INIT OK!&quot;);<br /><br />_delay_ms(100);<br /><br />sendCommand(SSD1306_DISPLAYON);<br /><br />clear();<br />lcd_locate(1,0); lcd_str(&quot;OK&quot;);<br />drawPixel(35, 35, 1);<br /><br />show();<br /><br />while(1) {<br />    _delay_ms(10);<br /><br />    LED_OFF1; // zapal led<br /><br />    y2++;<br /><br />}<br />    return 0;<br />}[/syntax]<br /><br />SSD1306.c <br />[syntax=c]#include &lt;stdint.h&gt;<br />#include &lt;avr/io.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &quot;LCD/lcd44780.h&quot;<br />#include &quot;ssd1306.h&quot;<br /><br />#define adress_oled 0x3C<br />#define RST_PIN1 (1&lt;&lt;PD7) // dla inicjalizacji<br />#define RST_low PORTD &amp;= ~RST_PIN1<br />#define RST_hi PORTD |= RST_PIN1<br />#define RST_tog PORTD ^= RST_PIN1<br /><br />uint8_t SSD1306() {<br />// reset dla inicjalizacji<br />RST_hi;<br />_delay_ms(1);<br />RST_low;<br />_delay_ms(10);<br />RST_hi; // Reset Pin High for normal operation<br /><br />start();<br /><br />send_Start_Command(SSD1306_SWITCHCAPVCC, SSD1306_DEFAULT_ADDRESS);<br /><br />    sendCommand(SSD1306_DISPLAYOFF);<br /><br />    sendCommand(SSD1306_SETDISPLAYCLOCKDIV);<br />    sendCommand(0x80);<br /><br />    sendCommand(SSD1306_SETMULTIPLEX);<br />    sendCommand(0x3F);<br /><br />    sendCommand(SSD1306_SETDISPLAYOFFSET);<br />    sendCommand(0x00);<br /><br />    sendCommand(SSD1306_SETSTARTLINE | 0x00);<br /><br />    // We use internal charge pump<br />    sendCommand(SSD1306_CHARGEPUMP);<br />    sendCommand(0x14);<br /><br />    // Horizontal memory mode<br />    sendCommand(SSD1306_MEMORYMODE);<br />    sendCommand(0x00);<br /><br />    sendCommand(SSD1306_SEGREMAP | 0x1);<br /><br />    sendCommand(SSD1306_COMSCANDEC);<br /><br />    sendCommand(SSD1306_SETCOMPINS);<br />    sendCommand(0x12);<br /><br /><br />    // Max contrast<br />    sendCommand(SSD1306_SETCONTRAST);<br />    sendCommand(0xCF);<br /><br />    sendCommand(SSD1306_SETPRECHARGE);<br />    sendCommand(0xF1);<br /><br />    sendCommand(SSD1306_SETVCOMDETECT);<br />    sendCommand(0x40);<br /><br />    sendCommand(SSD1306_DISPLAYALLON_RESUME);<br /><br />    // Non-inverted display<br />    sendCommand(SSD1306_NORMALDISPLAY);<br /><br />    return 0;<br />}<br /><br />void sendCommand(uint8_t command) {<br />   // start();<br />    write(SSD1306_DEFAULT_ADDRESS);<br />   // write(0x40);<br />    write(command);<br />   // stop();<br />}<br /><br />void send_Start_Command(uint8_t command, uint8_t adr) {<br /><br />   write(SSD1306_DEFAULT_ADDRESS);<br />    write(command);<br /><br />}<br /><br />void inverts(uint8_t inverted) {<br /><br />    if (inverted) {<br />        sendCommand(SSD1306_INVERTDISPLAY);<br />    } else {<br />        sendCommand(SSD1306_NORMALDISPLAY);<br />    }<br /><br />}<br /><br />void sendFramebuffer(uint8_t *buffer) {<br /><br />start();<br />    sendCommand(SSD1306_COLUMNADDR);<br />    sendCommand(0x00);<br />    sendCommand(0x7F);<br /><br />    sendCommand(SSD1306_PAGEADDR);<br />    sendCommand(0x00);<br />    sendCommand(0x07);<br /><br />    //lcd_locate(1,0); lcd_str(&quot;OK?&quot;);<br /><br />     //write(0x40);<br />    start();<br />    // We have to send the buffer as 16 bytes packets<br />    // Our buffer is 1024 bytes long, 1024/16 = 64<br />    // We have to send 64 packets<br />    for (uint8_t packet = 0; packet &lt; 64; packet++) {<br />        for (uint8_t packet_byte = 0; packet_byte &lt; 16; ++packet_byte) {<br />            write(buffer&#91;packet*16+packet_byte&#93;);<br />        }<br /><br />    }<br />    stop();<br />}[/syntax]<br />i2c.c<br />[syntax=c]#include &quot;i2c.h&quot;<br />#include &lt;util/delay.h&gt;<br />#include &lt;avr/io.h&gt;<br />#include &quot;LCD/lcd44780.h&quot;<br />#include &quot;ssd1306.h&quot;<br /><br />#define LED_PIN2 (1&lt;&lt;PD3)<br />#define LED_OFF2 PORTD &amp;= ~LED_PIN2// makrodefinicja – załączenie diody<br />#define LED_ON2 PORTD |= LED_PIN2// makrodefinicja – wyłączenie diody<br />#define LED_TOG2 PORTD ^= LED_PIN2// makrodefinicja – zmiana stanu diody<br /><br />uint8_t binary;<br /><br />int init() {<br /><br />    LED_ON2;<br />    TWSR = 2;<br />    uint8_t bitrate;<br /><br />    bitrate = ((F_CPU/1000l)/100);<br />    if(bitrate &gt;= 16)<br />    bitrate = (bitrate-16)/2;<br />    //lcd_locate(0,6); lcd_int(TWPS);<br />    TWBR = bitrate;<br />    _delay_ms(1);<br /><br />return 0;<br />}<br /><br />uint8_t start() {<br />binary = (1&lt;&lt;TWSTA) | (1&lt;&lt;TWEN) | (1&lt;&lt;TWINT);<br />     TWCR = binary;<br />     TWDR = SSD1306_DEFAULT_ADDRESS;<br />   // lcd_locate(0,1); lcd_int(binary);<br /><br />    _delay_ms(1);<br /><br />    while(!(TWCR&amp;(1&lt;&lt;TWINT)));<br /><br />   twi_status_register = (TW_STATUS &amp; 0xF8);<br /><br />   //binary = (twi_status_register != TW_START) &amp;&amp; (twi_status_register != TW_REP_START);<br />  // lcd_locate(1,10); lcd_int(binary);<br />    if ((twi_status_register != TW_START) &amp;&amp; (twi_status_register != TW_REP_START)) {<br />        return 1;<br />    }<br /><br />    TWDR = SSD1306_DEFAULT_ADDRESS;<br />    TWCR = (1&lt;&lt;TWINT) | (1&lt;&lt;TWEN);<br /><br />    while(!(TWCR &amp; (1&lt;&lt;TWINT)));<br /><br />    twi_status_register = TW_STATUS &amp; 0xF8;<br />    if ((twi_status_register != TW_MT_SLA_ACK) &amp;&amp; (twi_status_register != TW_MR_SLA_ACK)) {<br />        return 1; lcd_locate(1,0); lcd_str(&quot;ERROR&quot;);<br />    }<br /><br />    return 0;<br />}<br /><br />uint8_t write(uint8_t data) {<br />    TWDR = data;<br />    TWCR = (1&lt;&lt;TWINT) | (1&lt;&lt;TWEN);<br /><br />    while(!(TWCR &amp; (1&lt;&lt;TWINT)));<br /><br />    twi_status_register = TW_STATUS &amp; 0xF8;<br />    if (twi_status_register != TW_MT_DATA_ACK) {<br />        return 1; LED_ON2;<br />    } else {<br />        return 0;<br />    }<br />}<br /><br />void 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 />}[/syntax]<br /><br />Dodam tylko że program przechodzi do pętli WHILE i zapala diode led, ale nic poza tym się nie dzieje.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2676">Lex_</a> — 7 sie 2019, o 15:03</p><hr />
]]></content>
</entry>
</feed>