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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2018-02-17T21:53:17+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=20239&amp;mode</id>
<entry>
<author><name><![CDATA[gordon10]]></name></author>
<updated>2018-02-17T21:53:17+01:00</updated>
<published>2018-02-17T21:53:17+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=20239&amp;p=204118#p204118</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=20239&amp;p=204118#p204118"/>
<title type="html"><![CDATA[Re: Przerobienie funkcji drukowania stringów]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=20239&amp;p=204118#p204118"><![CDATA[
Jeszcze mały problem widzę z przesuwaniem tekstu na pozycję x. Może jutro nad tym posiedzę. Teraz chyba czas na mały reset  <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=968">gordon10</a> — 17 lut 2018, o 21:53</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[gordon10]]></name></author>
<updated>2018-02-17T20:36:03+01:00</updated>
<published>2018-02-17T20:36:03+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=20239&amp;p=204105#p204105</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=20239&amp;p=204105#p204105"/>
<title type="html"><![CDATA[Re: Przerobienie funkcji drukowania stringów]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=20239&amp;p=204105#p204105"><![CDATA[
No niestety. Też to nie działa. Drukuje całkiem pustą linię. Coś tu cholewa jeszcze pewnie umknęło po drodze...<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 46 minutach ]</span></strong><br /><br />Działa działa <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" />:):)<br />Wcześniej zapomniałem zmienić jeszcze tą linijkę: znak = pgm_read_ptr(str); na taką jak podpowiedział andrews: znak = str;<br /><br />Tylko jeszcze mała zagadka. Teraz działa, ale pokazuje warning<br />warning: assignment discards 'const' qualifier from pointer target type<br />Dlaczego i jak go zlikwidować?<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 52 minutyach ]</span></strong><br /><br />ok przy deklaracji dopisałem const i warning zniknął<br />const char * znak;<br /><br />Trochę już mózg mi się przegrzał i przestaję czaić dlaczego to tak musi być, ale tak to jest jak do programowania się siada raz na jakiś czas. Najważniejsze, że działa. <br /><br />Dzięki andrews. Będę musiał prześledzić twój poradnik i przerzucić się na kwalifikator __flash.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=968">gordon10</a> — 17 lut 2018, o 20:36</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[gordon10]]></name></author>
<updated>2018-02-17T18:44:44+01:00</updated>
<published>2018-02-17T18:44:44+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=20239&amp;p=204096#p204096</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=20239&amp;p=204096#p204096"/>
<title type="html"><![CDATA[Re: Przerobienie funkcji drukowania stringów]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=20239&amp;p=204096#p204096"><![CDATA[
No racja kolego andrews <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br />Skupiłem się na tej jednej linijce ze wskaźnikiem znak=...., a reszta jakoś tak umknęła...<br />Jak usiądę do sprzętu to sprawdzę i dam znać czy hula.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=968">gordon10</a> — 17 lut 2018, o 18:44</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[andrews]]></name></author>
<updated>2018-02-17T18:01:12+01:00</updated>
<published>2018-02-17T18:01:12+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=20239&amp;p=204092#p204092</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=20239&amp;p=204092#p204092"/>
<title type="html"><![CDATA[Re: Przerobienie funkcji drukowania stringów]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=20239&amp;p=204092#p204092"><![CDATA[
[syntax=c]void tprint_print_str_P (int x, const char *str) {<br />    //...<br />    const char * znak;            // wskaznik na znak w stringu<br />    //...<br />    <br />    <br />    for (i=0; i &lt; FONT_HEIGHT; i++) {<br />        <br />        znak = str;  // wskaznik znak ma wskazywac na adres pierwszego znaku stringa (powrot do 1 znaku po obiegu ponizszych petli)<br />        //...<br />        <br />        while( pgm_read_byte(znak) ) {<br />            charAddr = ( pgm_read_byte(znak++) - BEGIN_CHAR) * FONT_SKIP_ADDR;   // oblicza poczatkowy adres danego znaku ze stringa<br />            <br />            // ...<br />        } // while<br />    //...<br />    <br />} // END tprint_print_str_P[/syntax]<br /><br />Gdyby Cię to interesowało, to w poniższym poradniku masz opisane w jaki sposób napisać jedną funkcję, która obsłuży jednocześnie dane z pamięci RAM i z pamięci FLASH.<br /><br />_________________<br /><a href="http://forum.atnel.pl/topic19149.html#p194736"  class="postlink">AVR-GCC - dane w pamięci FLASH</a><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=14165">andrews</a> — 17 lut 2018, o 18:01</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[gordon10]]></name></author>
<updated>2018-02-17T12:55:47+01:00</updated>
<published>2018-02-17T12:55:47+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=20239&amp;p=204075#p204075</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=20239&amp;p=204075#p204075"/>
<title type="html"><![CDATA[Re: Przerobienie funkcji drukowania stringów]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=20239&amp;p=204075#p204075"><![CDATA[
No niestety... nie drukuje nadal. Chyba coś jeszcze skopałem. Chociaż warningu już nie wywala.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=968">gordon10</a> — 17 lut 2018, o 12:55</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[gordon10]]></name></author>
<updated>2018-02-17T09:31:54+01:00</updated>
<published>2018-02-17T09:31:54+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=20239&amp;p=204068#p204068</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=20239&amp;p=204068#p204068"/>
<title type="html"><![CDATA[Re: Przerobienie funkcji drukowania stringów]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=20239&amp;p=204068#p204068"><![CDATA[
Ta spacja po * nie ma znaczenia...<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 8 minutach ]</span></strong><br /><br />Już chyba mam to <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br />chodziło o magiczny zapis:<br /> znak = pgm_read_ptr(str);<br /><br />później przetestuję na żywym organizmie.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=968">gordon10</a> — 17 lut 2018, o 09:31</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[gizmo5418]]></name></author>
<updated>2018-02-17T09:46:54+01:00</updated>
<published>2018-02-17T09:21:09+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=20239&amp;p=204067#p204067</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=20239&amp;p=204067#p204067"/>
<title type="html"><![CDATA[Re: Przerobienie funkcji drukowania stringów]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=20239&amp;p=204067#p204067"><![CDATA[
Witaj,<br /><br />Ach, z tą spacją po * się zapędziłem....<br /><br />Jaką wartość zwraca funkcja<br />[syntax=c]pgm_read_byte(str);[/syntax]<br />Znak, czy wskaźnik do znaku ?<br /><br /><strong>znak</strong> masz jako<br />[syntax=c]char * znak;            // wskaznik na znak w stringu[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1967">gizmo5418</a> — 17 lut 2018, o 09:21</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[gordon10]]></name></author>
<updated>2018-02-17T08:47:40+01:00</updated>
<published>2018-02-17T08:47:40+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=20239&amp;p=204065#p204065</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=20239&amp;p=204065#p204065"/>
<title type="html"><![CDATA[Re: Przerobienie funkcji drukowania stringów]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=20239&amp;p=204065#p204065"><![CDATA[
<div class="quotetitle">gordon10 napisał(a):</div><div class="quotecontent"><br />A tak nie było by dobrze ?<br /><br />    void tprint_print_str_P (int x, const char * str)<br /></div><br />Właśnie taką postać ma funkcja docelowa. Wcześniej wkleiłem funkcję drukującą string z pamięci RAM.<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 5 minutach ]</span></strong><br /><br />OK. wklejam funkcję docelową (drukującą z PROGMEM).<br /><br />[syntax=c]void tprint_print_str_P (int x, const char *str) {<br /><br />uint8_t i, j;// zmienne iteracyjne do petli for i-pozY, j-pozX,<br />int l, shift_x;// przesuniecie str po osi X<br />uint8_t data, k;// aktualny bit danych, k-size<br />uint8_t charWidth = (FONT_WIDTH + 7) / 8;// szerokosc znaku w bajtach<br />uint16_t charAddr;// adres poczatku znaku w tablicy font...&#91;&#93;<br />char * znak;// wskaznik na znak w stringu<br /><br />// bezpieczniki<br />if (x &gt;= LINE_DOTS) x = LINE_DOTS - FONT_WIDTH * strlen(str);// jesli pozycja x wychodzi poza rozmiar linii to wyrownuje do prawej<br />shift_x = LINE_DOTS - FONT_WIDTH * strlen(str) - x;// obliczenie przesuniecia x<br /><br /><br />for (i=0; i &lt; FONT_HEIGHT; i++) {// petla po Y<br /><br />znak = pgm_read_byte(str);// wskaznik znak ma wskazywac na adres pierwszego znaku stringa (powrot do 1 znaku po obiegu ponizszych petli)<br />k = 0;// tymczasowo zmienna przechowuje numer znaku ze stringa<br /><br />while(*znak) {// petla leci po kolejnych znakach<br />charAddr = ((*znak++) - BEGIN_CHAR) * FONT_SKIP_ADDR;// oblicza poczatkowy adres danego znaku ze stringa<br /><br />for (j=0; j &lt; FONT_WIDTH; j++) {// petla po X kolejnych znakow<br /><br />// warunek: x + (nr_znaku*FONT_WIDTH) + j &gt;= LINE_DOTS<br />if( (x + k*FONT_WIDTH + j) &gt;= LINE_DOTS ) break;// wyjscie/obciecie czesci obrazka poza wydruk na prawo<br /><br />CLK_LO;<br />// obliczenia do kolejnego bitu<br />//adr 1 elem tablicy font + adr znaku + bajt znaku   &amp;  bit bajtu znaku<br />data = pgm_read_byte (FONT_NAME + charAddr + (i*charWidth) + j/8 ) &amp; ( 128 &gt;&gt; (j &amp; 7));<br />// zapis bitu do rejestru<br />if (data) { DI_HI; } else { DI_LO; }<br />CLK_HI;<br /><br />}// j loop<br /><br />k++;// kolejny znak<br />}// while<br /><br /><br />// przesuwanie char na pozycje x<br />DI_LO;<br />for(l=0; l &lt; shift_x; l++) {// petla przesuwajaca str na dana pozycje X = LINE_DOTS-width-x<br />CLK_LO;<br />nop; CLK_HI;<br />}//l loop<br /><br />tprint_latch_reg();// zatrzask<br />tprint_heating(1);// praca grzalek<br />if ( x &gt; shift_x )tprint_clear_shift_reg();  // czysci rejestr jak potrzeba<br /><br />}// i loop<br /><br />//tprint_clear_shift_reg();  // czysci rejestr jak potrzeba<br /><br />}// END tprint_print_str_P[/syntax]<br /><br />w linii: znak = pgm_read_byte(str); wywala warning: assignment makes pointer from integer without a cast<br />pewnie dlatego, że chodzi o to, żeby do wskaźnika 'znak' zapisać<strong> adres</strong> pierwszego elementu drukowanego stringa a nie wartość tego elementu.<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 19 minutach ]</span></strong><br /><br />Przy takim zapisie:<br />znak = pgm_read_byte(&amp;str);<br />też wywala warning:<br />warning: assignment makes pointer from integer without a cast<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=968">gordon10</a> — 17 lut 2018, o 08:47</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[gizmo5418]]></name></author>
<updated>2018-02-17T08:43:04+01:00</updated>
<published>2018-02-17T08:43:04+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=20239&amp;p=204063#p204063</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=20239&amp;p=204063#p204063"/>
<title type="html"><![CDATA[Re: Przerobienie funkcji drukowania stringów]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=20239&amp;p=204063#p204063"><![CDATA[
Witaj,<br /><br />A tak nie było by dobrze ?<br /><br />[syntax=c]void tprint_print_str_P (int x, const char * str)[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1967">gizmo5418</a> — 17 lut 2018, o 08:43</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[gordon10]]></name></author>
<updated>2018-02-17T08:20:33+01:00</updated>
<published>2018-02-17T08:20:33+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=20239&amp;p=204059#p204059</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=20239&amp;p=204059#p204059"/>
<title type="html"><![CDATA[Re: Przerobienie funkcji drukowania stringów]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=20239&amp;p=204059#p204059"><![CDATA[
<div class="quotetitle">gordon10 napisał(a):</div><div class="quotecontent"><br />Nie bardzo wiem jak robisz, że Tobie nie wychodzi?? Robisz tak??<br /><br />znak=pgm_read_byte(str);<br /></div><br /><br />Właśnie tak zrobiłem i wywala warning:<br />warning: assignment makes pointer from integer without a cast<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=968">gordon10</a> — 17 lut 2018, o 08:20</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[skalarro]]></name></author>
<updated>2018-02-16T22:48:35+01:00</updated>
<published>2018-02-16T22:48:35+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=20239&amp;p=204042#p204042</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=20239&amp;p=204042#p204042"/>
<title type="html"><![CDATA[Re: Przerobienie funkcji drukowania stringów]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=20239&amp;p=204042#p204042"><![CDATA[
<div class="quotetitle">gordon10 napisał(a):</div><div class="quotecontent"><br />// warning wywala przy probie zapisania do wskaźnika znak = (adres pierwszego znaku stringa z flash)<br /></div><br /><br />Nie bardzo wiem jak robisz, że Tobie nie wychodzi?? Robisz tak??<br /><br />znak=pgm_read_byte(str);<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=4850">skalarro</a> — 16 lut 2018, o 22:48</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[gordon10]]></name></author>
<updated>2018-02-16T22:26:33+01:00</updated>
<published>2018-02-16T22:26:33+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=20239&amp;p=204040#p204040</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=20239&amp;p=204040#p204040"/>
<title type="html"><![CDATA[Przerobienie funkcji drukowania stringów]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=20239&amp;p=204040#p204040"><![CDATA[
Witam,<br />Ostatnio testuję drukarkę termiczną z kasy fiskalnej. Piszę do niej bibliotekę i utknąłem na funkcji drukującej tekst z pamięci flash. <br />Funkcja [syntax=c]void tprint_print_str (int x, char *str);[/syntax] drukująca tekst z RAM-u działa w porządku, ale coś mnie przyćmiło przy przerabianiu jej na funkcję [syntax=c]void tprint_print_str_P (int x, const char *str);[/syntax] drukującej tekst z PROGMEM.<br /><br /><br />Pewnie chodzi o jakąś pierdołę w zapisie... Czy ktoś coś podpowie, naprowadzi na właściwy trop?<br /><br />[syntax=c]// biblioteki<br />#include &lt;avr/io.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;avr/pgmspace.h&gt;<br />#include &lt;string.h&gt;<br /><br />/*<br />*/<br /><br />void tprint_print_str (int x, char *str) {<br /><br />uint8_t i, j;// zmienne iteracyjne do petli for i-pozY, j-pozX,<br />int l, shift_x;// przesuniecie str po osi X<br />uint8_t data, k; // aktualny bit danych, k-size<br />uint8_t charWidth = (FONT_WIDTH + 7) / 8;// szerokosc znaku w bajtach<br />uint16_t charAddr;// adres poczatku znaku w tablicy font...&#91;&#93;<br />char * znak;// wskaznik na znak w stringu<br /><br />// bezpieczniki<br />if (x &gt;= LINE_DOTS) x = LINE_DOTS - FONT_WIDTH * strlen(str);// jesli pozycja x wychodzi poza rozmiar linii to wyrownuje do prawej<br />shift_x = LINE_DOTS - FONT_WIDTH * strlen(str) - x;// obliczenie przesuniecia x<br /><br /><br />for (i=0; i &lt; FONT_HEIGHT; i++) {// petla po Y<br /><br />znak = str;// wskaznik znak ma wskazywac na adres pierwszego znaku stringa (powrot do 1 znaku po obiegu ponizszych petli)<br />k = 0;// tymczasowo zmienna przechowuje numer znaku ze stringa<br /><br />while(*znak) {// petla leci po kolejnych znakach<br />charAddr = ((*znak++) - BEGIN_CHAR) * FONT_SKIP_ADDR;// oblicza poczatkowy adres danego znaku ze stringa<br /><br />for (j=0; j &lt; FONT_WIDTH; j++) {// petla po X kolejnych znakow<br /><br />// warunek: x + (nr_znaku*FONT_WIDTH) + j &gt;= LINE_DOTS<br />if( (x + k*FONT_WIDTH + j) &gt;= LINE_DOTS ) break;// wyjscie/obciecie czesci obrazka poza wydruk na prawo<br /><br />CLK_LO;<br />// obliczenia do kolejnego bitu<br />//adr 1 elem tablicy font + adr znaku + bajt znaku   &amp;  bit bajtu znaku<br />data = pgm_read_byte (FONT_NAME + charAddr + (i*charWidth) + j/8 ) &amp; ( 128 &gt;&gt; (j &amp; 7));<br />// zapis bitu do rejestru przesuwnego<br />if (data) { DI_HI; } else { DI_LO; }<br />CLK_HI;<br /><br />}// j loop<br /><br />k++;// kolejny znak<br />}// while<br /><br /><br />// przesuwanie char na pozycje x<br />DI_LO;<br />for(l=0; l &lt; shift_x; l++) {// petla przesuwajaca str na dana pozycje X<br />CLK_LO;<br />nop; CLK_HI;<br />}//l loop<br /><br />tprint_latch_reg();// zatrzask rejestru<br />tprint_heating(1);// praca grzalek<br />if ( x &gt; shift_x )tprint_clear_shift_reg();  // czysci rejestr jak potrzeba<br /><br />}// i loop<br /><br />}// END tprint_print_str<br /><br /><br /><br />void tprint_print_str_P (int x, const char *str) {<br /><br />// warning wywala przy probie zapisania do wskaźnika znak = (adres pierwszego znaku stringa z flash)<br /><br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=968">gordon10</a> — 16 lut 2018, o 22:26</p><hr />
]]></content>
</entry>
</feed>