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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2015-12-01T18:04:10+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=13719&amp;mode</id>
<entry>
<author><name><![CDATA[QuadMan]]></name></author>
<updated>2015-12-01T18:04:10+01:00</updated>
<published>2015-12-01T18:04:10+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=13719&amp;p=146811#p146811</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=13719&amp;p=146811#p146811"/>
<title type="html"><![CDATA[Re: EEPROM - błędy w zapisie]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=13719&amp;p=146811#p146811"><![CDATA[
Witam ponownie.<br />A może faktycznie ta komórka EEPROM-a już umarła. Przesuń na próbę obszar danych w EEPROM-ie kawałek dalej i wtedy zobacz.<br /><br />Pozdrawiam, QuadMan.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=5291">QuadMan</a> — 1 gru 2015, o 18:04</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[zoom]]></name></author>
<updated>2015-12-01T17:53:57+01:00</updated>
<published>2015-12-01T17:53:57+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=13719&amp;p=146807#p146807</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=13719&amp;p=146807#p146807"/>
<title type="html"><![CDATA[Re: EEPROM - błędy w zapisie]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=13719&amp;p=146807#p146807"><![CDATA[
Włączenie BODa faktycznie poprawiło sytuację. Niestety przy odczytywaniu EEPROMA zewnętrznym programem, podczas resetu ten błąd dalej się pojawia, więc faktycznie muszę sobie czytać EEPROM do struktury u wywalać na LCD. Jedyny sposób.<br />Zastanawia mnie tylko, że to zawsze jest wartość 197 itp, albo 203 itp. Nigdy jakieś inne, np. 64, czy 150.<br />Dzięki wszystkim, walczę dalej.<br /><br />BTW zawsze byłem mega zadowolony z programu AVR Burn-O-Mat. Niestety już drugi raz podczas zmieniania fusów w ATtiny 2313 coś się niedobrego dzieje. Jeden procek mi umarł - pewnie jakieś lockbity czy coś się włączyło, a teraz zamiast BODlevel musiał mi się załączyć DIV8, nagle wszystko zaczęło chodzić wolno, nie mogłem się programatorem połączyć. Na szczęście wpadłem o co chodzi, przestawiłem zworkę i zmieniłem MkAvrCalculatorem.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=685">zoom</a> — 1 gru 2015, o 17:53</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[QuadMan]]></name></author>
<updated>2015-12-01T13:33:48+01:00</updated>
<published>2015-12-01T13:33:48+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=13719&amp;p=146783#p146783</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=13719&amp;p=146783#p146783"/>
<title type="html"><![CDATA[Re: EEPROM - błędy w zapisie]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=13719&amp;p=146783#p146783"><![CDATA[
Witam,<br /><div class="quotetitle">zoom napisał(a):</div><div class="quotecontent"><br />Super, bardzo Ci dziękuję za odpowiedź!<br />BODa faktycznie nie włączyłem, zaraz to uczynię. I z tym zapisem masz rację, przecież tam w kółko uruchamiam zapis eeprom... Z tym, że jeśli nadpisywane jest tą samą wartością, to chyba nic nie powinno się dziać?<br /><br />Odczytałem sobie programem eXtreme Burner zawartość EEPROM i dziwy...<br /><br /><a href="https://obrazkiforum.atnel.pl/685/843719af5e05781102a1e3deb2206187.png"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/685/843719af5e05781102a1e3deb2206187.png" alt="Obrazek" /></a><br />Zapisane są komórki 01, 02, 03 oraz 7006, a struktura posiada trzy zmienne, dwie używane - stan_led i licznik.<br /></div><br /><br />zapisywanie jakich dziwacznych wartości pod nieużywanymi adresami sugeruje rzeczywiście problemy z BOD-em. Co do zapisu niezmienionych wartości: z konstrukcji EEPROM-a niestety wynika, że zapis jakiejkolwiek wartości musi być poprzedzony kasowaniem komórki, niestety <img src="https://forum.atnel.pl/images/smilies/icon_e_sad.gif" alt=":-(" title="Smutny" />. Ja na Twoim miejscu spróbowałbym jednokrotnego zapisu i za nim zaraz odczytu do innej struktury testowej i wyświetlałbym dane na LCD z tejże struktury, wtedy mógłbyś na 100% przetestować poprawność kodu.<br /><strong>@wojtekr51</strong> o funkcji: eeprom_updte_block( &amp;ram_cfg, &amp;eem_cfg, sizeof(ram_cfg) ) nie wiedziałem, ja coś takiego implementowałem &quot;recznie&quot;. No ale ja na AVR-ach prawie nic nie robię...<br /><br />Pozdrawiam, QuadMan.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=5291">QuadMan</a> — 1 gru 2015, o 13:33</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[wojtekr51]]></name></author>
<updated>2015-11-30T19:51:42+01:00</updated>
<published>2015-11-30T19:51:42+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=13719&amp;p=146750#p146750</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=13719&amp;p=146750#p146750"/>
<title type="html"><![CDATA[Re: EEPROM - błędy w zapisie]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=13719&amp;p=146750#p146750"><![CDATA[
Żeby zabezpieczyć EEPROM przed niepotrzebnym kasowaniem i ponownym zapisywaniem tej samej wartości, można zamiast:<br /><div class="codetitle"><b>Code:</b></div><div class="codecontent">eeprom_write_block( &amp;ram_cfg, &amp;eem_cfg, sizeof(ram_cfg) );</div><br />użyć funkcji:<br /><div class="codetitle"><b>Code:</b></div><div class="codecontent">eeprom_updte_block( &amp;ram_cfg, &amp;eem_cfg, sizeof(ram_cfg) );</div><br /><br />Jeżeli cały blok pozostaje bez zmian, to na pewno nic nie zapisuje w EEPROM-ie.<br />A gdy zmieni się np. tylko 1bajt w zapisywanym bloku danych to kasuje i zapisuje na nowo tylko ten 1bajt, ale tu nie jestem do końca pewny.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1760">wojtekr51</a> — 30 lis 2015, o 19:51</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[zoom]]></name></author>
<updated>2015-11-30T18:02:02+01:00</updated>
<published>2015-11-30T18:02:02+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=13719&amp;p=146746#p146746</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=13719&amp;p=146746#p146746"/>
<title type="html"><![CDATA[Re: EEPROM - błędy w zapisie]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=13719&amp;p=146746#p146746"><![CDATA[
Super, bardzo Ci dziękuję za odpowiedź!<br />BODa faktycznie nie włączyłem, zaraz to uczynię. I z tym zapisem masz rację, przecież tam w kółko uruchamiam zapis eeprom... Z tym, że jeśli nadpisywane jest tą samą wartością, to chyba nic nie powinno się dziać?<br /><br />Odczytałem sobie programem eXtreme Burner zawartość EEPROM i dziwy...<br /><br /><a href="https://obrazkiforum.atnel.pl/685/843719af5e05781102a1e3deb2206187.png"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/685/843719af5e05781102a1e3deb2206187.png" alt="Obrazek" /></a><br />Zapisane są komórki 01, 02, 03 oraz 7006, a struktura posiada trzy zmienne, dwie używane - stan_led i licznik.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=685">zoom</a> — 30 lis 2015, o 18:02</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[QuadMan]]></name></author>
<updated>2015-11-30T00:46:21+01:00</updated>
<published>2015-11-30T00:46:21+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=13719&amp;p=146709#p146709</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=13719&amp;p=146709#p146709"/>
<title type="html"><![CDATA[Re: EEPROM - błędy w zapisie]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=13719&amp;p=146709#p146709"><![CDATA[
Witam,<br /><br />jedyne, co mi się rzuciło w oczy, to to że wywołujesz funkcję zapisu do EEPROM-a w pętli głównej, wygląda na to, że co około 100ms, być może komórka pamięci, w której masz zapisywany ten licznik, już nie żyje. Kiedyś, na skutek tego typu błędu udało mi się uszkodzić kilka komórek w EEPROM-ie. Warto to jakoś oflagować, albo najpierw odczytywać EEPROM-a i zapisywać jedynie wtedy, gdy jakieś dane uległy zmianie. Kolejna sprawa, przy korzystaniu z EEPROM-a w projektach należy <strong>bezwzględnie</strong> uruchamiać układ BOD w mikrokontrolerze, bo może się okazać, że przy wyłączeniu zasilania procek na resztkach energii &quot;robi co chce&quot; ( i często się tak zdarza, że potrafi nadpisać dane w EEPROM-ie). Nie wiem, jak konkretnie się to nazywa w Twoim procku, np. w AT128 w fuse bitach było coś takiego jak BODEN i BODLEVEL zdaje się. <br />W kodzie błędów jako takich nie zauważyłem.<br /><br />Pozdrawiam, QuadMan.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=5291">QuadMan</a> — 30 lis 2015, o 00:46</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[zoom]]></name></author>
<updated>2015-11-29T19:05:14+01:00</updated>
<published>2015-11-29T19:05:14+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=13719&amp;p=146673#p146673</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=13719&amp;p=146673#p146673"/>
<title type="html"><![CDATA[EEPROM - błędy w zapisie]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=13719&amp;p=146673#p146673"><![CDATA[
Witam!<br /><br />Mam problem z prostym kodem. Jest to banalny program na ATtiny2313A, który zlicza czas - sekundy, minuty, godziny, dni. Oczywiście jest to niedokładne, bo oparte o timer w procku, ale nie o dokładność tu chodziło.<br />Pamiętam, że poprzednio z zapisywaniem i odczytywaniem danych z EEPROM nie miałem żadnych cyrków. A teraz takie dziwactwa.<br />W EEPROM zapisuję sobie ilość włączeń urządzenia - inkrementuję licznik podczas każdego włączenia zasilania. Oprócz tego zapamiętuję stan diody (świeci, nie świeci).<br />Stan diody zawsze się zgadza, jeśli wyłączyłem z diodą włączoną, to po włączeniu świeci i na odwrót.<br />Niestety licznik mi wariuje. Pierwsze włączenie się zgadza (1), a później zazwyczaj jest np. 202, 203 itd. Raz zaczęło zliczać w dół, no dziwy. Coś pewnie chrzanię w kodzie, proszę mi to wytknąć, wszystko wrzucam poniżej.<br />Zapisywanie i odczytywanie z EEPROM realizuję poprzez struktury, jak Mirek przykazał <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";-)" title="Puszcza oko" /><br /><br />plik main.c<br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;string.h&gt;<br />#include &lt;inttypes.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;avr/power.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &lt;avr/eeprom.h&gt;<br />#include &lt;avr/pgmspace.h&gt;<br />#include &quot;common.h&quot;<br />#include &quot;LCD/lcd44780.h&quot;<br />#include &lt;stdlib.h&gt;<br /><br /><br />TCFG ram_cfg;<br />TCFG eem_cfg EEMEM;<br />TCFG const pgm_cfg PROGMEM={0,0,0};<br /><br />uint8_t key_lock;<br /><br />//char napis1&#91;&#93;=&quot;Wojtek przesuwa napis!&quot;;<br />//char napis2&#91;&#93;=&quot;A Iza sie patrzy...&quot;;<br /><br />volatile uint16_t time=0, pre_time=0, ovf=0;<br />volatile uint8_t sec=0, min=0, h=0, d=0;<br />uint8_t prev_sec;<br /><br />char buf&#91;16&#93;;<br /><br /><br />//GŁÓWNA PĘTLA<br />int main(void){<br />cli();<br /><br />DDRD |= (1&lt;&lt;PD3)|(1&lt;&lt;PD4); //diody<br />DDRB &amp;= ~(1&lt;&lt;PB6);<br />PORTB |= (1&lt;&lt;PB6);<br /><br />TCCR0A |= (1&lt;&lt;WGM01); // CTC mode<br />TCCR0B |= (1&lt;&lt;CS00)|(1&lt;&lt;CS02); // preskaler 1024<br />OCR0A = 78;//130; //8MHz rezonator / 1024 preskaler / 60Hz = 130 - cos za wolno chodzi<br />TIMSK |= (1&lt;&lt;OCIE0A); // zezwolenie na przerwanie Compare Match<br /><br />LED1_OFF;<br />LED2_OFF;<br />_delay_ms(10);<br /><br /><br />lcd_init();<br />lcd_cls();<br /><br />check_and_load_defaults();<br /><br />if( KEY_DOWN ) {<br />load_defaults();<br />lcd_locate(0,1);<br />lcd_str(&quot;load defaults&quot;);<br />_delay_ms(1000);<br />lcd_cls();<br />}<br /><br />ram_cfg.licznik++; //licznik włączeń urządzenia<br /><br />lcd_locate(1,12);<br />lcd_int(ram_cfg.licznik);<br /><br />if(ram_cfg.stan_led==1){LED1_ON;}<br />else{LED1_OFF;}<br /><br />sei();<br /><br />while(1){<br /><br />if(prev_sec!=sec){<br />LED2_TOG;<br />prev_sec=sec;<br />}<br /><br />if( !key_lock &amp;&amp; !(PINB &amp; KEY_PIN ) ) {<br />   key_lock=1;<br /><br />   // reakcja na PRESS (wcinięcie przycisku)<br />   LED1_TOG;<br /><br />  } else if( key_lock &amp;&amp; (PINB &amp; KEY_PIN ) ) key_lock=0;<br /><br />lcd_locate(1,0);<br /><br />if(PIND&amp;(1&lt;&lt;PD3)){<br /><br />lcd_str(&quot;LED ON &quot;);<br />ram_cfg.stan_led=1;<br />_delay_ms(100);<br />}<br />else{<br /><br />lcd_str(&quot;LED OFF&quot;);<br />ram_cfg.stan_led=0;<br />_delay_ms(100);<br />}<br /><br />cli();<br />copy_ram_to_eem();<br />sei();<br /><br />if(sec&gt;59){<br />sec=0;<br />min++;<br />if(min&gt;59){<br />min=0;<br />h++;<br />if(h&gt;23){<br />h=0;<br />d++;<br />}<br />}<br />}<br /><br />//itoa((int)sec, buf, 10);<br />lcd_locate(0,12);<br />lcd_str(&quot;  &quot;);<br />lcd_locate(0,12);<br />lcd_int((int)sec);<br />lcd_locate(0,14);<br />lcd_str(&quot;s&quot;);<br /><br />//itoa((int)min, buf, 10);<br />lcd_locate(0,7);<br />lcd_str(&quot;  &quot;);<br />lcd_locate(0,7);<br />lcd_int((int)min);<br />lcd_locate(0,9);<br />lcd_str(&quot;min&quot;);<br /><br />//itoa((int)h, buf, 10);<br />lcd_locate(0,4);<br />lcd_str(&quot;  &quot;);<br />lcd_locate(0,4);<br />lcd_int((int)h);<br />lcd_locate(0,6);<br />lcd_str(&quot;h&quot;);<br /><br />//itoa((int)d, buf, 10);<br />lcd_locate(0,0);<br />lcd_str(&quot;   &quot;);<br />lcd_locate(0,0);<br />lcd_int((int)d);<br />lcd_locate(0,3);<br />lcd_str(&quot;d&quot;);<br /><br />}<br />}<br /><br />ISR(TIMER0_COMPA_vect){<br />time++;<br />if(!(time%100)){sec++;<br /><br />}<br /><br />}[/syntax]<br /><br />common.h<br />[syntax=c]/*<br /> * common.h<br /> *<br /> *  Created on: 16-04-2015<br /> *      Author: Wojtek<br /> */<br /><br />#include &lt;avr/eeprom.h&gt;<br />#include &lt;avr/pgmspace.h&gt;<br /><br />#ifndef COMMON_H_<br />#define COMMON_H_<br /><br />#define KEY_PIN (1&lt;&lt;PB6)<br />#define KEY_DOWN !(PINB &amp; KEY_PIN)<br /><br />#define LED1_ON PORTD|=(1&lt;&lt;PD3)<br />#define LED2_ON PORTD|=(1&lt;&lt;PD4)<br />#define LED1_OFF PORTD&amp;=~(1&lt;&lt;PD3)<br />#define LED2_OFF PORTD&amp;=~(1&lt;&lt;PD4)<br />#define LED1_TOG PORTD^=(1&lt;&lt;PD3)<br />#define LED2_TOG PORTD^=(1&lt;&lt;PD4)<br /><br />typedef struct{<br />uint8_t stan_led;<br />uint8_t stan_pwm;<br />uint8_t licznik;<br />}TCFG;<br /><br />extern TCFG const pgm_cfg PROGMEM;// dane w pamięci FLASH<br />extern TCFG eem_cfg EEMEM;// dane w pamięci EEPROM<br />extern TCFG ram_cfg;// dane w pamięci RAM<br /><br />void check_and_load_defaults( void );<br />void copy_eem_to_ram( void );<br />void copy_ram_to_eem( void );<br />void copy_pgm_to_ram( void );<br />void load_defaults( void );<br /><br /><br />#endif /* COMMON_H_ */[/syntax]<br /><br />common.c<br />[syntax=c]/*<br /> * common.c<br /> *<br /> *  Created on: 16-04-2015<br /> *      Author: Wojtek<br /> */<br /><br />#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;avr/eeprom.h&gt;<br />#include &lt;avr/pgmspace.h&gt;<br /><br />#include &quot;common.h&quot;<br /><br /><br /><br />void copy_eem_to_ram( void ) {<br />eeprom_read_block( &amp;ram_cfg, &amp;eem_cfg, sizeof(ram_cfg) );<br />}<br /><br />void copy_ram_to_eem( void ) {<br />eeprom_write_block( &amp;ram_cfg, &amp;eem_cfg, sizeof(ram_cfg) );<br />}<br /><br />void copy_pgm_to_ram( void ) {<br />memcpy_P( &amp;ram_cfg, &amp;pgm_cfg, sizeof(ram_cfg) );<br />}<br /><br />void load_defaults( void ) {<br />copy_pgm_to_ram();<br />copy_ram_to_eem();<br />}<br /><br />void check_and_load_defaults( void ) {<br />uint8_t i, len = sizeof( ram_cfg );<br />uint8_t * ram_wsk = (uint8_t*)&amp;ram_cfg;<br /><br />copy_eem_to_ram();<br />for(i=0; i&lt;len; i++) {<br />if( 0xff == *ram_wsk++ ) continue;<br />break;<br />}<br /><br />if( i == len ) {<br />load_defaults();<br />}<br /><br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=685">zoom</a> — 29 lis 2015, o 19:05</p><hr />
]]></content>
</entry>
</feed>