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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2016-08-06T10:06:33+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=15950&amp;mode</id>
<entry>
<author><name><![CDATA[Robson]]></name></author>
<updated>2016-08-06T10:06:33+01:00</updated>
<published>2016-08-06T10:06:33+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=15950&amp;p=165555#p165555</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=15950&amp;p=165555#p165555"/>
<title type="html"><![CDATA[Re: Kopiowanie danych pomiędzy RAM, EEPROM, FLASH]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=15950&amp;p=165555#p165555"><![CDATA[
Wstawiam poprawiony kod dla osób, które tak jak ja zaczynają zabawę. Pozwala mi on zrozumieć zasadę działania z tymi pamięciami. Oczywiście obsługa<br />przycisków trochę prymitywna (delay) i można, a nawet trzeba to zamienić na nieblokujące funkcje (np. P. Mirka), ale do testów może być.<br /><br /><br />[syntax=c]#define Pin1 (1&lt;&lt;PD1)<br />#define Pin2 (1&lt;&lt;PD2)<br /><br /><br />#define EEMEM __attribute__((section(&quot;.eeprom&quot;)))<br /><br /><br />void copy_eem_to_ram(void);  // funkcja copy z EEPROM do RAM<br />void copy_ram_to_eem(void);  // funkcja copy z RAM do EEPROM<br />void copy_pgm_to_ram(void);  // funkcja copy z FLASH do RAM<br /><br /><br /><br />char linia1&#91;21&#93; = &quot;1. Ram              &quot;;<br />char linia2&#91;21&#93; = &quot;2.     Ram          &quot;;          // tablica znakow w pamieci RAM<br />char linia3&#91;21&#93; = &quot;3.         Ram      &quot;;<br />char linia4&#91;21&#93; = &quot;4.             Ram  &quot;;<br /><br />char linia_1&#91;21&#93; EEMEM = &quot;1.EEprom            &quot;;<br />char linia_2&#91;21&#93; EEMEM = &quot;2.  EEprom          &quot;;       // tablica znakow w pamieci EEPROM<br />char linia_3&#91;21&#93; EEMEM = &quot;3.    EEprom        &quot;;<br />char linia_4&#91;21&#93; EEMEM = &quot;4.      EEprom      &quot;;<br /><br />const char linia_1_1&#91;21&#93; PROGMEM = &quot;1.FLASH             &quot;;<br />const char linia_2_2&#91;21&#93; PROGMEM = &quot;2.  FLASH           &quot;;// tablica znakow w pamieci FLASH<br />const char linia_3_3&#91;21&#93; PROGMEM = &quot;3.    FLASH         &quot;;<br />const char linia_4_4&#91;21&#93; PROGMEM = &quot;4.      FLASH       &quot;;<br /><br /><br /><br />int main(void)<br />{<br /><br />    DDRD &amp;= ~(Pin1 | Pin2);<br />    PORTD |= Pin1 | Pin2;<br /><br />    _delay_ms(100);<br /><br />    DDRA |= (1&lt;&lt;PA7);        // ustawiamy kierunek linii podświetlenia LCD jako WYJŚCIE<br />    PORTA |=(1&lt;&lt;PA7); // załączamy podświetlenie LCD - stan wysoki<br />lcd_init(); // inicjalizacja wyswietlacza<br />lcd_cls(); // czyszczenie wyswietlacza<br /><br />//copy_ram_to_eem();<br />//copy_eem_to_ram();<br /><br /><br />while(1)<br /><br />{<br /><br />lcd_locate(0,0);<br />lcd_str(linia1);<br />lcd_locate(1,0);<br />lcd_str(linia2);<br />lcd_locate(2,0);<br />lcd_str(linia3);<br />lcd_locate(3,0);<br />lcd_str(linia4);<br />_delay_ms(100);<br /><br /><br /><br /><br /><br />if ( !(PIND &amp; Pin1) )            // czy stan niski ?<br />    {<br />    _delay_ms( 80 );        // opoznienie ze wzgledow na dragnie stykow<br />    if ( !(PIND &amp; Pin1) )    // jeszce raz spradza czy stan niski ?<br /><br />    //copy_ram_to_eem();    // zapis z ram do eeprom<br />    copy_eem_to_ram();      // odczyt z epromu w pamięci ram<br /><br />    }<br /><br />if ( !(PIND &amp; Pin2) )            // czy stan niski ?<br />    {<br />    _delay_ms( 80 );        // opoznienie ze wzgledow na dragnie stykow<br />    if ( !(PIND &amp; Pin2) )    // jeszce raz spradza czy stan niski ?<br /><br />    //copy_ram_to_eem();    // zapis z ram do eeprom<br />        copy_pgm_to_ram();<br />    //copy_eem_to_ram();    // odczyt z epromu w pamięci ram<br /><br />}<br /><br />}<br /><br />}<br /><br /><br />void copy_eem_to_ram(void)<br />{<br />eeprom_read_block (&amp;linia1, &amp;linia_1, sizeof(linia1));<br />eeprom_read_block (&amp;linia2, &amp;linia_2, sizeof(linia2));<br />eeprom_read_block (&amp;linia3, &amp;linia_3, sizeof(linia3));<br />eeprom_read_block (&amp;linia4, &amp;linia_4, sizeof(linia4));<br />}<br />void copy_ram_to_eem(void)<br />{<br /> eeprom_write_block (&amp;linia1, &amp;linia_1, sizeof(linia1));<br /> eeprom_write_block (&amp;linia2, &amp;linia_2, sizeof(linia2));<br /> eeprom_write_block (&amp;linia3, &amp;linia_3, sizeof(linia3));<br /> eeprom_write_block (&amp;linia4, &amp;linia_4, sizeof(linia4));<br />}<br />void copy_pgm_to_ram(void)<br />{<br /> memcpy_P(&amp;linia1, &amp;linia_1_1, sizeof(linia1));<br /> memcpy_P(&amp;linia2, &amp;linia_2_2, sizeof(linia2));<br /> memcpy_P(&amp;linia3, &amp;linia_3_3, sizeof(linia3));<br /> memcpy_P(&amp;linia4, &amp;linia_4_4, sizeof(linia4));<br />}[/syntax]<br /><br /><br />Należy pamiętać o dołączeniu :<br /><br />[syntax=c]#include &lt;avr/pgmspace.h&gt;<br />#include &lt;avr/eeprom.h&gt;[/syntax]<br /><br />Pozdrawiam.<br /><br /><br />Przepraszam za wprowadzenie w błąd, ale nie zauważyłem pomyłki. Poprawiłem.<br /><br />[syntax=c]memcpy_P(&amp;linia1, &amp;linia_1_1, sizeof(linia1));<br />memcpy_P(&amp;linia2, &amp;linia_2_2, sizeof(linia2));<br />memcpy_P(&amp;linia3, &amp;linia_3_3, sizeof(linia3));<br />memcpy_P(&amp;linia4, &amp;linia_4_4, sizeof(linia4));[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=6641">Robson</a> — 6 sie 2016, o 10:06</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2016-08-06T06:05:21+01:00</updated>
<published>2016-08-06T06:05:21+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=15950&amp;p=165550#p165550</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=15950&amp;p=165550#p165550"/>
<title type="html"><![CDATA[Re: Kopiowanie danych pomiędzy RAM, EEPROM, FLASH]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=15950&amp;p=165550#p165550"><![CDATA[
<div class="quotetitle">Robson napisał(a):</div><div class="quotecontent"><br />Sam niedawno pisałeś &quot;pytać, pytać........, a więc tak robię.<br /></div><br /><br />I bardzo dobrze ... po prostu na co dzień FLASH to pamięć programu TYLKO DO ODCZYTU i tak się ją traktuje w 99% przypadków.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 6 sie 2016, o 06:05</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Robson]]></name></author>
<updated>2016-08-06T00:46:10+01:00</updated>
<published>2016-08-06T00:46:10+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=15950&amp;p=165549#p165549</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=15950&amp;p=165549#p165549"/>
<title type="html"><![CDATA[Re: Kopiowanie danych pomiędzy RAM, EEPROM, FLASH]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=15950&amp;p=165549#p165549"><![CDATA[
Witam Mirku.<br />Dziękuje za zainteresowanie moim tematem. Czytając Twój post stwierdziłem, że istotnie, skoro Ty piszesz, że nie jest to takie proste, to tym bardziej ja, jako początkujący odpuszczam ten temat. Widocznie nie wszystko, co w głowie się urodzi, można przełożyć na kod C  <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> .<br />Mimo wszystko temat jest cały czas otwarty, ponieważ przetrenowałem zapis tablic char, a jeszcze są struktury, wskaźniki, menu na tych rzeczach. Za jakiś czas będą kolejne pytania, na które mam nadzieje, znajdę odpowiedź na forum. Sam niedawno pisałeś &quot;pytać, pytać........, a więc tak rob<br />ię.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=6641">Robson</a> — 6 sie 2016, o 00:46</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2016-08-05T23:34:59+01:00</updated>
<published>2016-08-05T23:34:59+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=15950&amp;p=165546#p165546</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=15950&amp;p=165546#p165546"/>
<title type="html"><![CDATA[Re: Kopiowanie danych pomiędzy RAM, EEPROM, FLASH]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=15950&amp;p=165546#p165546"><![CDATA[
<div class="quotetitle">Robson napisał(a):</div><div class="quotecontent"><br />Czy jest to wykonalne ?<br /></div><br />Teoretycznie tak. Ale to nie jest takie proste.<br /><br /><div class="quotetitle">Robson napisał(a):</div><div class="quotecontent"><br />jak mogę zrobić funkcję do kopiowania <br />ram do flash ?<br /></div><br />1. Umieścić kod do zapisu jednej strony Flash w sekcji NRWW pamięci Flash.<br />2. Uruchomić kod z sekcji NRWW<br />3. Zapisać całą stronę FLASH danymi z RAM, niestety może się sporo miejsca zmarnować w ramach pojedynczej strony<br />4. Określić dokładnie miejsca w pamięci Flash zarówno funkcji z sekcji NRWW oraz strony do zapisu z sekcji RWW. (Chyba że to procek ATtiny to wszystko będzie w ramach sekcji NRWW)... miejsca to znaczy adresy HEX w opcjach linkera.<br /><br />Wydaje się to troszkę skomplikowane ale mam nadzieję, że po ukazaniu się Yellowbooka na rynku, każdy będzie używał sobie pamięci Flash zamiast EEPROM co daje przy okazji po tysiąckroć większą pewność że przechowywane w niej dane nie znikną albo że się nie uszkodzą <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> — 5 sie 2016, o 23:34</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Robson]]></name></author>
<updated>2016-08-05T22:59:38+01:00</updated>
<published>2016-08-05T22:59:38+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=15950&amp;p=165545#p165545</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=15950&amp;p=165545#p165545"/>
<title type="html"><![CDATA[Re: Kopiowanie danych pomiędzy RAM, EEPROM, FLASH]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=15950&amp;p=165545#p165545"><![CDATA[
Dziękuję anonimowy.<br /><br />Właśnie znalazłem błąd w kodzie i poprawiłem.Teraz działa następująco i w 100% moimi założeniami:<br /><br />po włączeniu wyświetla się tablica ram,<br />Po wciśnięciu Pin1 ładuje się eeprom do lcd,<br />po wciśnięciu Pin2 ładuje się flash do lcd'<br /><br />Do tej pory jest ok.<br /><br />Po resecie, restarcie mam tablicę ram na lcd. Patrząc na kod i tablice, to tak musi być. Czy możesz mi podpowiedzieć, jak mogę zrobić funkcję do kopiowania <br />ram do flash ?. Czy jest to wykonalne ?<br />Dziękuję.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=6641">Robson</a> — 5 sie 2016, o 22:59</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[anonimowy]]></name></author>
<updated>2016-08-05T22:44:04+01:00</updated>
<published>2016-08-05T22:44:04+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=15950&amp;p=165543#p165543</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=15950&amp;p=165543#p165543"/>
<title type="html"><![CDATA[Re: Kopiowanie danych pomiędzy RAM, EEPROM, FLASH]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=15950&amp;p=165543#p165543"><![CDATA[
Zobacz skąd dokąd kopiujesz i myślę, że zorientujesz się, gdzie jest błąd  <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> <br /><div class="quotetitle">Robson napisał(a):</div><div class="quotecontent"><br />[syntax=c]void copy_pgm_to_ram(void)<br />{<br /> memcpy_P(&amp;linia_1_1, &amp;linia_1_1, sizeof(linia_1_1));<br /> memcpy_P(&amp;linia_2_2, &amp;linia_2_2, sizeof(linia_2_2));<br /> memcpy_P(&amp;linia_3_3, &amp;linia_3_3, sizeof(linia_3_3));<br /> memcpy_P(&amp;linia_4_4, &amp;linia_4_4, sizeof(linia_4_4));<br />}[/syntax]<br /></div><br /><br />Wskazówki:<br />[syntax=c]char linia1&#91;21&#93; = &quot;1. Ram              &quot;;<br />char linia2&#91;21&#93; = &quot;2.     Ram          &quot;;                                         // tablica znakow w pamieci RAM<br />char linia3&#91;21&#93; = &quot;3.         Ram      &quot;;<br />char linia4&#91;21&#93; = &quot;4.             Ram  &quot;;[/syntax]<br />Oraz:<br />[syntax=c]lcd_locate(0,0);<br />lcd_str(linia1);[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3542">anonimowy</a> — 5 sie 2016, o 22:44</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Robson]]></name></author>
<updated>2016-08-05T22:09:07+01:00</updated>
<published>2016-08-05T22:09:07+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=15950&amp;p=165538#p165538</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=15950&amp;p=165538#p165538"/>
<title type="html"><![CDATA[Kopiowanie danych pomiędzy RAM, EEPROM, FLASH]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=15950&amp;p=165538#p165538"><![CDATA[
Witam szanowne forum.<br />Tak sobie siedzę i kombinuję z tymi pamięciami i stanąłem w miejscu. Po przemyśleniu, że nie wszystko na raz, postanowiłem zmienić sposób nauki i zająłem się<br />jednym tematem, jak w tytule. Temat kopiowania ram-eeprom i z powrotem pojąłem i działa. Niestety dołożyłem obsługę pamięci flash i tu jest coś nie ok  <img src="https://forum.atnel.pl/images/smilies/icon_e_sad.gif" alt=":(" title="Smutny" /> .<br />Gdzie mam się zwrócić o pomoc, jak nie tu  <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> .<br />Krótko o programie.<br />Mam trzy tablice char i dwa przyciski. Po włączeniu zestawu atb ładuje się tablica ram i wyświetla na lcd.<br />Po wciśnięciu przycisku Pin1 ładuje sie tablica eeprom i wyświetla na lcd.<br />Po wciśnięciu przycisku Pin2 na powrót ładuje sie tablica ram, a ja chciałem załadować tablicę flasch. Nie wiem czemu tak jest.<br />Ponad to kiedy po włączeniu urządzenia załaduje się tablica ram i po wciśnieciu Pin1 załaduje się tablica eeprom, to po wyłączeniu i ponownym włączeniu<br />na wyświetlaczu mam ponownie tablicę ram.<br />Na koniec dodam, że obsługę flasch napisałem trochę na czuja. Nie wszystko do końca rozumiem. Według mnie powinno działać na 100%, ale to tylko <br />moje zdanie &quot;biginera&quot;.<br /><br />Załączam kod do analizy. Dziękuję za wszelką pomoc.<br /><br /><br />[syntax=c]#define Pin1 (1&lt;&lt;PD1)<br />#define Pin2 (1&lt;&lt;PD2)<br /><br /><br />#define EEMEM __attribute__((section(&quot;.eeprom&quot;)))<br /><br /><br />void copy_eem_to_ram(void);  // funkcja copy z EEPROM do RAM<br />void copy_ram_to_eem(void);  // funkcja copy z RAM do EEPROM<br />void copy_pgm_to_ram(void);  // funkcja copy z FLASH do RAM<br /><br /><br /><br />char linia1&#91;21&#93; = &quot;1. Ram              &quot;;<br />char linia2&#91;21&#93; = &quot;2.     Ram          &quot;;          // tablica znakow w pamieci RAM<br />char linia3&#91;21&#93; = &quot;3.         Ram      &quot;;<br />char linia4&#91;21&#93; = &quot;4.             Ram  &quot;;<br /><br />char linia_1&#91;21&#93; EEMEM = &quot;1.EEprom            &quot;;<br />char linia_2&#91;21&#93; EEMEM = &quot;2.  EEprom          &quot;;       // tablica znakow w pamieci EEPROM<br />char linia_3&#91;21&#93; EEMEM = &quot;3.    EEprom        &quot;;<br />char linia_4&#91;21&#93; EEMEM = &quot;4.      EEprom      &quot;;<br /><br />const char linia_1_1&#91;21&#93; PROGMEM = &quot;1.FLASH             &quot;;<br />const char linia_2_2&#91;21&#93; PROGMEM = &quot;2.  FLASH           &quot;;// tablica znakow w pamieci FLASH<br />const char linia_3_3&#91;21&#93; PROGMEM = &quot;3.    FLASH         &quot;;<br />const char linia_4_4&#91;21&#93; PROGMEM = &quot;4.      FLASH       &quot;;<br /><br /><br /><br />int main(void)<br />{<br /><br />    DDRD &amp;= ~(Pin1 | Pin2);<br />    PORTD |= Pin1 | Pin2;<br /><br />    _delay_ms(100);<br /><br />    DDRA |= (1&lt;&lt;PA7);        // ustawiamy kierunek linii podświetlenia LCD jako WYJŚCIE<br />    PORTA |=(1&lt;&lt;PA7); // załączamy podświetlenie LCD - stan wysoki<br />lcd_init(); // inicjalizacja wyswietlacza<br />lcd_cls(); // czyszczenie wyswietlacza<br /><br />//copy_ram_to_eem();<br />//copy_eem_to_ram();<br /><br /><br />while(1)<br /><br />{<br /><br />lcd_locate(0,0);<br />lcd_str(linia1);<br />lcd_locate(1,0);<br />lcd_str(linia2);<br />lcd_locate(2,0);<br />lcd_str(linia3);<br />lcd_locate(3,0);<br />lcd_str(linia4);<br />_delay_ms(100);<br /><br /><br /><br /><br /><br />if ( !(PIND &amp; Pin1) )            // czy stan niski ?<br />    {<br />    _delay_ms( 80 );        // opoznienie ze wzgledow na dragnie stykow<br />    if ( !(PIND &amp; Pin1) )    // jeszce raz spradza czy stan niski ?<br /><br />    //copy_ram_to_eem();    // zapis z ram do eeprom<br />    copy_eem_to_ram();      // odczyt z epromu w pamięci ram<br /><br />    }<br /><br />if ( !(PIND &amp; Pin2) )            // czy stan niski ?<br />    {<br />    _delay_ms( 80 );        // opoznienie ze wzgledow na dragnie stykow<br />    if ( !(PIND &amp; Pin2) )    // jeszce raz spradza czy stan niski ?<br /><br />    //copy_ram_to_eem();    // zapis z ram do eeprom<br />        copy_pgm_to_ram();<br />    //copy_eem_to_ram();    // odczyt z epromu w pamięci ram<br /><br />}<br /><br />}<br /><br />}<br /><br /><br />void copy_eem_to_ram(void)<br />{<br />eeprom_read_block (&amp;linia1, &amp;linia_1, sizeof(linia1));<br />eeprom_read_block (&amp;linia2, &amp;linia_2, sizeof(linia2));<br />eeprom_read_block (&amp;linia3, &amp;linia_3, sizeof(linia3));<br />eeprom_read_block (&amp;linia4, &amp;linia_4, sizeof(linia4));<br />}<br />void copy_ram_to_eem(void)<br />{<br /> eeprom_write_block (&amp;linia1, &amp;linia_1, sizeof(linia1));<br /> eeprom_write_block (&amp;linia2, &amp;linia_2, sizeof(linia2));<br /> eeprom_write_block (&amp;linia3, &amp;linia_3, sizeof(linia3));<br /> eeprom_write_block (&amp;linia4, &amp;linia_4, sizeof(linia4));<br />}<br />void copy_pgm_to_ram(void)<br />{<br /> memcpy_P(&amp;linia_1_1, &amp;linia_1_1, sizeof(linia_1_1));<br /> memcpy_P(&amp;linia_2_2, &amp;linia_2_2, sizeof(linia_2_2));<br /> memcpy_P(&amp;linia_3_3, &amp;linia_3_3, sizeof(linia_3_3));<br /> memcpy_P(&amp;linia_4_4, &amp;linia_4_4, sizeof(linia_4_4));<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=6641">Robson</a> — 5 sie 2016, o 22:09</p><hr />
]]></content>
</entry>
</feed>