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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2012-10-07T22:10:02+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=1631&amp;mode</id>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2012-10-07T22:10:02+01:00</updated>
<published>2012-10-07T22:10:02+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1631&amp;p=16588#p16588</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1631&amp;p=16588#p16588"/>
<title type="html"><![CDATA[Re: Jak zapisać strukturę w pamięci flash przy użyciu PROGME]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1631&amp;p=16588#p16588"><![CDATA[
Oczywiście, że jest troszkę inaczej niż pisałem - ale to dlatego że namieszałeś troszkę <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> a ja pisałem na szybko ....<br /><br />bo pisałeś że chcesz mieć jednak strukturę w RAM a na końcu jest jak widzę we Flash ...<br /><br />ok wracając do twojego problemu - oczywiście że można zdefiniować tą strukturę w innym pliku - nie trzeba koniecznie w main.<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 1 minucie ]</span></strong><br /><br />ale odpowiem dokładniej dopiero jak będę miał pod ręką kawałek zestawu, kompilator itp żeby znowu nie &quot;strzelać&quot; - tzn żeby sprawdzić najpierw.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 7 paź 2012, o 22:10</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Rafal505]]></name></author>
<updated>2012-10-07T15:09:40+01:00</updated>
<published>2012-10-07T15:09:40+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1631&amp;p=16561#p16561</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1631&amp;p=16561#p16561"/>
<title type="html"><![CDATA[Re: Jak zapisać strukturę w pamięci flash przy użyciu PROGME]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1631&amp;p=16561#p16561"><![CDATA[
Moim zdaniem jest troszkę inaczej niż piszesz <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> .<br /><br />Struktura wygląda tak:<br />[syntax=c]<br />    const char nazwa_str[] PROGMEM = &quot;ala i as poszli w las&quot;;<br />    const char opis_str[] PROGMEM = &quot;murzynek bambo w afryce mieszka&quot;;<br />     <br />    const char nazwa_str1[] PROGMEM = &quot;zbierac grzybki&quot;;<br />    const char opis_str1[] PROGMEM = &quot;czarna ma skore ten nasz koleszka&quot;;<br />     <br />    typedef struct<br />    {   const char *nazwa;<br />         const char *opis;<br />    } TELEMENT;[/syntax]<br /><br />Więc jeśli pisze w ten sposób:<br />[syntax=c]TELEMENT element [2] PROGMEM = { {nazwa_str, opis_str} , {nazwa_str1, opis_str1} };[/syntax]<br />To <br />[syntax=c]element[0].nazwa[/syntax]<br />jest już wskaźnikiem do łańcucha znaków (element[0].nazwa = nazwa_str) a nie do kolejnego wskaźnika.<br />Chyba że czegoś nie rozumiem bądź nie jestem świadomy.<br /><br />Problem z wyświetlaniem znaków ustał kiedy definicje struktury umieściłem w tym samym pliku projektu gdzie używałem funkcji do wyświetlania znaków.<br />Na początku wyglądało to tak (wersja niedziałająca) :<br /><br />[syntax=c]/* plik nazwy.c*/<br />   #include &lt;avr/pgmspace.h&gt;<br />   #include &quot;nazwy.h&quot;<br />  <br />    const char nazwa_str[] PROGMEM = &quot;ala i as poszli w las&quot;;<br />    const char opis_str[] PROGMEM = &quot;murzynek bambo w afryce mieszka&quot;;<br />     <br />    const char nazwa_str1[] PROGMEM = &quot;zbierac grzybki&quot;;<br />    const char opis_str1[] PROGMEM = &quot;czarna ma skore ten nasz koleszka&quot;;<br /><br />    TELEMENT element [2] PROGMEM = { {nazwa_str, opis_str} , {nazwa_str1, opis_str1} };<br />[/syntax]<br />[syntax=c]<br />/* plik nazwy.h*/<br /> #ifndef nazwy<br /> #define nazwy<br /><br />typedef struct<br />    {   const char *nazwa;<br />         const char *opis;<br />    } TELEMENT;<br /><br />extern TELEMENT element [2] PROGMEM;<br /><br />extern const char nazwa_str[] ;<br />extern const char opis_str[] ;<br />     <br />extern const char nazwa_str1[] ; <br />extern const char opis_str1[] ;<br />#endif<br />[/syntax]<br /><br />W pliku main<br /><br />[syntax=c]#include &lt;avr/pgmspace.h&gt;<br />#include &quot;nazwy.h&quot;<br />#include &quot;lcd.h&quot;<br /><br />int main(void)<br />{<br />     lcd_init();<br />     lcd_str_P(element[0].nazwa);<br />}[/syntax]<br /><br />Gdy umieściłem definicje struktury w pliku main zamiast w nazwy.c zaczęło wyświetlać prawidłowo tekst.<br />[syntax=c]#include &lt;avr/pgmspace.h&gt;<br />#include &quot;nazwy.h&quot;<br />#include &quot;lcd.h&quot;<br /><br />TELEMENT element [2] PROGMEM = { {nazwa_str, opis_str} , {nazwa_str1, opis_str1} };<br /><br />int main(void)<br />{<br />     lcd_init();<br />     lcd_str_P(element[0].nazwa);<br />}[/syntax]<br /><br />Proszę mnie uświadomić czemu tak jest skoro wszystko zadeklarowałem w nazwy.h i dołączyłem do main-a więc powinno działać.<br />Pisze spory projekt i jeśli wszystkie definicje będę musiał poprzenosić do main-a to zrobi mi się straszny bałagan <img src="https://forum.atnel.pl/images/smilies/icon_e_sad.gif" alt=":(" title="Smutny" /> .<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=540">Rafal505</a> — 7 paź 2012, o 15:09</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2012-10-06T14:52:26+01:00</updated>
<published>2012-10-06T14:52:26+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1631&amp;p=16509#p16509</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1631&amp;p=16509#p16509"/>
<title type="html"><![CDATA[Re: Jak zapisać strukturę w pamięci flash przy użyciu PROGME]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1631&amp;p=16509#p16509"><![CDATA[
Panie kochanieńki <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> ale wyobraź sobie, że gdy piszesz:<br /><br />[syntax=c]lcd_str_P(element[0].nazwa);[/syntax]<br /><br />to tak jakbyś próbował odwołać się do wskaźnika do tekstu, który znajduje się pod tym adresem - a tak przecież nie jest <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> nie  pamiętasz jak zdrefiniowałeś swoją własną strukturę? przecież w tym polu jest znowu wskaźnik do łańucha a nie już sam łańcuch. Zatem trzeba chyba użyć operatora pobierania adresu aby dobrać się &quot;<span style="color: #0040FF">do wskaźnika do wskaźnika</span>&quot; <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br />[syntax=c]lcd_str_P( &amp;element[0].nazwa );[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 6 paź 2012, o 14:52</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Rafal505]]></name></author>
<updated>2012-10-06T14:42:14+01:00</updated>
<published>2012-10-06T14:42:14+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1631&amp;p=16507#p16507</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1631&amp;p=16507#p16507"/>
<title type="html"><![CDATA[Re: Jak zapisać strukturę w pamięci flash przy użyciu PROGME]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1631&amp;p=16507#p16507"><![CDATA[
Napotkałem następny problem.<br /><br />Gdy próbuje wyświetlić dany element struktury przy pomocy poniższej funkcji na wyświetlaczu lcd<br />wyświetlają się chińskie znaczki.<br /><br />[syntax=c]void lcd_str_P(char * str)<br />{<br />    register char znak;<br />    while ( (znak=pgm_read_byte(str++)))<br />        lcd_write_data( ( (znak&gt;=0x80) &amp;&amp; (znak&lt;=0x87) ) ? (znak &amp; 0x07) : znak);<br />}[/syntax]<br />Tak wpisuje element w funkcje;<br />[syntax=c]lcd_str_P(element[0].nazwa);[/syntax]<br />Co tu jest jeszcze nie tak <img src="https://forum.atnel.pl/images/smilies/icon_e_sad.gif" alt=":(" title="Smutny" /> ?<br /><br />Gdy wpisze normalnie przy pomocy zmiennej nazwa_str jest ok.<br />[syntax=c]lcd_str_P(nazwa_str);[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=540">Rafal505</a> — 6 paź 2012, o 14:42</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2012-10-06T12:27:34+01:00</updated>
<published>2012-10-06T12:27:34+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1631&amp;p=16499#p16499</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1631&amp;p=16499#p16499"/>
<title type="html"><![CDATA[Re: Jak zapisać strukturę w pamięci flash przy użyciu PROGME]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1631&amp;p=16499#p16499"><![CDATA[
Muszą być te dodatkowe nawiasy klamrowe jak napisał wyżej kolega, bo one oddzielają ci elementy tablicy, a bez nich to wynika jakbyś chciał do jednego elementu napchać więcej niż jest w nim miejsca - stąd był uzasadniony płacz kompilatora <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=54">mirekk36</a> — 6 paź 2012, o 12:27</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Rafal505]]></name></author>
<updated>2012-10-06T12:08:02+01:00</updated>
<published>2012-10-06T12:08:02+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1631&amp;p=16496#p16496</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1631&amp;p=16496#p16496"/>
<title type="html"><![CDATA[Re: Jak zapisać strukturę w pamięci flash przy użyciu PROGME]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1631&amp;p=16496#p16496"><![CDATA[
Jest OK, kompiluje się bez problemu.<br />Dzięki<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=540">Rafal505</a> — 6 paź 2012, o 12:08</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Rafal505]]></name></author>
<updated>2012-10-06T11:52:41+01:00</updated>
<published>2012-10-06T11:52:41+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1631&amp;p=16494#p16494</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1631&amp;p=16494#p16494"/>
<title type="html"><![CDATA[Re: Jak zapisać strukturę w pamięci flash przy użyciu PROGME]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1631&amp;p=16494#p16494"><![CDATA[
Książkę mam w planach kupić jak na razie koczę studiować pierwszą część &quot;Mikrokontrolery AVR<br />Język C Podstawy programowania&quot;<br /><br />A jeśli chciałbym zrobić tablice takiej struktury np;<br /><br />[syntax=c]const char nazwa_str[] PROGMEM = &quot;ala i as poszli w las&quot;;<br />const char opis_str[] PROGMEM = &quot;murzynek bambo w afryce mieszka&quot;;<br /><br />const char nazwa_str1[] PROGMEM = &quot;zbierac grzybki&quot;;<br />const char opis_str1[] PROGMEM = &quot;czarna ma skore ten nasz koleszka&quot;;<br /> <br />typedef struct<br />{   const char *nazwa;<br />     const char *opis;<br />} TELEMENT;[/syntax]<br /><br />[syntax=c]TELEMENT element [2] PROGMEM = { nazwa_str, opis_str, nazwa_str1, opis_str1};[/syntax]<br /><br />Przy takiej inicjalizacji kompilator wyrzuca warning-i.<br /><br />Jeśli chodzi o strukturę mieszaną to chyba wiem w jaki sposób ją zainicjalizować.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=540">Rafal505</a> — 6 paź 2012, o 11:52</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2012-10-06T02:10:09+01:00</updated>
<published>2012-10-06T02:10:09+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1631&amp;p=16491#p16491</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1631&amp;p=16491#p16491"/>
<title type="html"><![CDATA[Re: Jak zapisać strukturę w pamięci flash przy użyciu PROGME]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1631&amp;p=16491#p16491"><![CDATA[
No pewnie że można zrobić taką mieszaną strukturę <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> .... bardzo dużo przykładów takiego posługiwania się strukturami jest w drugiej części mojej książki tak przy okazji:<br /><br /><!-- m --><a class="postlink" href="http://atnel.pl/jezyk-c-pasja-programowania.html" >http://atnel.pl/jezyk-c-pasja-programowania.html</a><!-- m --><br /><br />warto więc poczytać i to nie tylko ze względu na to.... ale do rzeczy<br /><br />gdybyś chciał całą taką strukturę mieć we flash:<br /><br />[syntax=c]const char nazwa_str[] PROGMEM = &quot;ala i as poszli w las&quot;;<br />const char opis_str[] PROGMEM = &quot;murzynek bambo w afryce mieszka&quot;;<br /><br />typedef struct<br />{   const char *nazwa;<br />     const char *opis;<br />} TELEMENT;[/syntax]<br /><br />to<br /><br />[syntax=c]TELEMENT element PROGMEM = { nazwa_str, opis_str };[/syntax]<br /><br />zauważ, że strukturę w pamięci FLASH trzeba bezwzględnie od razu zainicjalizować - masz przykład powyżej<br /><br />a jeśli chcesz mieć mieszaną strukturę w RAM ze wskaźnikami to podobnie:<br /><br />[syntax=c]typedef struct<br />{   uint8_t ilosc;<br />     const char *nazwa;<br />     const char *opis;<br />     uint8_t numer;<br />} TELEMENT;[/syntax]<br /><br />i w kodzie<br /><br />[syntax=c]TELEMENT element; // definiujesz strukturę w RAM[/syntax]<br /><br />a potem w main()<br /><br />[syntax=c]element.nazwa = nazwa_str;<br />element.opis = opis_str;[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 6 paź 2012, o 02:10</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Rafal505]]></name></author>
<updated>2012-10-05T23:23:37+01:00</updated>
<published>2012-10-05T23:23:37+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1631&amp;p=16490#p16490</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1631&amp;p=16490#p16490"/>
<title type="html"><![CDATA[Jak zapisać strukturę w pamięci flash przy użyciu PROGMEM]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1631&amp;p=16490#p16490"><![CDATA[
Witam,<br /><br />Czy jest możliwość zapisania struktury w pamięci flash tego typu;<br /><br />[syntax=c]typedef struct<br />{   const char *nazwa;<br />     const char *opis;<br />}element;<br />[/syntax]<br /><br />Obydwie zmienne char będą tylko do odczytu, więc chciałbym je umieścić w pamięci flash aby nie zajmowały pamięci RAM.<br />Próbowałem z różnymi wariantami słowa PROGMEM ale kompilator cały czas wywala błąd.<br /><br />A co jeśli chodzi o strukturę zawierającą zmienne które będą modyfikowane podczas działania funkcji i zmienne tylko do odczytu  np.;<br /><br />[syntax=c]typedef struct<br />{   uint8_t ilosc;<br />     const char *nazwa;<br />     const char *opis;<br />     uint8_t numer;<br />}element;[/syntax]<br /><br />Char-y chciał bym umieścić w pamięci flash a uint8_t normalnie w Ram.<br />Czy jest taka możliwość.<br /><br />To mój pierwszy post na tym forum, więc proszę o wyrozumiałość.<br />Z góry dziękuje za pomoc.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=540">Rafal505</a> — 5 paź 2012, o 23:23</p><hr />
]]></content>
</entry>
</feed>