<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title>Учебный курс AVR. Работа с EEPROM. Низкоуровневое чтение и запись данных. Ч2</title>
		<description>Discuss Учебный курс AVR. Работа с EEPROM. Низкоуровневое чтение и запись данных. Ч2</description>
		<link>https://chipenable.ru/index.php/programming-avr/item/153-avr-rabota-s-eeprom-na-si.html</link>
		<lastBuildDate>Sat, 18 Apr 2026 10:50:12 +0000</lastBuildDate>
		<generator>JComments</generator>
		<atom:link href="https://chipenable.ru/index.php/component/jcomments/feed/com_k2/153.html" rel="self" type="application/rss+xml" />
		<item>
			<title>Виктор says:</title>
			<link>https://chipenable.ru/index.php/programming-avr/item/153-avr-rabota-s-eeprom-na-si.html#comment-3911</link>
			<description><![CDATA[Я открыл америку Оказывается такая тема используется вдоль и поперек. Кому интересно почитайте по супервизорам.]]></description>
			<dc:creator>Виктор</dc:creator>
			<pubDate>Mon, 24 Mar 2014 17:43:14 +0000</pubDate>
			<guid>https://chipenable.ru/index.php/programming-avr/item/153-avr-rabota-s-eeprom-na-si.html#comment-3911</guid>
		</item>
		<item>
			<title>Виктор says:</title>
			<link>https://chipenable.ru/index.php/programming-avr/item/153-avr-rabota-s-eeprom-na-si.html#comment-3904</link>
			<description><![CDATA[Ребята! ввиду стольких нюансов с обслуживанием EEPROM в основном цикле, горячие дебаты по поводу как записывать, как читать, сохранять-не сохранять, разрешать-не разрешать, выдвигаю на обсуждение такой вариант: 1.Все переменные потенциально нуждающиеся в сохранении в EEPROM, во время основного цикла хранятся в SRAM. 2.Используется внешний монитор питания который в случае снижения питающего напряжения подает сигнал на пин INT0 обладающий высшим приоритетом прерывания после RESET. В обработчик помещаются все необходимыемеро приятия для сохранения вышеупомянутых переменных хоть по две, хоть по три копии из SRAM в EEPROM. И будет всем счастье, причем не одно. Во первых не будут расходоваться лишний раз цыклы перезаписи. Во вторых во время работы основного цикла перепысывай хоть по сто раз свои данные без всяких флагов и т.п. переживаний. И в третьих, если питание пропало или падает мне уже без разницы сколько я буду занят в этом самом прерывании, устройство не работает. Теперь как это сделать. Ставится кондер большой емкости. После команды внешнего монитора питания вся схема отключается, проц питается от кондера (какое то время, необходимо расчитать емкость) выполняет приоритетную процедуру по внешнему прерыванию и сохраняет все необходимые данные. Затем как по учебнику нужно чтобы монитор инициировал "твердый" сброс и ПАВЕР ОФФ. вуаля.]]></description>
			<dc:creator>Виктор</dc:creator>
			<pubDate>Fri, 21 Mar 2014 19:52:05 +0000</pubDate>
			<guid>https://chipenable.ru/index.php/programming-avr/item/153-avr-rabota-s-eeprom-na-si.html#comment-3904</guid>
		</item>
		<item>
			<title>ArtemKAD says:</title>
			<link>https://chipenable.ru/index.php/programming-avr/item/153-avr-rabota-s-eeprom-na-si.html#comment-3260</link>
			<description><![CDATA[ Да так-же если на нескольких уровнях читать содержимое EEPROM надо или сохранять/восст анавливать регистры или делать "критическую секцию" на каждом уровне или вообще не использовать EEPROM в прерываниях...]]></description>
			<dc:creator>ArtemKAD</dc:creator>
			<pubDate>Tue, 17 Sep 2013 14:25:01 +0000</pubDate>
			<guid>https://chipenable.ru/index.php/programming-avr/item/153-avr-rabota-s-eeprom-na-si.html#comment-3260</guid>
		</item>
		<item>
			<title>_Артём_ says:</title>
			<link>https://chipenable.ru/index.php/programming-avr/item/153-avr-rabota-s-eeprom-na-si.html#comment-3259</link>
			<description><![CDATA[ ФКурсе, но то дела минувших дней...и тд. Сейчас не актуально. Но как несколько уровней приоритета прерываний влияют на работу с eeprom вы так и не уточнили.]]></description>
			<dc:creator>_Артём_</dc:creator>
			<pubDate>Mon, 16 Sep 2013 23:09:19 +0000</pubDate>
			<guid>https://chipenable.ru/index.php/programming-avr/item/153-avr-rabota-s-eeprom-na-si.html#comment-3259</guid>
		</item>
		<item>
			<title>_Артём_ says:</title>
			<link>https://chipenable.ru/index.php/programming-avr/item/153-avr-rabota-s-eeprom-na-si.html#comment-3258</link>
			<description><![CDATA[ По разному: кто делает, а кто и нет. Было пару сотен xmeg A3 rev.B. Не делали такой процедуры - такая eeprom неработоспособн а. Поставили AT25 на 1 КБ. На 10-20 центов дороже, но зато правильней и быстрей работает ещё к тому же.]]></description>
			<dc:creator>_Артём_</dc:creator>
			<pubDate>Mon, 16 Sep 2013 22:03:25 +0000</pubDate>
			<guid>https://chipenable.ru/index.php/programming-avr/item/153-avr-rabota-s-eeprom-na-si.html#comment-3258</guid>
		</item>
		<item>
			<title>ArtemKAD says:</title>
			<link>https://chipenable.ru/index.php/programming-avr/item/153-avr-rabota-s-eeprom-na-si.html#comment-3257</link>
			<description><![CDATA[Уточняю - ситуация описана в "AVR1008: Writing EEPROM and Flash in XMEGA A3/D3/256A3B Revision B"]]></description>
			<dc:creator>ArtemKAD</dc:creator>
			<pubDate>Mon, 16 Sep 2013 21:56:07 +0000</pubDate>
			<guid>https://chipenable.ru/index.php/programming-avr/item/153-avr-rabota-s-eeprom-na-si.html#comment-3257</guid>
		</item>
		<item>
			<title>ArtemKAD says:</title>
			<link>https://chipenable.ru/index.php/programming-avr/item/153-avr-rabota-s-eeprom-na-si.html#comment-3256</link>
			<description><![CDATA[ Самое любопытное, что в связи с некоторым глюком первых ревизий xMega в Atmel-овской процедуре записи EEPROM примерно так и делают. Готовят данные для записи, запрещают все прерывания кроме наивысшего уровня и усыпляют камень до завершения записи (собственного прерывания EEPROM).]]></description>
			<dc:creator>ArtemKAD</dc:creator>
			<pubDate>Mon, 16 Sep 2013 21:30:34 +0000</pubDate>
			<guid>https://chipenable.ru/index.php/programming-avr/item/153-avr-rabota-s-eeprom-na-si.html#comment-3256</guid>
		</item>
		<item>
			<title>ArtemKAD says:</title>
			<link>https://chipenable.ru/index.php/programming-avr/item/153-avr-rabota-s-eeprom-na-si.html#comment-3255</link>
			<description><![CDATA[ Как-то это идеологически неправильно. имхо. Там где использовал - было правильно. Правда надо добавить, что в том прерывании прежде чем заниматься столь длительными процедурами(и криптография и сохранение) остальные прерывания таки разрешались. PS. Сейчас конечно сделал бы иначе, но что было то было...]]></description>
			<dc:creator>ArtemKAD</dc:creator>
			<pubDate>Mon, 16 Sep 2013 21:09:30 +0000</pubDate>
			<guid>https://chipenable.ru/index.php/programming-avr/item/153-avr-rabota-s-eeprom-na-si.html#comment-3255</guid>
		</item>
		<item>
			<title>_Артём_ says:</title>
			<link>https://chipenable.ru/index.php/programming-avr/item/153-avr-rabota-s-eeprom-na-si.html#comment-3251</link>
			<description><![CDATA[ Уже перешёл на xmega. Чем там отличаются приёмы работы с eeprom? Что такого приритетный контроллер прерываний вносит нового? Всё также делаю - чтение/запись в eeprom только в основной программе. Если по вашему делать (ждать конца записи в прерывании), то получается блокировка уровня (или нескольких) на время записи. Не годится такое.]]></description>
			<dc:creator>_Артём_</dc:creator>
			<pubDate>Mon, 16 Sep 2013 17:18:43 +0000</pubDate>
			<guid>https://chipenable.ru/index.php/programming-avr/item/153-avr-rabota-s-eeprom-na-si.html#comment-3251</guid>
		</item>
		<item>
			<title>_Артём_ says:</title>
			<link>https://chipenable.ru/index.php/programming-avr/item/153-avr-rabota-s-eeprom-na-si.html#comment-3250</link>
			<description><![CDATA[ Что же это за прерывание на несколько миллисекунд? Как-то неправильно это. Смысл - синхронизироват ь значения. Но это можно делать нечасто. Как-то это идеологически неправильно. имхо.]]></description>
			<dc:creator>_Артём_</dc:creator>
			<pubDate>Mon, 16 Sep 2013 17:15:15 +0000</pubDate>
			<guid>https://chipenable.ru/index.php/programming-avr/item/153-avr-rabota-s-eeprom-na-si.html#comment-3250</guid>
		</item>
		<item>
			<title>ArtemKAD says:</title>
			<link>https://chipenable.ru/index.php/programming-avr/item/153-avr-rabota-s-eeprom-na-si.html#comment-3249</link>
			<description><![CDATA[А когда перейдёте на камни с приоритетной системой прерываний чё делать?]]></description>
			<dc:creator>ArtemKAD</dc:creator>
			<pubDate>Mon, 16 Sep 2013 17:00:44 +0000</pubDate>
			<guid>https://chipenable.ru/index.php/programming-avr/item/153-avr-rabota-s-eeprom-na-si.html#comment-3249</guid>
		</item>
		<item>
			<title>ArtemKAD says:</title>
			<link>https://chipenable.ru/index.php/programming-avr/item/153-avr-rabota-s-eeprom-na-si.html#comment-3248</link>
			<description><![CDATA[ Событие редкое, почему и не повисеть? Если читать в ОЗУ, то надо постоянно синхронизироват ь переменные. А смысл в такой работе? Бывало и такое. Если вся обработка радиоканала происходит в прерываниях, не вижу причин почему там-же не сохранять новые данные по ключам и результатам.]]></description>
			<dc:creator>ArtemKAD</dc:creator>
			<pubDate>Mon, 16 Sep 2013 16:57:46 +0000</pubDate>
			<guid>https://chipenable.ru/index.php/programming-avr/item/153-avr-rabota-s-eeprom-na-si.html#comment-3248</guid>
		</item>
		<item>
			<title>_Артём_ says:</title>
			<link>https://chipenable.ru/index.php/programming-avr/item/153-avr-rabota-s-eeprom-na-si.html#comment-3244</link>
			<description><![CDATA[ Тогда уж лучше в основной программе читать/писать в eeprom в критической секции(не до окончания записи, а на время запуска записи - это недолго, несколько десятков циклов).]]></description>
			<dc:creator>_Артём_</dc:creator>
			<pubDate>Sun, 15 Sep 2013 21:30:05 +0000</pubDate>
			<guid>https://chipenable.ru/index.php/programming-avr/item/153-avr-rabota-s-eeprom-na-si.html#comment-3244</guid>
		</item>
		<item>
			<title>_Артём_ says:</title>
			<link>https://chipenable.ru/index.php/programming-avr/item/153-avr-rabota-s-eeprom-na-si.html#comment-3243</link>
			<description><![CDATA[ Висеть в прерывании несколько мс? Может лучше переменную в ОЗУ заранее прочитать? Или вы ещё и пишете в eeeprom в прерывании?]]></description>
			<dc:creator>_Артём_</dc:creator>
			<pubDate>Sun, 15 Sep 2013 21:27:20 +0000</pubDate>
			<guid>https://chipenable.ru/index.php/programming-avr/item/153-avr-rabota-s-eeprom-na-si.html#comment-3243</guid>
		</item>
		<item>
			<title>ArtemKAD says:</title>
			<link>https://chipenable.ru/index.php/programming-avr/item/153-avr-rabota-s-eeprom-na-si.html#comment-3242</link>
			<description><![CDATA[Упс... while (EECR & (1]]></description>
			<dc:creator>ArtemKAD</dc:creator>
			<pubDate>Sun, 15 Sep 2013 19:17:09 +0000</pubDate>
			<guid>https://chipenable.ru/index.php/programming-avr/item/153-avr-rabota-s-eeprom-na-si.html#comment-3242</guid>
		</item>
		<item>
			<title>ArtemKAD says:</title>
			<link>https://chipenable.ru/index.php/programming-avr/item/153-avr-rabota-s-eeprom-na-si.html#comment-3241</link>
			<description><![CDATA[ Это возможно только если Вы вообще в прерывании EEPROM не читаете. Иначе "вместе" возможно. Если уже запустила - т.е. выполнила команду записи в регистр EECR программа проболтается в прерывании до завершения записи eeprom на цикле while (EECR & (1]]></description>
			<dc:creator>ArtemKAD</dc:creator>
			<pubDate>Sun, 15 Sep 2013 19:13:53 +0000</pubDate>
			<guid>https://chipenable.ru/index.php/programming-avr/item/153-avr-rabota-s-eeprom-na-si.html#comment-3241</guid>
		</item>
		<item>
			<title>_Артём_ says:</title>
			<link>https://chipenable.ru/index.php/programming-avr/item/153-avr-rabota-s-eeprom-na-si.html#comment-3240</link>
			<description><![CDATA[ Обычно в прерываниях и одновременно в основной программе eeprom не читают. У вас не так? Как тогда организуете этот процесс? Допустим основная программа запустила запись ячейки eeprom и сразу после этого возникло прерывание, которое должно прочитать другую ячейку eeprom. Как это работать будет? Чем поможет сохранение EEAR и EEDR?]]></description>
			<dc:creator>_Артём_</dc:creator>
			<pubDate>Sun, 15 Sep 2013 13:11:08 +0000</pubDate>
			<guid>https://chipenable.ru/index.php/programming-avr/item/153-avr-rabota-s-eeprom-na-si.html#comment-3240</guid>
		</item>
		<item>
			<title>ArtemKAD says:</title>
			<link>https://chipenable.ru/index.php/programming-avr/item/153-avr-rabota-s-eeprom-na-si.html#comment-3239</link>
			<description><![CDATA[От изменения текущих EEAR и EEDR не вовремя вылезшим прерыванием. Можно конечно запрещать/разре шать прерывания, но это через задницу т.к. функции должны работать как в прерывании так и в основном цикле. По сути EEAR и EEDR это такой-же глобальный ресурс как CREG и поступать при его изменении желательно так-же]]></description>
			<dc:creator>ArtemKAD</dc:creator>
			<pubDate>Sun, 15 Sep 2013 12:23:14 +0000</pubDate>
			<guid>https://chipenable.ru/index.php/programming-avr/item/153-avr-rabota-s-eeprom-na-si.html#comment-3239</guid>
		</item>
		<item>
			<title>_Артём_ says:</title>
			<link>https://chipenable.ru/index.php/programming-avr/item/153-avr-rabota-s-eeprom-na-si.html#comment-3238</link>
			<description><![CDATA[ Зачем? Что даст сохранение EEAR и EEDR? От какого сбоя спасёт?]]></description>
			<dc:creator>_Артём_</dc:creator>
			<pubDate>Sun, 15 Sep 2013 11:10:43 +0000</pubDate>
			<guid>https://chipenable.ru/index.php/programming-avr/item/153-avr-rabota-s-eeprom-na-si.html#comment-3238</guid>
		</item>
		<item>
			<title>ArtemKAD says:</title>
			<link>https://chipenable.ru/index.php/programming-avr/item/153-avr-rabota-s-eeprom-na-si.html#comment-3232</link>
			<description><![CDATA[Если уж делать универсальные процедуры чтения/записи EEPROM лучше не пожалеть двух локальных переменных в которые сохранить EEAR и EEDR на входе и потом их восстановить перед выходом из процедуры. Тогда не будет Вас поджидать северный пушной зверек в самом интересном месте...]]></description>
			<dc:creator>ArtemKAD</dc:creator>
			<pubDate>Sat, 14 Sep 2013 17:12:15 +0000</pubDate>
			<guid>https://chipenable.ru/index.php/programming-avr/item/153-avr-rabota-s-eeprom-na-si.html#comment-3232</guid>
		</item>
		<item>
			<title>king-live says:</title>
			<link>https://chipenable.ru/index.php/programming-avr/item/153-avr-rabota-s-eeprom-na-si.html#comment-3090</link>
			<description><![CDATA[ К сожалению в кристалл Attiny13 в 1Кб Flash такие функции не записать, просто места нет. В него и так вместил программу, которую фактически все делают на 2Kб Flash. А так как ГОСТ стандарт подтвердил работаспособнос ть приборов сигнализации на маленьком кристалле. То пришлось лечить эту уязвимость EEPROM, только выставлением нужных Fuse. Приборы сигнализации, с таким лечением работают без сбоев уже 2 года. Но одну вещь я так и не осмыслил, за счёт чего портились данные EEPROM, (с точки зрения электрических процессов в самом кристалле). Ведь и в первом случаее до выставления BOODLEVEL и во втором случае после выставления BOODLEVEL, процессор отключается при падении напряжения до определённого критического уровня. Почему стабильность работы EEPROM стала зависить от этого BOODLEVEL, когда поднял я режим работоспособнос ти кристалла до 4,7V?]]></description>
			<dc:creator>king-live</dc:creator>
			<pubDate>Fri, 16 Aug 2013 18:06:31 +0000</pubDate>
			<guid>https://chipenable.ru/index.php/programming-avr/item/153-avr-rabota-s-eeprom-na-si.html#comment-3090</guid>
		</item>
		<item>
			<title>Peter says:</title>
			<link>https://chipenable.ru/index.php/programming-avr/item/153-avr-rabota-s-eeprom-na-si.html#comment-3001</link>
			<description><![CDATA[Строго - потому как это значения, которым надо верить. Потому что EEPROM ненадёжна по сути и имеет ограниченный ресурс. Кроме мажорирования еще и контрольной суммой умные люди пользуются. Видимо, Вы родились под счастливой звездой, раз у Вас не случалось сбоев. Просто мои изделия стОят дорого, стоЯт в труднодоступных местах и цена ошибки велика.]]></description>
			<dc:creator>Peter</dc:creator>
			<pubDate>Mon, 22 Jul 2013 04:58:04 +0000</pubDate>
			<guid>https://chipenable.ru/index.php/programming-avr/item/153-avr-rabota-s-eeprom-na-si.html#comment-3001</guid>
		</item>
		<item>
			<title>_Артём_ says:</title>
			<link>https://chipenable.ru/index.php/programming-avr/item/153-avr-rabota-s-eeprom-na-si.html#comment-3000</link>
			<description><![CDATA[ Тут не обсуждать надо, а обеспечить чтобы процессор работал в тех условиях, где его работоспособнос ть гарантируется. Не попадались такие случаи, программа с ошибками может портить - было у меня пару раз такое, но чтобы само - как-то не верится. Смысл простой - каждая eeprom-переменн ая будет расположена по уникальному адресу, не надо самому об этом думать. Компилятор обеспечит. Зачем же так строго? В мажорировании иногда есть смысл, но применять его для каждого байта на мой взгляд как-то слишком. Но это уже от задачи зависит и от характера самих данных. Если в ячейке хранится какая-нибудь настройка, которую изменяют раз в несколько лет, то как показывает практика, ничего с ней не случится. Тут мажорирование не нужно. Но это зависит от условий использования аппаратуры - может у вас приборы работают в условиях радиации или сильных эл.-магнитных помех?]]></description>
			<dc:creator>_Артём_</dc:creator>
			<pubDate>Sun, 21 Jul 2013 20:54:05 +0000</pubDate>
			<guid>https://chipenable.ru/index.php/programming-avr/item/153-avr-rabota-s-eeprom-na-si.html#comment-3000</guid>
		</item>
		<item>
			<title>Peter says:</title>
			<link>https://chipenable.ru/index.php/programming-avr/item/153-avr-rabota-s-eeprom-na-si.html#comment-2999</link>
			<description><![CDATA[Кто запускает порчу EEPROM при изменении питания - сходящее с ума ЦПУ или EEPROM сам находит это нужным - сие предмет обсуждений. Однако, если Вы не слышали про эту особенность - почитайте http://www.avrfreaks.net/index.php?name=PNphpBB2&file=printview&t=75638 или просто погуглите на тему: AVR EEPROM портится EEAR и т.п. И еще: не понял смысла объявления __eeprom, если к ней обращаетесь самодельными функциями. Для меня - нет и не должно быть переменных __eeprom, потому как они не являются переменными, которые можно просто a=eeval; eeval=b; b=&eeval; Это слишком легкомысленно на мой взгляд. Для меня "переменная EEPROM" - это группа мажорированных ячеек EEPROM (с определенными адресами, размещаемые неблизко друг от друга), доступ к которым осуществляется специальными функциями.]]></description>
			<dc:creator>Peter</dc:creator>
			<pubDate>Sun, 21 Jul 2013 18:34:03 +0000</pubDate>
			<guid>https://chipenable.ru/index.php/programming-avr/item/153-avr-rabota-s-eeprom-na-si.html#comment-2999</guid>
		</item>
		<item>
			<title>_Артём_ says:</title>
			<link>https://chipenable.ru/index.php/programming-avr/item/153-avr-rabota-s-eeprom-na-si.html#comment-2998</link>
			<description><![CDATA[ Ни разу не видел, чтобы запись сама стартовала. Правда я всегда BOD разрешаю. __eeprom делает только одно действие - указывает компилятору в какой области памяти размещена переменная. Большего от него не требуется. Тут согласен.]]></description>
			<dc:creator>_Артём_</dc:creator>
			<pubDate>Sun, 21 Jul 2013 15:48:21 +0000</pubDate>
			<guid>https://chipenable.ru/index.php/programming-avr/item/153-avr-rabota-s-eeprom-na-si.html#comment-2998</guid>
		</item>
		<item>
			<title>_Артём_ says:</title>
			<link>https://chipenable.ru/index.php/programming-avr/item/153-avr-rabota-s-eeprom-na-si.html#comment-2997</link>
			<description><![CDATA[ Я не говорил, что нельзя читать или писать. Это просто нежелательно, так как может вызвать проблемы-сбои в работе программы. Быстро - это не аргумент. Представьте ситуацию: в основной программе запущена запись байта в EEPROM, и в это же время прерывание выполняет чтение из другой ячейки. Ситуация с RTOS аналогична предыдущему случаю, только потоков где выполняется работа с EEPROM может быть больше. Почему затеряется? Она отличается спецификатором __eeprom. Он заметен. Я тоже использую самописные функции чтения-записи, но переменные объявляю со спецификатором __eeprom. Так удобней, имхо.]]></description>
			<dc:creator>_Артём_</dc:creator>
			<pubDate>Sun, 21 Jul 2013 15:13:13 +0000</pubDate>
			<guid>https://chipenable.ru/index.php/programming-avr/item/153-avr-rabota-s-eeprom-na-si.html#comment-2997</guid>
		</item>
		<item>
			<title>Peter says:</title>
			<link>https://chipenable.ru/index.php/programming-avr/item/153-avr-rabota-s-eeprom-na-si.html#comment-2996</link>
			<description><![CDATA[3. Ну и, самое главное: мажорировать(ил и применять какие-то еще меры, позволяющее увидеть и исправить) данные в EEPROM, чтобы одиночная ошибка всегда могла быть исправлена.]]></description>
			<dc:creator>Peter</dc:creator>
			<pubDate>Sun, 21 Jul 2013 07:26:22 +0000</pubDate>
			<guid>https://chipenable.ru/index.php/programming-avr/item/153-avr-rabota-s-eeprom-na-si.html#comment-2996</guid>
		</item>
		<item>
			<title>Peter says:</title>
			<link>https://chipenable.ru/index.php/programming-avr/item/153-avr-rabota-s-eeprom-na-si.html#comment-2995</link>
			<description><![CDATA[А тут рекомендаций только две, и они стары как мир: 1. Борьба с известной детской болезнью АВР, когда при изменении напряжения питания, контроллер EEPROM может (не обязатеьно даже при программном доступе к нему, а и просто ни с того ни с сего) произвести несанкционирова нную запись. Записывает, естественно, в ячейку, на которую указывает EEAR. Лечение(скорее не лечение, а паллиатив): самом конце функции (макроса) доступа к EEPROM писать строку EEAR=0 и не использовать эту ячейку в своей работе. Пусть себе портится нулевая ячейка. И пусть себе отчаянные головы используют квалификатор переменных __eeprom, который этого действия, конечно, не делает. 2. Установка BODEN/BODLEVEL, как у Вас. Тут какие грабли? Только потребление немного возрастёт... Ну, и конечно устанавливать уровень срабатывания BODLEVEL таким, чтобы соответствовал тактовой частоте процессора. То есть не ставить BODLEVEL на уровень срабатывания 1.8 Вольт, если у Вас кварц 16МГц. :)]]></description>
			<dc:creator>Peter</dc:creator>
			<pubDate>Sun, 21 Jul 2013 07:18:10 +0000</pubDate>
			<guid>https://chipenable.ru/index.php/programming-avr/item/153-avr-rabota-s-eeprom-na-si.html#comment-2995</guid>
		</item>
		<item>
			<title>King-live says:</title>
			<link>https://chipenable.ru/index.php/programming-avr/item/153-avr-rabota-s-eeprom-na-si.html#comment-2993</link>
			<description><![CDATA[Добрый день! Я уже много лет пользуюсь таким шаблоном при работе с памятью (представлен ниже)в AVR Studio. Единственно были проблемы с устройставми (иногда!!!!), это при отключении питания, или при проблемах в сети. Я так думаю, что когда дело доходило до записи данных в EEPROM, на пол пути исчезало питание достаточное для работы контроллера. И после устройства оставались с частично утерянными данными EEPROM. Долго не думая в FUSE установил галочку в BODLEVEL(порог работы контроллера по напряжению). И на этом проблема решилась. Вот спрашиваю у знатоков, может в таком решении тоже есть подводные камни? Спасибо. #... #include #define EEPROM_SECTION __attribute__ ((section (".eeprom"))) EEMEM uint8_t Mem1=0; EEMEM uint8_t Mem2=0; EEMEM uint8_t Mem3=0; EEMEM uint8_t Mem4=0; unsigned char x1; unsigned char x2; unsigned char x3; unsigned char x4; void Memory() { eeprom_update_b yte(&Mem1,x1); eeprom_update_b yte(&Mem2,x2); eeprom_update_b yte(&Mem3,x3); eeprom_update_b yte(&Mem4,x4); } int main() { x1=eeprom_read_ byte(&Mem1); y1=eeprom_read_ byte(&Mem2); x2=eeprom_read_ byte(&Mem3); x4=eeprom_read_ byte(&Mem4); .....; while(1)	{	.... .;	} }]]></description>
			<dc:creator>King-live</dc:creator>
			<pubDate>Sun, 21 Jul 2013 06:03:03 +0000</pubDate>
			<guid>https://chipenable.ru/index.php/programming-avr/item/153-avr-rabota-s-eeprom-na-si.html#comment-2993</guid>
		</item>
		<item>
			<title>Peter says:</title>
			<link>https://chipenable.ru/index.php/programming-avr/item/153-avr-rabota-s-eeprom-na-si.html#comment-2992</link>
			<description><![CDATA[_Артём_. 1. Кто сказал что нельзя читать? Почему нельзя ЧИТАТЬ-ТО? Это не писать же! Это быстро же! Не согласен. 2. Про РТОС откуда появилось? Не будем размазываться. 3. (и самое неприятное): Если переменная объявлена с квалификатором __eeprom - она немедленно затеряется среди других обычных переменных проекта, потому как по виду ничем не отличается от них. Поэтому лучший вариант - это создание и применение специальной функции. Безопасно. Наглядно. Сердито. Уж нечаянно не применишь. Макросы? Ну, возможно, макросы кто их любит.]]></description>
			<dc:creator>Peter</dc:creator>
			<pubDate>Sat, 20 Jul 2013 19:46:14 +0000</pubDate>
			<guid>https://chipenable.ru/index.php/programming-avr/item/153-avr-rabota-s-eeprom-na-si.html#comment-2992</guid>
		</item>
		<item>
			<title>_Артём_ says:</title>
			<link>https://chipenable.ru/index.php/programming-avr/item/153-avr-rabota-s-eeprom-na-si.html#comment-2991</link>
			<description><![CDATA[ Есть такая проблема, особенно для WDT актуальна. Можно по-другому - запрещать для файла или функции Cross call optimizaion (ключ --no_cross_call ). Тогда компилятор не будет искать одинаковые куски кода.]]></description>
			<dc:creator>_Артём_</dc:creator>
			<pubDate>Sat, 20 Jul 2013 12:47:17 +0000</pubDate>
			<guid>https://chipenable.ru/index.php/programming-avr/item/153-avr-rabota-s-eeprom-na-si.html#comment-2991</guid>
		</item>
		<item>
			<title>_Артём_ says:</title>
			<link>https://chipenable.ru/index.php/programming-avr/item/153-avr-rabota-s-eeprom-na-si.html#comment-2990</link>
			<description><![CDATA[ Не нужно читать или писать в EEPROM из основной программы и прерываний. Если программа написано с использованием RTOS, то для доступа к EEPROM надо использовать мьютексы. Тип вполне допустим, хотя бы для объявления переменных такого вида.]]></description>
			<dc:creator>_Артём_</dc:creator>
			<pubDate>Sat, 20 Jul 2013 12:42:27 +0000</pubDate>
			<guid>https://chipenable.ru/index.php/programming-avr/item/153-avr-rabota-s-eeprom-na-si.html#comment-2990</guid>
		</item>
		<item>
			<title>Peter says:</title>
			<link>https://chipenable.ru/index.php/programming-avr/item/153-avr-rabota-s-eeprom-na-si.html#comment-2978</link>
			<description><![CDATA[Дело конечно личное, как и что использовать. Можно и регистр TIFR сбрасывать операцией |=, если не знать последствий... Но: 1. Случаи с авариями самолётов и ракет из-за сбоев ПО - тоже редкие события. Редкие но меткие)) Хотите нечто подобного в своих разработках? Это дело времени - закон подлости работает всегда)) 2. Квалификатор __eeprom мало того что все равно требует геморроя с сохранением / восстановлением двух IO-регистров, так еще и не совместим со студией. Не лучше ли иметь свою надёжную версию?]]></description>
			<dc:creator>Peter</dc:creator>
			<pubDate>Sun, 14 Jul 2013 08:13:15 +0000</pubDate>
			<guid>https://chipenable.ru/index.php/programming-avr/item/153-avr-rabota-s-eeprom-na-si.html#comment-2978</guid>
		</item>
		<item>
			<title>Pashgan says:</title>
			<link>https://chipenable.ru/index.php/programming-avr/item/153-avr-rabota-s-eeprom-na-si.html#comment-2977</link>
			<description><![CDATA[1. Я же говорю - если писать на Си и в очень редких случаях. 2. Чтобы защитить eear и eedr нужно их в прерывании сохранять, а перед выходом восстанавливать .]]></description>
			<dc:creator>Pashgan</dc:creator>
			<pubDate>Sun, 14 Jul 2013 07:51:41 +0000</pubDate>
			<guid>https://chipenable.ru/index.php/programming-avr/item/153-avr-rabota-s-eeprom-na-si.html#comment-2977</guid>
		</item>
		<item>
			<title>Peter says:</title>
			<link>https://chipenable.ru/index.php/programming-avr/item/153-avr-rabota-s-eeprom-na-si.html#comment-2976</link>
			<description><![CDATA[1. Вот ниже код, проверено в Иар. С оптимизацией по SPEED разделяет для второй функции старт записи. Оно Вам надо? 2. __eeprom без ручного запрета прерываний использовать нельзя, потому как НЕ ЗАЩИЩАЕТ EEAR и EEDR. Что толку защищать 4 такта, когда в обработчике прерывании адрес EEPROM может сбиться и запись произойдет не туда куда надо. Лучше писать свои. ////// void EEPROM_WriteByt e(unsigned int adr, unsigned char value) { while (EECR & (1 < < EEWE)); EEAR = adr; EEDR =value; EECR |= (1 < < EEMWE); EECR |= (1 < < EEWE); } void EEPROM_WriteByt eIRQ(unsigned int adr, unsigned char value) { while (EECR & (1 < < EEWE)); EEAR = adr; EEDR =value; EECR |= ( (1 < < EEMWE) | (1 < < EERIE)); EECR |= (1 < < EEWE); } //////// Вот во что превращается запись для EEPROM_WriteByt eIRQ: IN R16, 0x1C ORI R16, 0x0C OUT 0x1C, R16 RJMP ?Subroutine0 ; !!!!!!!!]]></description>
			<dc:creator>Peter</dc:creator>
			<pubDate>Sun, 14 Jul 2013 07:47:18 +0000</pubDate>
			<guid>https://chipenable.ru/index.php/programming-avr/item/153-avr-rabota-s-eeprom-na-si.html#comment-2976</guid>
		</item>
		<item>
			<title>Pashgan says:</title>
			<link>https://chipenable.ru/index.php/programming-avr/item/153-avr-rabota-s-eeprom-na-si.html#comment-2975</link>
			<description><![CDATA[Я думаю, что оптимизатор может разделить эти операции, если использовать свои функции доступа к eeprom написанные на Си, но в оооочень редких случаях. Если использовать встроенный тип __eeprom и внутренние функции доступа, этого вообще не случиться. Исходники кодов для работы с eeprom описаны на ассемблере - файл eeprom.s90. И, кстати, там учтены запрещения прерываний. CLI SBI EECR,EEMWE SBI EECR,EEWE OUT SREG,T0]]></description>
			<dc:creator>Pashgan</dc:creator>
			<pubDate>Sun, 14 Jul 2013 07:26:26 +0000</pubDate>
			<guid>https://chipenable.ru/index.php/programming-avr/item/153-avr-rabota-s-eeprom-na-si.html#comment-2975</guid>
		</item>
		<item>
			<title>Peter says:</title>
			<link>https://chipenable.ru/index.php/programming-avr/item/153-avr-rabota-s-eeprom-na-si.html#comment-2974</link>
			<description><![CDATA[Оптимизатор может разделить эти операции, если программист в каком-то месте программы устанавливает особый, отличный от других функций режим записи в EEPROM, да еще разрешает прерывание: EECR |= ( (1 < < EEMWE) | ( 1 < < EEPM0) | ( 1 < < EERIE) ); - тут уж SBI не будет, а будет триада инструкций: IN-ORI-OUT. после которой элементарно может быть RJMP на общий для всех функций эпилог со стартом записи: SBI EECR, EEWE. Поэтому однозначно: оптимизацию давить.]]></description>
			<dc:creator>Peter</dc:creator>
			<pubDate>Sun, 14 Jul 2013 06:54:02 +0000</pubDate>
			<guid>https://chipenable.ru/index.php/programming-avr/item/153-avr-rabota-s-eeprom-na-si.html#comment-2974</guid>
		</item>
		<item>
			<title>Peter says:</title>
			<link>https://chipenable.ru/index.php/programming-avr/item/153-avr-rabota-s-eeprom-na-si.html#comment-2973</link>
			<description><![CDATA[Никто не знает, чтО на уме у оптимизатора. Возможно, здесь и есть доля паранойи, но вот для другой приферии - уставки WDT mega640/1280... , у которых регистр управления лежит выше битовых операций этот случай более реален. Там SBI не сработает. А конкретно для нашего случая EEPROM - зачем отдавать судьбу на волю оптимизатора, когда речь идёт о тактах? Легче сделать единообразно: просто убрать оптимизацию и получите то, что имели в виду.]]></description>
			<dc:creator>Peter</dc:creator>
			<pubDate>Sat, 13 Jul 2013 22:39:51 +0000</pubDate>
			<guid>https://chipenable.ru/index.php/programming-avr/item/153-avr-rabota-s-eeprom-na-si.html#comment-2973</guid>
		</item>
		<item>
			<title>Pashgan says:</title>
			<link>https://chipenable.ru/index.php/programming-avr/item/153-avr-rabota-s-eeprom-na-si.html#comment-2971</link>
			<description><![CDATA[Сейчас посмотрел как компилятор оптимизирует код записи многобайтового числа. При максимальной оптимизации по размеру он действительно "запихивает" часть операций в подпрограммы, но строчки установки разрядов EEMWE и EEWE не разделяет. \ ?Subroutine2: \ 00000000 9AE2 SBI 0x1C, 0x02 \ 00000002 9AE1 SBI 0x1C, 0x01]]></description>
			<dc:creator>Pashgan</dc:creator>
			<pubDate>Sat, 13 Jul 2013 21:53:53 +0000</pubDate>
			<guid>https://chipenable.ru/index.php/programming-avr/item/153-avr-rabota-s-eeprom-na-si.html#comment-2971</guid>
		</item>
		<item>
			<title>Peter says:</title>
			<link>https://chipenable.ru/index.php/programming-avr/item/153-avr-rabota-s-eeprom-na-si.html#comment-2970</link>
			<description><![CDATA[:) Поправки: не асм-функции, конечно, а асм-подпрограмм ы. И еще - зря я "похвалил" RJMP. Это тоже плохо кончится. Потому что 2 такта RJMP + 3 такта для |= это уже 5 тактов.]]></description>
			<dc:creator>Peter</dc:creator>
			<pubDate>Sat, 13 Jul 2013 21:38:57 +0000</pubDate>
			<guid>https://chipenable.ru/index.php/programming-avr/item/153-avr-rabota-s-eeprom-na-si.html#comment-2970</guid>
		</item>
		<item>
			<title>Peter says:</title>
			<link>https://chipenable.ru/index.php/programming-avr/item/153-avr-rabota-s-eeprom-na-si.html#comment-2969</link>
			<description><![CDATA[:) Зря похвалил RJMP. Короче, RJMP тоже плохо. Потому что 2 такта RJMP + 3 такта для |= это уже 5 тактов.]]></description>
			<dc:creator>Peter</dc:creator>
			<pubDate>Sat, 13 Jul 2013 21:33:09 +0000</pubDate>
			<guid>https://chipenable.ru/index.php/programming-avr/item/153-avr-rabota-s-eeprom-na-si.html#comment-2969</guid>
		</item>
		<item>
			<title>Peter says:</title>
			<link>https://chipenable.ru/index.php/programming-avr/item/153-avr-rabota-s-eeprom-na-si.html#comment-2967</link>
			<description><![CDATA[Теперь насчет |=. Оптимизатор выискивает одинаковые участки кода и по своему разумению выделяет это в отдельные асм-функции. Есть реальная опасность, когда в проекте есть запись и char и int или long - переменных в EPROM (но, строго говоря, касается всех "4-хтактовых" случаев периферии AVR, например, переуставки WDT), что оптимизатор сделает основную часть действий в подпрограмме, и к финишной операции EECR |= (1 < < EEWE); перейдёт с помощью RJMP(это еще хорошо, пара тактов всего), а то и через RET из подпрограммы(во т это плохо - RET минимум 4 такта). Запись не произойдет. Лечение простое: перед функциями записи (а повторяю, квалификатор __eeprom лучше не пользовать, надо делать свои функции) подавлять оптимизацию, ставя (для ИАР) #pragma optimize = none.]]></description>
			<dc:creator>Peter</dc:creator>
			<pubDate>Sat, 13 Jul 2013 21:26:59 +0000</pubDate>
			<guid>https://chipenable.ru/index.php/programming-avr/item/153-avr-rabota-s-eeprom-na-si.html#comment-2967</guid>
		</item>
		<item>
			<title>Pashgan says:</title>
			<link>https://chipenable.ru/index.php/programming-avr/item/153-avr-rabota-s-eeprom-na-si.html#comment-2966</link>
			<description><![CDATA[Замечание верное. Рассказывай.]]></description>
			<dc:creator>Pashgan</dc:creator>
			<pubDate>Sat, 13 Jul 2013 20:56:47 +0000</pubDate>
			<guid>https://chipenable.ru/index.php/programming-avr/item/153-avr-rabota-s-eeprom-na-si.html#comment-2966</guid>
		</item>
		<item>
			<title>Peter says:</title>
			<link>https://chipenable.ru/index.php/programming-avr/item/153-avr-rabota-s-eeprom-na-si.html#comment-2965</link>
			<description><![CDATA[Забавно. Прерывания запрещаются при перед операцией |= (об опасности этой операции тоже могу рассказать, если кому-то интересно), а регистры EEAR да и EEDR остаются совершенно незащищенными от использования в прерываниях. А вдруг в обработчике понадобится прочитать ДРУГУЮ ячейку EEPROM? :) По этой причине IARовский встроенный тип __eeprom совершенно недопустим для использования взрослыми программистами.]]></description>
			<dc:creator>Peter</dc:creator>
			<pubDate>Sat, 13 Jul 2013 20:29:13 +0000</pubDate>
			<guid>https://chipenable.ru/index.php/programming-avr/item/153-avr-rabota-s-eeprom-na-si.html#comment-2965</guid>
		</item>
		<item>
			<title>Pashgan says:</title>
			<link>https://chipenable.ru/index.php/programming-avr/item/153-avr-rabota-s-eeprom-na-si.html#comment-2964</link>
			<description><![CDATA[Пожалуйста. Надеюсь кому-нибудь пригодится.]]></description>
			<dc:creator>Pashgan</dc:creator>
			<pubDate>Sat, 13 Jul 2013 07:29:40 +0000</pubDate>
			<guid>https://chipenable.ru/index.php/programming-avr/item/153-avr-rabota-s-eeprom-na-si.html#comment-2964</guid>
		</item>
		<item>
			<title>nomorewar says:</title>
			<link>https://chipenable.ru/index.php/programming-avr/item/153-avr-rabota-s-eeprom-na-si.html#comment-2959</link>
			<description><![CDATA[спасибо, статья полезная]]></description>
			<dc:creator>nomorewar</dc:creator>
			<pubDate>Fri, 12 Jul 2013 15:57:53 +0000</pubDate>
			<guid>https://chipenable.ru/index.php/programming-avr/item/153-avr-rabota-s-eeprom-na-si.html#comment-2959</guid>
		</item>
	</channel>
</rss>
