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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2014-05-15T13:49:09+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=7018&amp;mode</id>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2014-05-15T13:45:16+01:00</updated>
<published>2014-05-15T13:45:16+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=7018&amp;p=81196#p81196</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=7018&amp;p=81196#p81196"/>
<title type="html"><![CDATA[Re: Atmega eeprom zapis/odczyt a przerwania]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=7018&amp;p=81196#p81196"><![CDATA[
<div class="quotetitle">Kawczynski napisał(a):</div><div class="quotecontent"><br />należy używać <br />ATOMIC_BLOCK czyli sekcji krytycznych w avr<br /></div><br /><br />ale warto też wiedzieć, że można wprost w kodzie zrobić to np tak:<br /><br /><br />[syntax=c]uint8_t sreg = SREG // zapamiętujemy stan globalych przerwań bit I<br />cli();  // blokujemy globalnie przerwania<br /><br />//... tutaj wrażliwy na przerwania kod<br /><br />SREG = sreg;  // odzyskujemy stan globalnych przerwań[/syntax] <br /><br />zresztą ten akurat ATOMIC robi dokładnie to samo<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 15 maja 2014, o 13:45</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Kawczynski]]></name></author>
<updated>2014-05-15T13:49:09+01:00</updated>
<published>2014-05-15T13:41:03+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=7018&amp;p=81195#p81195</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=7018&amp;p=81195#p81195"/>
<title type="html"><![CDATA[Re: Atmega eeprom zapis/odczyt a przerwania]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=7018&amp;p=81195#p81195"><![CDATA[
cli sei nie powinno sie używać w programie , oprócz tego zeby aby raz włączyc przerwanie na poczatku programu i tyle , <br /><br />należy używać <br />ATOMIC_BLOCK czyli sekcji krytycznych w avr <br /><br /> w twoim przypadku moze sie przydać<br /><br />[syntax=c]#include &lt;util\atomic.h&gt;<br /><br />ATOMIC_BLOCK(ATOMIC_RESTORESTATE)<br />{<br />    // operacje na eepromie <br />}[/syntax]<br />ATOMIC_RESTORESTATE - powodującą zapamiętanie przed wejściem do sekcji krytycznej globalnej flagi zezwolenia na przerwania, w srodku bloku nastepuje zablokowanie  przerwań,  następnie wykonuje się  kodu  i na koniec przywrócenie stanu flagi zezwolenia na przerwanie.<br /><br />rzadko jaka ksiazka opisuje ta funkcjonalność , mozesz poczytac o nich w <br />dokumentacji <br /><!-- m --><a class="postlink" href="http://www.nongnu.org/avr-libc/user-manual/group__util__atomic.html" >http://www.nongnu.org/avr-libc/user-man ... tomic.html</a><!-- m --><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=4325">Kawczynski</a> — 15 maja 2014, o 13:41</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[sq8dsr]]></name></author>
<updated>2014-05-15T13:15:38+01:00</updated>
<published>2014-05-15T13:15:38+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=7018&amp;p=81193#p81193</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=7018&amp;p=81193#p81193"/>
<title type="html"><![CDATA[Re: Atmega eeprom zapis/odczyt a przerwania]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=7018&amp;p=81193#p81193"><![CDATA[
No właśnie chodzi o to by przerwanie nie wystąpiło w czasie zapisu do eeprom. Operacja to nie trwa jeden cykl, tylko 4 cykle i jeśli przerwanie wystąpi w trakcie to będzie źle. Dlatego na ten czas trzeba wyłączyć przerwania. <br />Jest to opisane w nocie i podany jest sposób polegający kopiowaniu aktualnej zawartości rejestru SREG do zmiennej a następnie przywróceniu zawartości SREG ze kopii. <br />Dla uproszczania istnieje makro, którego przykład użycia opisał Krauser.<br /><br />Jeśli pisałbyś do eeprom w przerwaniu to ten proces nigdy nie zostanie przerwany (chyba że zezwolisz na przerwanie w przerwaniu bo jest taka możliwość).<br />Ale jakoś nie bardzo może mi przyjść do głowy sytuacja w której wskazane by było pisanie do eeprom w przerwaniu.<br />Choć oczywiście można to zrobić np. przez cykliczne sprawdzanie jakiejś flagi.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1589">sq8dsr</a> — 15 maja 2014, o 13:15</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[CeBe]]></name></author>
<updated>2014-05-15T12:38:49+01:00</updated>
<published>2014-05-15T12:38:49+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=7018&amp;p=81191#p81191</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=7018&amp;p=81191#p81191"/>
<title type="html"><![CDATA[Re: Atmega eeprom zapis/odczyt a przerwania]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=7018&amp;p=81191#p81191"><![CDATA[
A jeśli w przerwaniu nie korzystam z eeproma tylko w głównym programie to też trzeba zatrzymywać? Szukałem wszędzie i jednoznacznej odpowiedzi nie mogę znaleźć a nie daje mi to spokoju.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=573">CeBe</a> — 15 maja 2014, o 12:38</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Krauser]]></name></author>
<updated>2014-05-09T19:55:07+01:00</updated>
<published>2014-05-09T19:55:07+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=7018&amp;p=80670#p80670</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=7018&amp;p=80670#p80670"/>
<title type="html"><![CDATA[Re: Atmega eeprom zapis/odczyt a przerwania]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=7018&amp;p=80670#p80670"><![CDATA[
Wyłączenie ewentualnych przerwań jest konieczne w obu przypadkach. Dla odczytu ponieważ jeśli w przerwaniu byłby również odczyt to zmieni adres, a dla zapisu z tego samego powodu oraz dlatego, że sekwencja zapisu to modyfikacja 2 bitów, ale są to oddzielne rozkazy i ten drugi musi być wykonany w ciągu 4 cykli. Spóźnienie skutkuje brakiem zapisu.<br /><br />Nie używałbym tutaj sekwencji cli sei, bo po takiej akcji przerwania zostaną one odblokowane, a nie wiadomo jak było. Lepiej umieścić to w bloku:<br />[syntax=c]ATOMIC_BLOCK(ATOMIC_RESTORESTATE)<br />{<br />   eeprom_write_byte ((uint8_t*)a, b);<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=465">Krauser</a> — 9 maja 2014, o 19:55</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[CeBe]]></name></author>
<updated>2014-05-09T11:40:20+01:00</updated>
<published>2014-05-09T11:40:20+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=7018&amp;p=80624#p80624</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=7018&amp;p=80624#p80624"/>
<title type="html"><![CDATA[Atmega eeprom zapis/odczyt a przerwania]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=7018&amp;p=80624#p80624"><![CDATA[
Przeglądając w internecie natknąłem się na parę instrukcji gdzie wynikałoby że przy zapisie i odczycie konieczne jest wyłączenie przerwań np:<br /><br />[syntax=c]cli();<br />eeprom_write_byte ((uint8_t*)a, b);<br />sei();[/syntax]<br /><br />lub<br />[syntax=c]cli();<br />a = eeprom_read_byte ((uint8_t*) b)<br />sei();[/syntax]<br /><br />Czy przy korzystaniu z przerwań konieczne jest używanie cli() sei() przy zapisie lub odczycie z eepromu?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=573">CeBe</a> — 9 maja 2014, o 11:40</p><hr />
]]></content>
</entry>
</feed>