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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2015-04-17T00:00:01+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=11405&amp;mode</id>
<entry>
<author><name><![CDATA[żbik]]></name></author>
<updated>2015-04-17T00:00:01+01:00</updated>
<published>2015-04-17T00:00:01+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=11405&amp;p=126728#p126728</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=11405&amp;p=126728#p126728"/>
<title type="html"><![CDATA[Re: SSD1306 I2C, nie zapisuje całego bufora + losowy x0,y0]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=11405&amp;p=126728#p126728"><![CDATA[
No tak:)<br />A człowiek szuka tam gdzie nie trzeba;)<br />ehh..<br /><br />Dzięki za klapsa na otrzeźwienie;)<br /><br />pzdr<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=88">żbik</a> — 17 kwi 2015, o 00:00</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[anshar]]></name></author>
<updated>2015-04-16T23:42:28+01:00</updated>
<published>2015-04-16T23:42:28+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=11405&amp;p=126727#p126727</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=11405&amp;p=126727#p126727"/>
<title type="html"><![CDATA[Re: SSD1306 I2C, nie zapisuje całego bufora + losowy x0,y0]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=11405&amp;p=126727#p126727"><![CDATA[
Aby poprawnie działał Ci ten wyświetlacz potrzebujesz procesora z większą pamięcią SRAM, ten, który używasz ma tylko 1kb, czyli 1024bajty. A na sam bufor wyświetlacza tyle potrzebujesz. A gdzie miejsce na inne dane i stos? Weź np. Atmega328p, która ma 2kb pamięci SRAM i powinno ruszyć. Miałem ten sam problem z Atmega16(1kb SRAM), dokładnie ten sam objaw co u Ciebie. <img src="https://forum.atnel.pl/images/smilies/icon_e_biggrin.gif" alt=":D" title="Bardzo szczęśliwy" /> <br />Zobacz tu:<br /><a href="http://forum.atnel.pl/topic8344-30.html"  class="postlink">http://forum.atnel.pl/topic8344-30.html</a><br /><a href="http://forum.atnel.pl/topic7982.html"  class="postlink">http://forum.atnel.pl/topic7982.html</a><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=7157">anshar</a> — 16 kwi 2015, o 23:42</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[żbik]]></name></author>
<updated>2015-04-16T23:10:15+01:00</updated>
<published>2015-04-16T23:10:15+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=11405&amp;p=126723#p126723</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=11405&amp;p=126723#p126723"/>
<title type="html"><![CDATA[SSD1306 I2C, nie zapisuje całego bufora + losowy x0,y0]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=11405&amp;p=126723#p126723"><![CDATA[
Próbuję okiełznać to maleństwo i niestety się zaciąłem. <br />Inicjalizacja raczej prawidłowa. Jest ładny szum.<br />Po wyświetleniu pustego bufora, zostaje mały fragment nieodszumiony:<br /><a href="http://forum.atnel.pl/_obrazki/o/88/d6cd97440c81c5b4136140aa4200e662.jpg"  class="postlink"><img src="http://forum.atnel.pl/_obrazki/o/thumb/88/d6cd97440c81c5b4136140aa4200e662.jpg" alt="Obrazek" /></a><br />Jeśli w buforze jest np. przykładowy obrazek z &quot;equalizerem atnel&quot;, to przy pierwszym uruchomieniu zaszumiony jest ten sam fragment, ale po resecie procesora obraz przesuwa się losowo w pionie. X0, Y0 nie są w górnym lewym rogu.<br /><br />Podobnie przy rysowaniu linii jak w załączonym filmiku.<br />Podczas rysowania widać fruwające bity w &quot;zaszumionym&quot; fragmencie.<br /><br />Co skleciłem:<br />I2C_TWI.h<br />[syntax=c]#ifndef I2C_TWI_H_<br />#define I2C_TWI_H_<br /><br />#define ACK 1<br />#define NACK 0<br /><br /><br /><br />// funkcje<br /><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 />void TWI_write_buf( uint8_t SLA, uint8_t adr, uint16_t len, uint8_t *buf );<br />void TWI_read_buf(uint8_t SLA, uint8_t adr, uint16_t len, uint8_t *buf);<br /><br />#endif /* I2C_TWI_H_ */[/syntax]<br />I2C_TWI.c<br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &quot;i2c_twi.h&quot;<br /><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, uint16_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 /><br /><br />void TWI_read_buf(uint8_t SLA, uint8_t adr, uint16_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] <br />ssd1306.h<br />[syntax=c]#ifndef SSD1306_H_<br />#define SSD1306_H_<br /><br />// Rozdzielczoć LCD  / OLED<br /><br />#define SSD1306_128_64<br />//#define SSD1306_128_32<br /><br />#define OLED_I2C_ADDRESS 0x78           // lub 0x7A<br /><br />//definicej wysokoci wywietlaczy<br /><br />#define SSD1306_WIDTH                   128<br /><br />#if defined SSD1306_128_64<br />#define SSD1306_HEIGHT                  64<br />#endif<br /><br />#if defined SSD1306_128_32<br />#define SSD1306_HEIGHT                  32<br />#endif<br /><br />//szybkoci odswieżania<br /><br />#define REFRESH_MIN     0x80<br />#define REFRESH_MID     0xB0<br />#define REFRESH_MAX     0xF0<br /><br />//                      DEFINICJE KOMNEND<br /><br />#define SSD1306_SETCONTRAST 0x81<br />#define SSD1306_DISPLAYALLON_RESUME 0xA4<br />#define SSD1306_DISPLAYALLON 0xA5<br />#define SSD1306_NORMALDISPLAY 0xA6<br />#define SSD1306_INVERTDISPLAY 0xA7<br />#define SSD1306_DISPLAYOFF 0xAE<br />#define SSD1306_DISPLAYON 0xAF<br /><br />#define SSD1306_SETDISPLAYOFFSET 0xD3<br />#define SSD1306_SETCOMPINS 0xDA<br /><br />#define SSD1306_SETVCOMDETECT 0xDB<br /><br />#define SSD1306_SETDISPLAYCLOCKDIV 0xD5<br />#define SSD1306_SETPRECHARGE 0xD9<br /><br />#define SSD1306_SETMULTIPLEX 0xA8<br /><br />#define SSD1306_SETLOWCOLUMN 0x00<br />#define SSD1306_SETHIGHCOLUMN 0x10<br /><br />#define SSD1306_SETSTARTLINE 0x40<br /><br />#define SSD1306_MEMORYMODE 0x20<br />#define SSD1306_COLUMNADDR 0x21 //??<br />#define SSD1306_PAGEADDR   0x22 //??<br /><br />#define SSD1306_COMSCANINC 0xC0<br />#define SSD1306_COMSCANDEC 0xC8<br /><br />#define SSD1306_SEGREMAP 0xA0<br /><br />#define SSD1306_CHARGEPUMP 0x8D<br /><br />#define SSD1306_EXTERNALVCC 0x1<br />#define SSD1306_SWITCHCAPVCC 0x2<br /><br />// Scrolling #defines<br />#define SSD1306_ACTIVATE_SCROLL 0x2F<br />#define SSD1306_DEACTIVATE_SCROLL 0x2E<br />#define SSD1306_SET_VERTICAL_SCROLL_AREA 0xA3<br />#define SSD1306_RIGHT_HORIZONTAL_SCROLL 0x26<br />#define SSD1306_LEFT_HORIZONTAL_SCROLL 0x27<br />#define SSD1306_VERTICAL_AND_RIGHT_HORIZONTAL_SCROLL 0x29<br />#define SSD1306_VERTICAL_AND_LEFT_HORIZONTAL_SCROLL 0x2A<br /><br />//deklaracje funkcji<br /><br />void ssd1306_Init ( uint8_t vcc, uint8_t refresh);              //inicjalizacja wyswietlacza<br />void ssd1306_cmd (uint8_t cmd);                                                 //wysyłanie komend<br />void ssd1306_data ( uint8_t dat );                                              //wysyłanie danych<br />void ssd1306_display (void);                                                    //wysyłanie danych do bufora<br />void ssd1306_setPixel( int x , int y , uint8_t bw);     //zapalenie pixela<br /><br />#endif /* SSD1306_H_ */[/syntax]<br />ssd1306.c<br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;avr/pgmspace.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &lt;string.h&gt;<br /><br />#include &quot;ssd1306.h&quot;<br /><br /><br />//definicja buforu<br /><br />uint8_t ssd1306_buf&#91;1024&#93; = {<br />};<br /><br />void ssd1306_cmd (uint8_t cmd){<br />uint8_t control = 0x00;<br />TWI_start();<br />TWI_write(OLED_I2C_ADDRESS);<br />TWI_write(control);<br />TWI_write(cmd);<br />TWI_stop();<br />}<br /><br />void ssd1306_data ( uint8_t dat ){<br />uint8_t control = 0x40;<br />TWI_start();<br />TWI_write(OLED_I2C_ADDRESS);<br />TWI_write(control);<br />TWI_write(dat);<br />TWI_stop();<br />}<br /><br />void ssd1306_Init ( uint8_t vcc, uint8_t refresh) {<br />//komendy inicjalizujace<br />ssd1306_cmd(SSD1306_DISPLAYOFF);<br />ssd1306_cmd(SSD1306_SETDISPLAYCLOCKDIV);<br />ssd1306_cmd(refresh);<br /><br />ssd1306_cmd(SSD1306_SETDISPLAYOFFSET);<br />ssd1306_cmd(0x0);<br />ssd1306_cmd(SSD1306_SETSTARTLINE | 0x00);<br />ssd1306_cmd(SSD1306_CHARGEPUMP);<br /><br />if (vcc == SSD1306_EXTERNALVCC ) ssd1306_cmd(0x10);<br />else ssd1306_cmd(0x14);<br /><br />ssd1306_cmd(SSD1306_MEMORYMODE);<br />ssd1306_cmd(0x00);<br />ssd1306_cmd(SSD1306_SEGREMAP | 0x1 );<br />ssd1306_cmd(SSD1306_COMSCANDEC);<br /><br />ssd1306_cmd(SSD1306_SETCONTRAST);<br /><br />if (vcc == SSD1306_EXTERNALVCC) ssd1306_cmd(0x9F);<br />else ssd1306_cmd(0xCF);<br /><br />ssd1306_cmd(SSD1306_SETPRECHARGE);<br /><br />//ssd1306 128 x 32<br />#if defined SSD1306_128_32<br />ssd1306_cmd(SSD1306_SETMULTIPLEX);<br />ssd1306_cmd(0x1F);<br /><br />ssd1306_cmd(SSD1306_SETCOMPINS);<br />ssd1306_cmd(0x02);<br />#endif<br /><br />//ssd1306 128 x 64<br />#if defined SSD1306_128_64<br />ssd1306_cmd(SSD1306_SETMULTIPLEX);<br />ssd1306_cmd(0x3F);<br /><br />ssd1306_cmd(SSD1306_SETCOMPINS);<br />ssd1306_cmd(0x12);<br />#endif<br /><br />ssd1306_cmd(SSD1306_DISPLAYALLON_RESUME);<br />ssd1306_cmd(SSD1306_NORMALDISPLAY);<br />ssd1306_cmd(SSD1306_DISPLAYON);<br />}<br /><br />//wysyłanie danych do buforu<br />void ssd1306_display (void){<br /><br />ssd1306_cmd(SSD1306_SETLOWCOLUMN | 0x0);<br />ssd1306_cmd(SSD1306_SETHIGHCOLUMN | 0x0);<br />ssd1306_cmd(SSD1306_SETSTARTLINE | 0x0);<br />TWI_write_buf(OLED_I2C_ADDRESS, 0x40 , 1024 , ssd1306_buf);<br />}<br /><br />//rysowanie piksela<br />void ssd1306_setPixel( int x , int y , uint8_t bw){<br />if ((x &lt; 0) || (x &gt;= SSD1306_WIDTH) || (y &lt; 0) || (y &gt;= SSD1306_HEIGHT))<br />return;<br />if (bw) ssd1306_buf&#91;x + (y/8)*SSD1306_WIDTH&#93; |= (1&lt;&lt;(y%8));<br />else ssd1306_buf&#91;x + (y/8)*SSD1306_WIDTH&#93; &amp;= ~(1&lt;&lt;(y%8));<br />}[/syntax]<br />oled_test.c<br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;avr/delay.h&gt;<br />#include &quot;I2C_TWI/i2c_twi.h&quot;<br />#include &quot;OLED_LIB/ssd1306.h&quot;<br /><br />int main(void)<br />{<br /><br />ssd1306_Init(SSD1306_SWITCHCAPVCC, REFRESH_MID);<br />ssd1306_display();<br />uint8_t a=1;<br /><br />    while(1)<br />    {<br />for (uint8_t i=0;i&lt;128;i++)<br />{<br />ssd1306_setPixel(i,10,a);<br />ssd1306_display();<br />}<br />if (a==1) {a=0;}<br />else a=1;      <br />    }<br />}[/syntax]<br /><br />Działam na płytce zl2avr i AtMega 168. Wyświetlacz od &quot;naszego&quot; Mirka.<br /><br />pzdr<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=88">żbik</a> — 16 kwi 2015, o 23:10</p><hr />
]]></content>
</entry>
</feed>