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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2019-10-04T17:35:48+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=58&amp;t=22495&amp;mode</id>
<entry>
<author><name><![CDATA[xentis]]></name></author>
<updated>2019-10-04T17:35:48+01:00</updated>
<published>2019-10-04T17:35:48+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=22495&amp;p=222361#p222361</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=22495&amp;p=222361#p222361"/>
<title type="html"><![CDATA[Re: Zapisywanie danych do zewnętrznego EEPROMu (I2C)]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=22495&amp;p=222361#p222361"><![CDATA[
Nie wiem czy dobrze rozumiem Twój problem bo trochę chaotycznie to opisujesz.<br />Rozumiem to tak, że masz rejestr który czymś steruje, i chcesz mieć możliwość odczytanie stanu pinów rejestru i zapisu ich w rozbiciu na zmienne, oraz w drugą stronę ze zmiennych chcesz mieć możliwość wysłać ich stan do rejestru<br />Takie coś możesz zrobić na zwykłych warunkach if:<br />[syntax=c]uint8_t rejestr; //bufor przechowujący stan rejestru<br /><br />// odczyt z bufora rejestru i zapis do zmiennych:<br />//tu funkcja odczytująca zawartość rejestru do bufora &quot;rejestr&quot;<br />//następnie warunki sortujące dane:<br />if(rejestr&amp;bright_hex) BRIGHT_LED = 1, else BRIGHT_LED = 0;<br />if(rejestr&amp;contour_hex) CONTOUR_LED = 1, else CONTOUR_LED = 0;<br />// itd analogicznie dla pozostałych.<br /><br />//odczyt ze zmiennych i zapis do bufora rejestru<br />if(BRIGHT_LED) rejestr |= bright_hex; else rejestr &amp;= ~bright_hex;<br />//reszta analogicznie<br />//tu funkcja która wyśle bufor do rejestru[/syntax]<br /><br />dodatkowe ale:<br />[syntax=c]BRIGHT_LED &amp;= ~(1&lt;&lt;0);  // 1[/syntax] nie wiem skąd Ci się to wzięło ale ten zapis ustawia 0 a nie jeden i na odwrót z drugim zapisem, chyba że potrzebujesz mieć wartość zanegowaną, bo np masz diody sterowane zerem...<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=6265">xentis</a> — 4 paź 2019, o 17:35</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[xentis]]></name></author>
<updated>2019-09-12T21:52:06+01:00</updated>
<published>2019-09-12T21:52:06+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=22495&amp;p=221947#p221947</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=22495&amp;p=221947#p221947"/>
<title type="html"><![CDATA[Re: Zapisywanie danych do zewnętrznego EEPROMu (I2C)]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=22495&amp;p=221947#p221947"><![CDATA[
To ustaw sobie w stopce ikonę bb (można to zrobić w ustawieniach profilu). Dzięki temu jak ktoś będzie chciał Ci pomóc od razu widzi czym dysponujesz, i lepiej może dopasować odpowoedź.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=6265">xentis</a> — 12 wrz 2019, o 21:52</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[xentis]]></name></author>
<updated>2019-09-12T20:40:38+01:00</updated>
<published>2019-09-12T20:40:38+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=22495&amp;p=221944#p221944</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=22495&amp;p=221944#p221944"/>
<title type="html"><![CDATA[Re: Zapisywanie danych do zewnętrznego EEPROMu (I2C)]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=22495&amp;p=221944#p221944"><![CDATA[
Masz bluebooka?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=6265">xentis</a> — 12 wrz 2019, o 20:40</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[xentis]]></name></author>
<updated>2019-09-11T22:32:20+01:00</updated>
<published>2019-09-11T22:32:20+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=22495&amp;p=221917#p221917</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=22495&amp;p=221917#p221917"/>
<title type="html"><![CDATA[Re: Zapisywanie danych do zewnętrznego EEPROMu (I2C)]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=22495&amp;p=221917#p221917"><![CDATA[
Funkcje TWI_write_buf i TWI_read_buf są niewłaściwe dla pamięci 24C512, tak jak pisałem wcześniej, w obecnej postaci nadają się do obsługi pamięci 24C01 i 24C02.<br />Z kolei funkcje EI2C_write_buf i EI2C_read_buf są już bliższe prawdy, ale jeszcze nie to, te nadają się do obsługi pamięci 24C04, 24C08 i 24C16.<br /><br />Tu masz właściwą postać dla 24C512:<br />[syntax=c]void EI2C_write_buf ( uint8_t device, uint16_t subAddr, uint16_t len, uint8_t *buf ) {<br /> <br />        while (len--) {<br />                TWI_start();<br />                TWI_write( device );<br />                TWI_write( subAddr&gt;&gt;8 );<br />                TWI_write( subAddr++ );<br />                TWI_write( *buf++ );<br />                TWI_stop();<br />                _delay_ms(5); // oczekiwanie na zapis<br />        }<br />}<br /> <br />void EI2C_read_buf ( uint8_t device, uint16_t subAddr, uint16_t len, uint8_t *buf ) {<br />        while (len--) {<br />                TWI_start();<br />                TWI_write( device );<br />                TWI_write( subAddr&gt;&gt;8 );<br />                TWI_write( subAddr++ );<br />                TWI_start();<br />                TWI_write( device + 1 );<br />                *buf++ = TWI_read( NACK );<br />                TWI_stop();<br />        }<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=6265">xentis</a> — 11 wrz 2019, o 22:32</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[xentis]]></name></author>
<updated>2019-09-11T07:30:20+01:00</updated>
<published>2019-09-11T07:30:20+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=22495&amp;p=221902#p221902</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=22495&amp;p=221902#p221902"/>
<title type="html"><![CDATA[Re: Zapisywanie danych do zewnętrznego EEPROMu (I2C)]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=22495&amp;p=221902#p221902"><![CDATA[
trudno powiedzieć czy wszystko ok nie widząc ciała funkcji &quot;TWI_write/read_bufor&quot; ale pierwsze co rzuca sie w oczy to to:<br />[syntax=c]uint8_t bufor&#91;4&#93;;<br /> <br />bufor&#91;0&#93; = dec2bcd(4);<br />bufor&#91;1&#93; = dec2bcd(7);<br />bufor&#91;2&#93; = dec2bcd(12);<br />bufor&#91;3&#93; = dec2bcd(19);[/syntax]kod BCD służy do zapisu pojedynczych cyfr dziesiętnych w jednym bajcie, ty prubujesz upchać np 19 w jednym bajcie co jest niemożliwe bo są to dwie cyfry dziesiętne więc muszą zajmować dwa bajty w BCD, oczywiście są implementacje umożliwiające zapis BCD dwóch cyfr dziesiętnych w jednym bajcie, ale nie wiem czy w tym przypadku to jest możliwe (obsługiwane przez funkcję dec2bcd).<br /><br />Tak czy inaczej pierwsze dwie komórki tablicy bufora powinny zostać napełnione prawidłowo, a skoro nie są to problemu bym szukał w funkcjach zapisu/odczytu eeproma.<br />Te funkcje naskrobałeś sam czy masz z jakiegoś źródła? Bo widzisz z tymi pamięciami jest pewien problem, a mianowicie ich cała rodzina nie ma jednorodnego protokołu komunikacji ze względu na różną długość adresu potrzebnego do zaadresowania całej przestrzeni pamięci. I tak np kość 24c02 ma pojemność 2048 bitów, a komórki są 8 bitowe więc komórek jest 256, wiec adres ostatniej komórki to 255, czyli dokładnie jeden bajt. Pamięć której użyłeś ma pojemność 512*1024=524288, dzieląc przez 8 otrzymujemy 65536 komórek pamięci, a do zaadresowania ostatniej potrzeba dwóch bajtów. A to nie koniec niespodzianek. Pamięci których pojemność wymaga niepełnych dwóch bajtów są tak pokręcone że część adresu komórki która &quot;wystaje&quot; poza pierwszy bajt jest upychana w miejsce adresu sprzętowego (te kości mają albo ograniczoną możliwość zmiany adresu albo nie mają tej możliwości wcale).<br />Podsumowując, może być tak, że funkcje których używasz, były napisane pod inny rozmiar pamięci i twoją kostko nie chcą poprawnie gadać.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=6265">xentis</a> — 11 wrz 2019, o 07:30</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[xentis]]></name></author>
<updated>2019-08-27T18:19:16+01:00</updated>
<published>2019-08-27T18:19:16+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=22495&amp;p=221677#p221677</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=22495&amp;p=221677#p221677"/>
<title type="html"><![CDATA[Re: Zapisywanie danych do zewnętrznego EEPROMu (I2C)]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=22495&amp;p=221677#p221677"><![CDATA[
Jeśli kostka ma możliwość zmiany adresu i piny masz na masie to do adresu w miejsca A0, A1 i A2 trafiają zera czyli adres to 0b10100000 (w heksie 0xA0)  lub w stylu arduinowców 0b01010000 (w heksie 0x50).<br /><a href="https://obrazkiforum.atnel.pl/6265/6e090d0b26c1043cdeece947782cdced.png"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/6265/6e090d0b26c1043cdeece947782cdced.png" alt="Obrazek" /></a><br />Jeśli dany pin jest na masie to w miejsce numeru pinu w adresie wskakuje &quot;0&quot;, jeśli pin jest do Vcc to wskakuje &quot;1&quot;<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 10 minutach ]</span></strong><br /><br /><div class="quotetitle">Semi napisał(a):</div><div class="quotecontent"><br />I myślisz, że osiągniesz to dodając zewnętrzne układy? Mylisz się, już pisałem, w ten sposób awaryjność zwiększa się.<br /></div>Kolega trochę demonizuje. Dużo producentów różnorakiego sprzętu umieszcza ustawienia w zewnętrznych pamięciach eeprom. Tylko może bardziej jest to podyktowane prostotą załadowania ustawień do takiej pamięci niż względami jej większej niezawodności. Łatwiej jest zaprogramować zewnętrzną kostkę niż dobierać się do uC który zazwyczaj jest zabezpieczony przed odczytem, a co za tym idzie i przed zapisem. Więc w takim przypadku trzeba by wykasować całą pomięć procka by ponownie wrzucić zawartość wsadów. A tak wystarczy zaprogramować eeprom i po sprawie.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=6265">xentis</a> — 27 sie 2019, o 18:19</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Semi]]></name></author>
<updated>2019-08-20T19:55:26+01:00</updated>
<published>2019-08-20T19:55:26+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=22495&amp;p=221456#p221456</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=22495&amp;p=221456#p221456"/>
<title type="html"><![CDATA[Re: Zapisywanie danych do zewnętrznego EEPROMu (I2C)]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=22495&amp;p=221456#p221456"><![CDATA[
<div class="quotetitle">felinutti napisał(a):</div><div class="quotecontent"><br />Urządzenia będzie działać dopóki któreś z nas wymięknie <img src="https://forum.atnel.pl/images/smilies/icon_e_biggrin.gif" alt=":D" title="Bardzo szczęśliwy" /> Ilość odczytów i zapisów nie będzie jakaś ogromna (myślę, że jeśli przekroczę 1000 to będzie cud), ale chcę do minimum ograniczyć możliwą awaryjność.<br /></div><br />I myślisz, że osiągniesz to dodając zewnętrzne układy? Mylisz się, już pisałem, w ten sposób awaryjność zwiększa się.<br /><br /><div class="quotetitle">felinutti napisał(a):</div><div class="quotecontent"><br />Myślałem nad czymś w stylu back'upu wszystkich ustawień<br /></div><br />Dobry pomysł ale połącz to z CRC o którym pisałem. Możesz dodatkowo trzymać pozą kopia w EEPROM kopię w FLASH.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=20851">Semi</a> — 20 sie 2019, o 19:55</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Semi]]></name></author>
<updated>2019-08-20T13:34:03+01:00</updated>
<published>2019-08-20T13:34:03+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=22495&amp;p=221429#p221429</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=22495&amp;p=221429#p221429"/>
<title type="html"><![CDATA[Re: Zapisywanie danych do zewnętrznego EEPROMu (I2C)]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=22495&amp;p=221429#p221429"><![CDATA[
<div class="quotetitle">felinutti napisał(a):</div><div class="quotecontent"><br />Ogromne dzięki za wskazówkę! Nie mam o tym pojęcia więc trochę czasu mi zajmie ugryzienie tego  <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> <br /><br /><div class="quotetitle"><b>Quote:</b></div><div class="quotecontent">Dlaczego zewnętrzny EEPROM a nie wbudowany w AVR?<br /></div><br />Pytałem kiedyś, na którymś forum jakie rozwiązanie lepsze to polecono mi zewnętrzną kość bo jest mniej awaryjna (bezpieczniejsza)<br /></div><br />Z tym się nie zgodzę. Każdy dodatkowy element powoduje ryzyko zwiększenia awaryjności. Co się częściej psuje, rower czy samochód?<br /><br /><div class="quotetitle">felinutti napisał(a):</div><div class="quotecontent"><br />i ma 10-krotnie większą żywotność jeśli chodzi o zapis.<br /></div><br />Ile zapisów potrzebujesz? Jaki czas &quot;życia&quot; urządzenia jest wymagany? Może lepszy będzie FRAM?<br /><br /><div class="quotetitle">felinutti napisał(a):</div><div class="quotecontent"><br />Zasugerowałem się tym i takie rozwiązanie zastosowałem. 24c512 jest sporo za duże, ale chciałem coś z dużym zapasem, żeby nie musieć wymieniać w razie jakby się okazało, że jednak brakuje. Obecnie cały program piszę dla Atmega16, ale domyślnie będzie to Atmega1284 z tego samego powodu co EEPROM  <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /></div><br />Jak masz dużo FLASH a potrzebujesz dużej liczby zapisów, to emuluj EEPROM w FLASH. W ten sposób może sobie zwiększyć liczbę zapisów do 10 czy słynnych wałęsowych 100 mln niskim kosztem. W praktyce, w mikrokontrolerach często nie ma pamięci EEPROM, jest ona emulowana w FLASH.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=20851">Semi</a> — 20 sie 2019, o 13:34</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Semi]]></name></author>
<updated>2019-08-19T08:29:16+01:00</updated>
<published>2019-08-19T08:29:16+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=22495&amp;p=221380#p221380</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=22495&amp;p=221380#p221380"/>
<title type="html"><![CDATA[Re: Zapisywanie danych do zewnętrznego EEPROMu (I2C)]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=22495&amp;p=221380#p221380"><![CDATA[
Użyj struktury.<br />[syntax=c]struct rekord{<br /> char bit0 : 1,<br /> char bit0 : 2,<br /> ...<br /> char bit0 : 10,<br />}rekord;<br /><br />eeprom rekord&#91;40&#93;;[/syntax]<br />Do eepromu wyślesz element struktury (można i calą strukturę)<br />[syntax=c]eeprom_write_block( 0, eeprom+rekord*nrRekordu, sizeof(rekord) );[/syntax]<br />gdzie kolejne parametry to<br />0 - adres w eeprom I2C<br />eeprom+rekord*nrRekordu- adres danych w ram<br />sizeof(rekord) - liczba danych do zapisu<br /><br />Strony pamięci nie przekraczasz (24C512 ma 128bajtów), więc zapis zajmie max 5ms. Aby program nie wisiał w czasie transferu danych użyj przerwań TWI.<br /><br />Dlaczego zewnętrzny EEPROM a nie wbudowany w AVR? Mega16 ma 512bajtów eeprom. Potrzebujesz 40x4x2 bajty = 320. Warto aby dane były chronione przez CRC (np CRC8), więc 40x4x(2+2) = 480bajtów.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=20851">Semi</a> — 19 sie 2019, o 08:29</p><hr />
]]></content>
</entry>
</feed>