Перейти к содержанию

адресация в EEPROM


wws63

Рекомендуемые сообщения

В соседней ветке прочитал, что "на старте из-за переходных процессов иногда может повреждаться 0-я ячейка EEPROM"  

В связи с этим вопрос, как выбрать персональную ячейку для записи/чтения значения? А то, что бы не делал, пишет в ячейки начиная с нулевой?

uint8_t EEMEM adress_1  // Переменная хранения адреса 

Value_ee = eeprom_read_byte(&adress_1); // считываем байт из EEPROM и помещаем его в "Value_ee"

eeprom_write_byte(&adress_1, Value_ee); // записываем "Value_ee" в EEPROM

Опыт - это то, что получаешь, не получив того, что хотел

Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

Чтобы не повреждались ячейки EEPROM при переходных процессов в питании МК существуют супервизоры, т.е. устройства, которые обеспечивают работу МК только если напряжение питания превышает определенный уровень, при котором МК работает без сбоев. Практически во всех современных МК имеется так называемый встроенный BOD детектор, который выполняет функцию супервизора. В AVR включение и выбор порога срабатывания BOD детектора осуществляется программированием соответствующих фьюзов. С повреждением ячеек EEPROM при настроенном BOD-детекторе никогда не встречался.

Ссылка на комментарий
Поделиться на другие сайты

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Можно в ручную записывать. В регистры отвечающие за еепром. Погуглите все есть. Я на соседей ветке поднял этот вопрос. Причина оказалась простая. Человек который прошивает напутал фьюзы. BOD вообще отключен был.

 

Ссылка на комментарий
Поделиться на другие сайты

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Непосредственно не занимался разработкой устройств на МК, только изготовлением готовых конструкций. Но, ИМХО, если "повреждается только НУЛЕВАЯ ячейка", то сделайте примерно так:

uint8_t EEMEM adress_00  // пустая ячейка, в которой ничего не хранится
uint8_t EEMEM adress_1  // Переменная хранения адреса 

Настоящему коту и в декабре март!

Ссылка на комментарий
Поделиться на другие сайты

57 минут назад, KomSoft сказал:

 если "повреждается только НУЛЕВАЯ ячейка", то сделайте примерно так:

 

Это понятно, так работает. :rolleyes:Просто думал, что есть какое то конкретное решение от производителя.

Опыт - это то, что получаешь, не получив того, что хотел

Ссылка на комментарий
Поделиться на другие сайты

Я могу ошибаться, но мне кажется, что проблема с нулевой ячейкой была характерна для "старых" версий AVR-микроконтроллеров, а в "новых" чипах она устранена. Поэтому для купленных сегодня микроконтроллеров уже нет необходимости предпринимать какие-то особые меры по спасению ячейки, а вот для тех МК, которые лежат у вас в ящичке стола уже лет 5 - да, нужно.

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

Ссылка на комментарий
Поделиться на другие сайты

Повреждаются те ячейки, в которые идет постоянно перезапись параметров, например, в каком-то шасси Самсунга, в JVC и в фунаях было такое - постоянно ложилась память из-за постоянного пересохранения при выключении значений параметров оперативных регулировок.

Ссылка на комментарий
Поделиться на другие сайты

2 часа назад, ARV сказал:

 вот для тех МК, которые лежат у вас в ящичке стола уже лет 5 - да, нужно.

Если бы знать, как братья - китайцы делают тиньки, которые продают по 18 рублей:D

Опыт - это то, что получаешь, не получив того, что хотел

Ссылка на комментарий
Поделиться на другие сайты

2 часа назад, wws63 сказал:

Это понятно, так работает. :rolleyes:Просто думал, что есть какое то конкретное решение от производителя.

В даташите указано как обратиться по конкретному адресу .

А вообще я стараюсь писать данные в середину массива еепром , созав массив , к примеру на 512 байт , я пишу начиная с 255-го байта .

Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

Ссылка на комментарий
Поделиться на другие сайты

6 часов назад, wws63 сказал:

В связи с этим вопрос, как выбрать персональную ячейку для записи/чтения значения? А то, что бы не делал, пишет в ячейки начиная с нулевой?

uint8_t EEMEM adress_1  // Переменная хранения адреса 

А Вы посмотрите, что хранится в этой переменной. Вероятнее всего, там просто адрес ячейки. Если это так, то никто не мешает инициализировать его при объявлении.

Но, в таком случае, Вы будете уже вмешиваться в работу компилятора (в частности, линкера). И любую неинициализированную переменную он вправе затолкнуть в любое место на своё усмотрение. Тем самым, есть вероятность наложения на пользовательские адреса.

Ссылка на комментарий
Поделиться на другие сайты

Похоже  эту работу - выбор нулевого адреса, компилятор делает сам, не зависимо инициализирована переменная или нет.

uint8_t EEMEM adress_1  // Переменная хранения адреса 

uint8_t EEMEM adress_1 = 0x01;  // Переменная хранения адреса 

Все равно пишет по нулевому адресу.

Получается, что для выбора заданной ячейки нужно расписывать процедуру чтения/записи как в даташите.

Опыт - это то, что получаешь, не получив того, что хотел

Ссылка на комментарий
Поделиться на другие сайты

А, ну всё верно. Инициализация то идёт самого значения переменной, а не её адреса :unsure:
Я почему то подумал, что в переменной хранится значение адреса :blush:

Тогда вообще не понятно, зачем в eeprom_write_byte передаётся 2 аргумента. Достаточно было бы передачи одного адреса переменной.
Какая то запутанная эта библиотека. Ничего логичного... <_<

Ссылка на комментарий
Поделиться на другие сайты

Только что, wws63 сказал:

Получается, что для выбора заданной ячейки нужно расписывать процедуру чтения/записи как в даташите

Все функции для чтения и записи уже есть.

Компилятор предоставляет вам 2 пути для работы с EEPROM: автоматический, когда компилятор сам решает, по какому адресу что будет храниться, и ручной - когда все решаете вы самостоятельно.

Пример автоматического способа

EEMEM uint8_t var; // описали переменную в EEPROM, адрес не знаем

eeprom_write_byte(&var, 12); // записали в эту переменную число 12

if(eeprom_read_byte(&var) == 12) // проверили, что там записано

Пример ручного способа

#define EE_BYTE	((void*)0x0123) // определили адрес в EEPROM, с которым будем далее работать
  
eeprom_write_byte(EE_BYTE, 12); // записали в выбранную ячейку число 12

if(eeprom_read_byte(EE_BYTE) == 12) // проверили, что там записалось

Смешивать эти способы нельзя, чтобы не нарваться на ситуацию, когда вы "выбрали" себе адрес, который уже решил использовать компилятор.

Есть и третий способ (задать адреса секции EEPROM по-своему), но я его начинающему не порекомендую.

Так что выбирайте сами, как вам лучше работать с EEPROM.

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

Ссылка на комментарий
Поделиться на другие сайты

А кто мешает вам указать сегмент памяти? Что-то вроде такого (указать линкеру)

--section-start=.noinit=0x802000

 

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

1 минуту назад, COKPOWEHEU сказал:

А кто мешает вам указать сегмент памяти?

Мне? ничего. Но

4 часа назад, ARV сказал:

я его начинающему не порекомендую

 

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

Ссылка на комментарий
Поделиться на другие сайты

Ну и напрасно - это самый правильный способ. Нет шанса ошибиться, не прописать для какой-то переменной адрес, нет необходимости просчитывать адреса вручную. Достаточно просто указать одну опцию в makefile.

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

9 часов назад, COKPOWEHEU сказал:

Ну и напрасно - это самый правильный способ

Самый правильный - это первый предложенный мною, "автоматический". Этот - на втором месте по правильности, но в лидерах по порогу вхождения, с моей точки зрения. Именно поэтому я и не мог рекомендовать его начинающим.

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

Ссылка на комментарий
Поделиться на другие сайты

Вот этот? Но там либо компилятору дана полная свобода действий (и он будет располагать с 0-й ячейки), либо все ручками.

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

Только что, COKPOWEHEU сказал:

Вот этот? Но там либо компилятору дана полная свобода действий (и он будет располагать с 0-й ячейки), либо все ручками

Странно... вы находите нелогичность в моих высказываниях, неточность или противоречие? В чем смысл вашего сообщения? Именно это я и сказал: или полная свобода компилятора, или все ручками.

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

Ссылка на комментарий
Поделиться на другие сайты

Первый вариант задачу не решает вообще.

Второй хорошо подходит когда данных немного и можно их распределить вручную.

Но в чем их преимущество перед штатным способом с указанием адреса для сегмента?

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

@COKPOWEHEU , по причине того, что вы постоянно опровергаете собственные мысли о том, что имелось ввиду, я не буду с вами спорить, соглашусь - так проще. Да, первый вариант задачу распределения переменных по EEPROM не решает вообще. Вот абсолютно.

22 часа назад, ARV сказал:

Компилятор предоставляет вам 2 пути для работы с EEPROM: автоматический, когда компилятор сам решает, по какому адресу что будет храниться, и ручной - когда все решаете вы самостоятельно.

Какие задачи вы себе придумали, которые первый способ не решает - я не знаю, но согласен со всеми вашими доводами.

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

Ссылка на комментарий
Поделиться на другие сайты

Господа! Мне как начинающему подойдет и простой вариант: низкоуровневая запись в ЕЕПРОМ. 

uint8_t EEPROM_ReadByte(uint8_t *adr)
{
 while (EECR & (1<<EEWE));
 EEAR = (uint16_t)adr;
 EECR |= (1<<EERE);
 return EEDR;
}
void EEPROM_WritByte(uint8_t *adr, uint8_t value)
{
 while (EECR & (1<<EEWE));
 EEAR = (uint16_t)adr;
 EEDR =value;
 EECR |= (1<<EEMWE);
 EECR |= (1<<EEWE);
} 

Такой вариант имеет право на жизнь?

Опыт - это то, что получаешь, не получив того, что хотел

Ссылка на комментарий
Поделиться на другие сайты

Только что, wws63 сказал:

Такой вариант имеет право на жизнь?

Чем не устраивает готовая функция из "библиотеки"?

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

Ссылка на комментарий
Поделиться на другие сайты

Только что, wws63 сказал:

Я это к варианту , когда адрес для чтения/записи  выбираю сам

Снова тот же вопрос: что вам мешает выбирать адрес самому, применяя готовые функции из "библиотеки"?

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...