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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2014-05-03T21:55:11+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=6880&amp;mode</id>
<entry>
<author><name><![CDATA[Kuźnia]]></name></author>
<updated>2014-05-03T21:55:11+01:00</updated>
<published>2014-05-03T21:55:11+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=6880&amp;p=79991#p79991</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=6880&amp;p=79991#p79991"/>
<title type="html"><![CDATA[Re: [Pytanie] Przeniesienie tablicy C-stringow do pamieci FL]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=6880&amp;p=79991#p79991"><![CDATA[
<div class="quotetitle">janobarman napisał(a):</div><div class="quotecontent"><br />De Facto mechanizm nie zbyt mi się podoba<br /></div><br />szczerze to mi też nie leżał taki zapis  ale innego sposobu nie znalazłem ,we wszystkich źródłach jakie przewertowałem taki przypadek dla AVR-GCC opisany jest tak j.w.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2537">Kuźnia</a> — 3 maja 2014, o 21:55</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[janobarman]]></name></author>
<updated>2014-05-02T13:59:17+01:00</updated>
<published>2014-05-02T13:59:17+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=6880&amp;p=79837#p79837</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=6880&amp;p=79837#p79837"/>
<title type="html"><![CDATA[Re: [Pytanie] Przeniesienie tablicy C-stringow do pamieci FL]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=6880&amp;p=79837#p79837"><![CDATA[
Dziękuję za odpowiedź. De Facto mechanizm nie zbyt mi się podoba bo z góry jest narzut że muszę tworzyć osobne zmienne, a bardziej chodziło mi o mechanikę posługiwania się/emulacji pracy na tablicy &quot;2-wymiarowej&quot;, jak to się odbywa &quot;kulturalniej&quot; w RAM'ie.<br /><br />Na dowód potwierdzenia użytkownika <strong>Kuźnia</strong>  przytoczyć muszę (powinno stać się biblią widzę jednak) manual avr-libc akurat u mnie w wersji 1.7.1 bo taki dorwalem, strona 29 - 31, punkt: <strong>5.4 Storing and Retrieving Strings in the Program Space</strong>. <br /><br /><a href="http://www.cs.ou.edu/~fagg/classes/general/atmel/avr-libc-user-manual-1.7.1.pdf"  class="postlink">http://www.cs.ou.edu/~fagg/classes/general/atmel/avr-libc-user-manual-1.7.1.pdf</a><br /><br />Tutaj jest dowód twojego argumentu jednak. Dziękuję za rzetelną i fachową odpowiedź.<br /><br />WNIOSEK:<br />Masz problem ze składnią, zajrzyj do manualu!! ( zaczynam rozumieć *nix'owych ludzi... z tym hasłem...)<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1569">janobarman</a> — 2 maja 2014, o 13:59</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Kuźnia]]></name></author>
<updated>2014-04-26T19:25:09+01:00</updated>
<published>2014-04-26T19:25:09+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=6880&amp;p=79288#p79288</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=6880&amp;p=79288#p79288"/>
<title type="html"><![CDATA[Re: [Pytanie] Przeniesienie tablicy C-stringow do pamieci FL]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=6880&amp;p=79288#p79288"><![CDATA[
witam<br /><div class="quotetitle">janobarman napisał(a):</div><div class="quotecontent"><br />/*<br /> * tablica 2-wymiarowa C-string<br /> */<br />char *__menuENG[] = {<br />                                                &quot;Invalid Position&quot;,                   // 0<br />                                                &quot;Start&quot;,                              // 1<br />                                                        &quot;Start All&quot;,                  // 2<br /><br />}<br /></div><br /> to jest raczej tablica jednowymiarowa, przechowuje (w pamięci danych) wskaźniki do stringów (utworzonych gdzieś w pamięci danych ) odpowiednikiem w progmemie  będzie:<br />[syntax=c]//najpierw utworzenie w progmemie stringów:<br />prog_char  Invalid Position&#91;&#93; = &quot;Invalid Position &quot;;<br />prog_char  Start&#91;&#93;  =  &quot;Start&quot; ;     <br />prog_char  Start All&#91;&#93; = &quot;Start All &quot; ;<br /><br />//potem utworzenie tablicy jednowymiarowej przechowywującej (w  progmemie) wskaźniki do ww stringów <br />const prog_char *__menuENG&#91;&#93; PROGMEM = {<br /><br />  // 3 wskaźniki na string ale teraz już w progmemie:<br />                                               Invalid Position,   // 0<br />                                                Start,                 // 1<br />                                                Start All             // 2<br /><br />};[/syntax]<br />użycie oczywiście z rzutowaniem żeby kompilator nie pluł <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> :<br />[syntax=c](prog_char*)pgm_read_word(&amp;__menuENG&#91;index&#93;);[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2537">Kuźnia</a> — 26 kwi 2014, o 19:25</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[janobarman]]></name></author>
<updated>2014-04-25T21:33:21+01:00</updated>
<published>2014-04-25T21:33:21+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=6880&amp;p=79171#p79171</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=6880&amp;p=79171#p79171"/>
<title type="html"><![CDATA[[Pytanie] Przeniesienie tablicy C-stringow do pamieci FLASH]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=6880&amp;p=79171#p79171"><![CDATA[
Witam,<br /><br />Stworzyłem sobie kod do przeglądania menu za pomocą automatów na LCD'ku i to działa. Mam problem by przenieść dane z RAM'u do FLASHA, tzn nie wiem jak to przepisać by nie fochał się kompilator.<br />Pliki.:<br />menu.h <br />[syntax=c]...<br />#include &lt;avr/pgmspace.h&gt;<br /><br />...<br />/*******************************************<br /> *<br /> * DEKLARACJA POL<br /> *<br /> *******************************************/<br /><br />char ** menu;// zmienna dzieki ktorej bedziemy mogli miec dostep do menu<br /><br />enum MainMenu {<br />/*<br />         *  Wartosci enum przyporzadkowane do tablicy i maszyny stanow<br />         */<br />}<br />/*******************************************<br /> *<br /> * DEKLARACJA FUNCKJI<br /> *<br /> *******************************************/<br />void menuInitialize(void);<br />void changeMenu(uint8_t);[/syntax]<br /><br />menu.c:<br />[syntax=c]/*******************************************<br /> *<br /> * DEKLARACJA POL<br /> *<br /> *******************************************/<br />typedef struct<br />{<br />uint8_t nextState&#91;4&#93;;//przejścia do następnych stanów<br />void (*callback)(unsigned char event);//funkcja zwrotna<br />} menuItem;<br /><br />#define IDDLE0<br /><br />/*<br /> * Te dwie zmienne trzeba zrobić &quot;extern&quot; w pliku zrodlowym, z ktorego<br /> * korzystamy, by moc korzystac z opcji menu w tej wersji, np w main.c<br /> */<br />volatile  uint8_t currentMenu=0;<br />volatile uint8_t menuEvent=  1;<br /><br />/*<br /> * tablica 2-wymiarowa C-string<br /> */<br />char *__menuENG&#91;&#93; = {<br />&quot;0.Invalid Position&quot;,// 0<br />&quot;1.Start&quot;, // 1<br />&quot;1.Start All&quot;,// 2<br />/*<br /> *   Kolejne pozycje menu<br /> */ <br />}<br /><br />/*<br /> * Maszyna stanow - automat skonczony, <br /> * korzystam ze struktury menuItem<br /> */<br />menuItem myMenu&#91;&#93;= {<br />/*<br /> *  {Aktualna Poz.,Up_Butt,Down_Butt,Ok_Butt}, event<br /> */<br /><br />{{InvalidPosition, InvalidPosition, StartShow, InvalidPosition}, 0},<br />{{StartShow,EasterEgg,StopAnimating, StartAll}, 0},<br />/*<br /> *   Kolejne pozycje menu dla automatu<br /> */ <br />};<br /><br />/******************************************************************<br /> *<br /> * FUNKCJE DOSTEPNE NA ZEWNATRZ<br /> *<br /> ********************************************************************/<br />void menuInitialize(void){<br /><br />menu = __menuENG;<br /><br />...<br /><br />}<br /><br />/**<br /> * F-cja zajmująca się zmianą menu jesl nastapilo wydarzenie<br /> */<br />void changeMenu(uint8_t menuEvent){<br /><br />//przejdz do nastepnego<br />volatile uint8_tpreviousMenu = 0;<br /><br />previousMenu = currentMenu;<br />currentMenu = pgm_read_byte(&amp;myMenu&#91;currentMenu&#93;.nextState&#91;menuEvent&#93;);//stanu<br /><br />//wywolaj funkcje zwrotna<br />if(previousMenu==currentMenu){<br />if (myMenu&#91;currentMenu&#93;.callback){<br />myMenu&#91;currentMenu&#93;.callback(menuEvent);<br />}<br />}<br /><br />/*<br /> * Tutaj zaczyna się obsługa wyswietlania co ma byc wyswietlane<br /> * na ekranie LCD<br /> */<br /><br />lcdClean();<br />lcdLocate(0,0);<br />lcdString(&quot;&gt;&quot;);<br />lcdLocate(0,2);<br />lcdString(menu&#91;currentMenu&#93;);<br /><br />previousMenu = myMenu&#91;currentMenu&#93;.nextState&#91;2&#93;;//stanu<br />lcdLocate(1,0);<br />lcdString(menu&#91;previousMenu&#93;);<br /><br />/*<br /> * KONIEC wyswietlania na ekranie<br /> */<br /><br />//skasuj zdarzenie<br />menuEvent = IDDLE;<br />}[/syntax]<br /><br />no i korzystanie z tego dobrodziejstwa w pliku:<br />main.c<br />[syntax=c]#define UP_MENU1<br />#define DOWN_MENU2<br />#define OK_MENU3<br /><br />extern uint8_t menuEvent;<br /><br />...<br />int main (void){<br />         ioInitialize();<br />...<br />while(1){<br />...<br /><br />switch (GetKeys()) {<br />case KEY_UP:<br />menuEvent = UP_MENU;<br />changeMenu(menuEvent);<br /><br />break;<br /><br />case KEY_DOWN:<br />menuEvent = DOWN_MENU;<br />changeMenu(menuEvent);<br />break;<br /><br />case KEY_OK:<br />menuEvent = OK_MENU;<br />changeMenu(menuEvent);<br />break;<br /><br />default:<br />break;<br />}<br /><br />}[/syntax]<br /><br />Rozumiem że musze wstawić:<br />1) const ... PROGMEM dla:<br />- tablicy z C-stringami<br />- maszyny stanow<br /><br />2) Nie wiem czy const PROGMEM powinien byc dla:<br />- typedef const struct PROGMEM{<br />- char ** menu<br />- dla enuma ?! warto w ogóle?<br /><br />3) Zmienić wyswietlanie na lcd<br />- z lcdString  na lcdStringP    (wyswietlanie z RAM'u na odpowiednik z FLASH)<br /><br />4) Chyba trzeba linijke z f-cji changeMenu:<br />Z lini:<br />[syntax=c]currentMenu = myMenu&#91;currentMenu&#93;.nextState&#91;menuEvent&#93;;[/syntax]<br />na linie<br />[syntax=c]currentMenu = pgm_read_byte(&amp;myMenu&#91;currentMenu&#93;.nextState&#91;menuEvent&#93;);[/syntax]<br /><br />Teraz mam problem, jak to złożyć w jedną , po moich próbach przeniesienia kompilator pluł:<br />- wywala warningi/errory pod tytulem:<br />    * zmienna powinna być zadeklarowana<br />    * rzutowanie wskaznika na int'a,<br />    * incompatybile types<br />    * cos jeszcze nie pamietam... ale z grubsza<br /><br />- na ekranie LCD pluje smieciami.<br /><br />temat dla mnie trudny bo dla tablicy 2-wymiarowej nie potrafię tego zrobić.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1569">janobarman</a> — 25 kwi 2014, o 21:33</p><hr />
]]></content>
</entry>
</feed>