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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2022-01-27T20:01:19+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=24123&amp;mode</id>
<entry>
<author><name><![CDATA[jarekryzyko]]></name></author>
<updated>2022-01-27T20:01:19+01:00</updated>
<published>2022-01-27T20:01:19+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=24123&amp;p=234942#p234942</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=24123&amp;p=234942#p234942"/>
<title type="html"><![CDATA[Wyświetlacze OLED SSD1306 i SSH1106 - różnica]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=24123&amp;p=234942#p234942"><![CDATA[
Witam,<br /><br />dostałem od klienta wyświetlacz OLED 1,3&quot; I2C opisany jako SSD1306 (nie na samym wyświetlaczu). Korzystając z wiedzy i materiałów wideo od pana Mirka chciałem stworzyć nową bibliotekę do obsługi tegoż wyświetlacza ale napotkałem problem (już rozwiązany). Nie znalazłem rozwiązania tutaj na forum, dlatego udostępniam ten post dla osób, które mogą trafić na podobny wyświetlacz.<br /><br />Mianowicie, procedura inicjalizacji za nic miała sobie komendę ustawienia trybu pamięci &quot;Set Memory Addressing Mode&quot; (0x20) i trybu &quot;Horizontal addressing mode&quot; (0x00) (czyli przeskakiwania do następnej strony po osiągnięciu prawej krawędzi ekranu). Za każdym razem podczas wysyłania bufora do pamięci wyświetlacza, dane trafiały tylko do pierwszej strony (ciągle nadpisywał górne 8 pikseli, pozostała część to szum powstały podczas uruchomienia).<br /><a href="https://obrazkiforum.atnel.pl/3941/8d81178e886562dd6c01611f3c27ccb5.JPG"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/3941/8d81178e886562dd6c01611f3c27ccb5.JPG" alt="Obrazek" /></a><br />Według noty SSD1306 jest to tryb Page Addressing Mode:<br /><a href="https://obrazkiforum.atnel.pl/3941/9dbd4d8f35eff60cbe618bb145ab1d1d.PNG"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/3941/9dbd4d8f35eff60cbe618bb145ab1d1d.PNG" alt="Obrazek" /></a><br /><br />Po przeszukaniu internetu pod tym kątem, znalazłem informację że może to być wyświetlacz oparty o sterownik SSH1106 i faktycznie tak musi być. Z tego co podejrzałem w bibliotekach do tych sterowników, adresowanie stron przeprowadzane są ręcznie co każde 128 kolumn. Czyli potrzebujemy w ciągu jednej aktualizacji bufora wysłać 8 razy komendę adresowania strony. A może istnieje możliwość ustawienia tego, tylko ja nie znalazłem?<br /><a href="https://obrazkiforum.atnel.pl/3941/a944cf223d2553afd2076208f7d9d99c.JPG"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/3941/a944cf223d2553afd2076208f7d9d99c.JPG" alt="Obrazek" /></a><br />Według noty SSD1306 powinno to działać z automatu gdy ustawimy tryb Horizontal Addressing Mode (ale nie działa)<br /><a href="https://obrazkiforum.atnel.pl/3941/67e6b6996f7cdb9b7b55addf2724f05d.PNG"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/3941/67e6b6996f7cdb9b7b55addf2724f05d.PNG" alt="Obrazek" /></a><br /><br />Wyświetlacz o którym mowa:<br /><a href="https://obrazkiforum.atnel.pl/3941/67430efac2d4cd6ceccdd0432ea60221.JPG"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/3941/67430efac2d4cd6ceccdd0432ea60221.JPG" alt="Obrazek" /></a><br /><br />Przedstawiam przykładowy kod, gdyby ktoś spotkał się z podobnym problemem:<br />[syntax=c]//Inicjalizacja wyświetlacza<br />void SSH1106_init()<br />{<br />static const uint8_t SSH1106_initData&#91;&#93; PROGMEM = {<br />SSH1106_DISPLAYOFF,<br />SSH1106_SETDISPLAYCLOCKDIV, 0xB0,<br />SSH1106_SETDISPLAYOFFSET, 0x00,<br />SSH1106_CHARGEPUMP, 0x14,<br />SSH1106_SEGREMAP,<br />SSH1106_COMSCANDEC,<br />SSH1106_SETCONTRAST, 0x80,<br />SSH1106_SETPRECHARGE, 0x22,<br />SSH1106_SETMULTIPLEX, 0x3F,<br />SSH1106_SETCOMPINS, 0x12,<br />SSH1106_SETVCOMDETECT, 0x40,<br />SSH1106_NORMALDISPLAY,<br />SSH1106_DISPLAYON<br />};<br />_delay_ms(100); //Initial delay for display<br />SSH1106_writeCommands_P(SSH1106_initData, sizeof(SSH1106_initData));<br />}<br /><br />//Wysłanie bufora do wyświetlacza<br />void SSH1106_display()<br />{<br />uint8_t *buf = SSH1106_buffer;<br /><br />static const uint8_t commands&#91;&#93; PROGMEM = {<br />SSH1106_COLUMNADDR, 0x00, 0x7F,<br />SSH1106_PAGEADDR, 0x00, 0x07,<br />SSH1106_SETSTARTLINE<br />};<br />SSH1106_writeCommands_P(commands, sizeof(commands));<br /><br />for (uint8_t page = 0; page &lt; 8; page++) {<br />TWI_start();<br />TWI_write(SSH1106_I2C_ADDR); //Send display address<br />TWI_write(0x00); //Command<br />TWI_write(SSH1106_PAGESTARTADDRESS + page);<br />TWI_write(0x02);<br />TWI_write(0x10);<br />TWI_stop();<br />TWI_start();<br />TWI_write(SSH1106_I2C_ADDR); //Send display address<br />TWI_write(0x40); //Data<br />for (uint8_t col = 0; col &lt; 128; col++) {<br />TWI_write(*buf++);<br />}<br />TWI_stop();<br />}<br />}<br /><br />//Funkcja do wysyłania komend z pamięci flash<br />void SSH1106_writeCommands_P(const uint8_t *commands, uint8_t len)<br />{<br />TWI_start();<br />TWI_write(SSH1106_I2C_ADDR); //Send display address<br />TWI_write(0x00); //Command<br />while (len--) TWI_write(pgm_read_byte(commands++));<br />TWI_stop();<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3941">jarekryzyko</a> — 27 sty 2022, o 20:01</p><hr />
]]></content>
</entry>
</feed>