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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2022-01-09T02:55:44+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=24093&amp;mode</id>
<entry>
<author><name><![CDATA[Robert_1967]]></name></author>
<updated>2022-01-09T02:55:44+01:00</updated>
<published>2022-01-09T02:55:44+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=24093&amp;p=234748#p234748</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=24093&amp;p=234748#p234748"/>
<title type="html"><![CDATA[Re: LCD TFT ili9341 odświeżanie wyniku z ADC na LCD]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=24093&amp;p=234748#p234748"><![CDATA[
Dzięki wielkie Draxter32 za pomoc.<br /><br />Działa wyśmienicie <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> Nie wiem, czy prawidłowo napisałem, ale wyświetlanie jest właściwe. Teraz jeszcze muszę wymyślić, jak wyświetlić bardziej przyjazne napięcie. Na poprzednich wyświetlaczach z Mirka książka nie było problemu. Tutaj muszę chwilę pogłówkować. <br /><br />Szofer.<br />Gdybyś mógł bardziej przybliżyć Twój patent. Trochę naskrobać, a ja bym dopracował. Ciekaw jestem tej metody.<br /><br />Main:<br /><br /><br />[syntax=c]char mojeDane&#91;8&#93;;[/syntax]<br /><br /><br />[syntax=c]//ili9341_setRotation(1);<br />//tft.fillScreen(ILI9341_RED);<br />ili9341_setcursor(10,40);<br />ili9341_settextcolour(ILI9341_CYAN, ILI9341_BLACK);<br />ili9341_settextsize(3);<br />printf(&quot;Dane ADC: &quot;);[/syntax]<br /><br /><br />While:<br /><br /><br />[syntax=c]int adc = pomiar(PA7);<br />sprintf(mojeDane, &quot;Dane ADC: = %4d&quot;, adc);<br />        ili9341_setcursor(10, 40);<br />        printf(mojeDane);<br />        _delay_ms(100);[/syntax]<br /><br /><br /><br /><a href="https://obrazkiforum.atnel.pl/10257/37493e593dbbaa0ac08bc7e755c4cfbd.jpg"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/10257/37493e593dbbaa0ac08bc7e755c4cfbd.jpg" alt="Obrazek" /></a><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=10257">Robert_1967</a> — 9 sty 2022, o 02:55</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Robert_1967]]></name></author>
<updated>2022-01-08T16:00:21+01:00</updated>
<published>2022-01-08T16:00:21+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=24093&amp;p=234734#p234734</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=24093&amp;p=234734#p234734"/>
<title type="html"><![CDATA[Re: LCD TFT ili9341 odświeżanie wyniku z ADC na LCD]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=24093&amp;p=234734#p234734"><![CDATA[
Dzięki wielkie za zainteresowanie i chęć pomocy.<br />Będę próbował coś z tego zastosować i dam znać. Mam tylko pytanie o delay_ms(500); w pętli. Rozumiem, że to tylko taki przykład ? No bo jeśli miałoby tak być na stałe, to wiadomo, co by się stało. Jeśli to opóźnienie jest konieczne, to mogę zrobić w przerwaniu, ale po co w ogóle ma być opóźnienie ?<br /><br />Sorry za tak banalne pytanie, ale jak pisałem wcześniej, to ten typ lcd jest dla mnie nowością i muszę się trochę przestawić z myśleniem.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=10257">Robert_1967</a> — 8 sty 2022, o 16:00</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Szofer]]></name></author>
<updated>2022-01-08T14:40:15+01:00</updated>
<published>2022-01-08T14:40:15+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=24093&amp;p=234733#p234733</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=24093&amp;p=234733#p234733"/>
<title type="html"><![CDATA[Re: LCD TFT ili9341 odświeżanie wyniku z ADC na LCD]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=24093&amp;p=234733#p234733"><![CDATA[
Ja bym podeszedl do tego tak:<br /><br />Dwa bufory, buf1=nowe dane, buf2=stare dane już wyswietlone,<br />W petli for bym je maskował jeśli w buf1 jest zapisane 0 a w buf2 jest 1 to ma być 0 (pixel zgaszony to zapisać to do buf3=gotowe do wyswietlenia<br />Natomiast jeśli w buf1 jest 1 a w buf2 jest 0 to ma być 1 i zapis do buf3,<br />Jesli w buf1 i buf2 jest 1 to do buf3 też zapis 1. Nie tracimy czasu na clf dla tft.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=7664">Szofer</a> — 8 sty 2022, o 14:40</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Draxter32]]></name></author>
<updated>2022-01-08T13:16:29+01:00</updated>
<published>2022-01-08T13:16:29+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=24093&amp;p=234732#p234732</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=24093&amp;p=234732#p234732"/>
<title type="html"><![CDATA[Re: LCD TFT ili9341 odświeżanie wyniku z ADC na LCD]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=24093&amp;p=234732#p234732"><![CDATA[
Myślę, że warto w tym przypadku wykorzystać funkcję <a href="http://adafruit.github.io/Adafruit-GFX-Library/html/class_adafruit___g_f_x.html#ab6e88c585d3ab6b4f95199361f224fc6"  class="postlink"><em>setTextColor()</em></a> z bilbioteki Adafruit GFX.<br /><br />Do problemu możona podejść np. w ten sposób:<br /><br />1. Zdefiniować bufor na dane w postaci np. tablicy <em>char mojeDane[20]</em><br />2. Do aktualizacji bufora wykorzystać funkcję <em>sprintf()</em>. Jednocześnie możesz formatować dane.<br />3. Przed wejściem do głownej pętli programu, dokonać inicjalizacji wyświetlanych danych np:<br />[syntax=c]tft.setRotation(1); <br />tft.fillScreen(ILI9341_RED); <br />tft.setTextColor(ILI9341_WHITE, ILI9341_BLACK); <br />tft.setTextSize(3); <br />tft.setCursor(10, 10); <br />tft.print(&quot;Dane ADC: &quot;);[/syntax]<br />4. W głównej pętli programu (wątku), odświeżać dane w buforze i na wyświetlaczu np.:<br />[syntax=c]int adc = adcPomiar();<br />sprintf(mojeDane,&quot;Dane ADC:  = %4d mA&quot;, adc);<br />tft.setCursor(10, 50);  <br />tft.print(mojeDena);<br />delay_ms(500);[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=8185">Draxter32</a> — 8 sty 2022, o 13:16</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Robert_1967]]></name></author>
<updated>2022-01-08T08:34:01+01:00</updated>
<published>2022-01-08T08:34:01+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=24093&amp;p=234731#p234731</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=24093&amp;p=234731#p234731"/>
<title type="html"><![CDATA[LCD TFT ili9341 odświeżanie wyniku z ADC na LCD]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=24093&amp;p=234731#p234731"><![CDATA[
Witajcie.<br />W końcu postanowiłem zgłębić tajniki obsługi wyświetlacza lcd tft. Padło na wyświetlacz 2,8&quot; na sterowniku ili9341. Sterownik uruchomiony na magistrali SPI sprzętowo.<br />Oczywiście zajęło mi sporo czasu doprowadzenie do prawidłowej komunikacji, ale się udało. Testy na atmega16 i atmega32 z kwarcem 18 432 000. Korzystam z różnych bibliotek Adafruit, arduino, które w miarę możliwości mojej skromnej wiedzy udało się zaadoptować do tego wyświetlacza. W sumie samą inicjalizację samego TFT, zasadę działania, co z czym..... w miarę dobrze rozumiem, ale niektóre &quot;rozwleczone kody&quot; nie zawsze są dla mnie w pełni jasne. Po prostu użyłem, działa i tyle.<br /><br />Wszelkie figury, linie, kropki działają prawidłowo. Tekst, pojedyncze znaki ok. Jakby podstawy ogarnąłem. Ale zaczęły się schody. kiedy zacząłem wrzucać jakieś konkretne dane np. typu pomiar z przetwornika ADC. Utworzyłem funkcję zamieniającą wynik pomiaru na string. Funkcja działa prawidłowo, czyli kręcąc potkiem mam wyświetlaną wartość od 0-1023. I tu nie mogę zakończyć tego etapu. Kiedy zmieniam wartość napięcia, to wynik staje się nie czytelny. Zamalowują się cyfry w kwadraty i takie tam różne twory.<br /><br />Jeśli dobrze rozumiem, to nie są kasowane poprzednie piksele, ponieważ kiedy wyłączę i włączę ponownie zestaw, to wynik jest prawidłowy. Rozumiem, ze trzeba w pełni zrozumieć ideę wyświetlania na takich LCD. Do tej pory używałem typowych 2x16, 4x20 znaków. Tam wyglądało to inaczej.<br /><br />Jeśli w pętli głównej najpierw wyświetlam prostokąt, jako tło i następnie na nim funkcję do pomiaru ADC, to wynik jest poprawny, czyli czyszczę ten fragment ekranu tłem, ale występuje migotanie cyfr i wiem, że to na pewno babol. Rozwiązanie tego tematu na pewno pozwoli mi ogarnąć kolejne działania z tym LCD.<br /><br />W tym miejscu proszę o wytłumaczenie, jak prawidłowo podejść do tego zagadnienia. Nie proszę o  gotowca oczywiście, ale o teoretyczne wytłumaczenie, jak się do tego zabrać, a żeby było poprawnie. Jakieś fragmenty kodu, link do przykładu, gdzie mógłbym załapać oczywiście byłoby pomocne.<br /><br />Jak to powinno wyglądać praktycznie. Z tego, co zauważyłem, to potrzebne funkcje (nazwy przykładowe) tft_string();, tft_char(); i na ich podstawie utworzenie funkcji tft_int(); którą napisałem. Są one ze sobą powiązane i zależne. Oczywiście pomijam inne funkcje pozycjonowania, pojedynczy piksel, kwadrat itp, gdzie one również żyją i są powiązane z całością.<br /><br />Akurat w tych funkcjach, które użyłem, brakuje zmiennej &quot;tło&quot; i tu jest na pewno pierwsza przyczyna. <br /><br />Proszę o pomoc, jak to rozwiązać. Zamieszczam przykładowy kod, który aktualnie stosuję. Dzięki z góry za zainteresowanie.<br /><br /><br />[syntax=c]//--------------------------------------------------------------------------------------------------------------//<br />void tft_char(unsigned char ascii, unsigned int xx0, unsigned int yy0, unsigned int size, unsigned int fgcolor) //<br />{    //<br />if((ascii&gt;=32)&amp;&amp;(ascii&lt;=127))// Characters below 32 are not printable, there are 127 of them             //<br />{                                                                                                           //<br />;// If printable do nothing//<br />}//<br />else//<br />{//<br />// If not printable write junk//<br />ascii = '?'-32;// ascii = 63-32=31//<br />}//<br />//glcd_clr(x0, y0, size);// delete before printing//<br />int i;//<br />for (i =0; i&lt;FONT_X; i++ )//<br />{//<br />// pgm_read_byte - Read a byte from the program space with a 16-bit (near) address.//<br />unsigned char temp = pgm_read_byte(&amp;simpleFont&#91;ascii-32&#93;&#91;i&#93;);// because font.c starts at 0, not 32//<br />unsigned char f=0;//<br />for(f=0;f&lt;8;f++)//<br />{//<br />if((temp&gt;&gt;f)&amp;0x01)//<br />fill_rect(xx0+i*size, yy0+f*size, size, size, fgcolor);//<br />}//<br />}//<br />}//<br />//<br />//<br />//<br />//<br />void tft_string(char *string, unsigned int xx0, unsigned int yy0, unsigned int size, unsigned int fgcolor)//<br />{//<br />while(*string)//<br />{//<br />tft_char(*string, xx0, yy0, size, fgcolor);//<br />string++;//<br />//<br />if(xx0 &lt; MAX_X)//<br />xx0 += FONT_SPACE*size;//<br />}//<br />}//<br />//--------------------------------------------------------------------------------------------------------------//<br /><br /><br />void tft_int(uint32_t val, uint16_t xx0, uint16_t yy0, uint16_t size, uint16_t fgcolor)<br />{<br />char buf&#91;16&#93;;<br />tft_string(itoa(val, buf, 10), xx0 , yy0, size, fgcolor);<br />}<br /><br /><br />//---------------------------------------------------------------------------------------------------------------//[/syntax]<br /><br /><br />Main:<br /><br /><br />[syntax=c]ili9341_init();<br />ili9341_setRotation(1)<br />display_init();adc_init();[/syntax]<br /><br />Wchile:<br /><br /><br />[syntax=c]tft_int(pomiar(PA7), 100, 100, 6, ILI9341_RED);[/syntax]<br /><br /><br />Wiem, że w tym przypadku nie ma tła.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=10257">Robert_1967</a> — 8 sty 2022, o 08:34</p><hr />
]]></content>
</entry>
</feed>