Atmega8: запись/чтение встроенной EEPROM

Обсуждаем контроллеры компании Atmel.
Ответить
Мявтор!
Аватара пользователя
Сообщения: 384
Зарегистрирован: Ср май 17, 2006 18:39:01
Откуда: Москва

Сообщение Pavel V. »

Доброго времени суток!
Я что-то никак не могу разобраться с работой встроенной EEPROM.

Задача такая: есть некий термостат, в котором кнопками задается температура стабилизации. Хотелось бы эту самую температуру сохранять в EEPROM на случай пропадания питания.

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

В CodeVision AVR есть встроенный механизм работы с EEPROM, но я так и не смог разобраться в нем.. У меня проблемы в несоответствием типов данных.

К какому типу нужно преобразовать число (int), чтобы можно было записать его в EEPROM, а потом прочитать в опять же int?
Контактная информация:
Реклама
Вымогатель припоя
Аватара пользователя
Сообщения: 534
Зарегистрирован: Пн янв 16, 2006 08:00:17
Откуда: Иркутск

Сообщение Mamonth »

Устанавливаешь адрес, а потом считываешь...
Today fine night...
Реклама
Модератор
Аватара пользователя
Сообщения: 4517
Зарегистрирован: Пн апр 03, 2006 11:43:25
Откуда: Санкт - Петербург

Сообщение Aheir »

Чтобы записать int в eeprom его надо сначала на 2 байта разделить, а потом уже их писать в разные ячейки, а после чтения снова склеивать..
Я делал так (см. вложение)

Процедуры чтения/записи двухбайтового числа - как раз тебе подойдут...
Вложения
untitled.rar
(488 байт) 1879 скачиваний
Контактная информация:
Мявтор!
Аватара пользователя
Сообщения: 825
Зарегистрирован: Вс дек 18, 2005 20:04:42
Откуда: Свердловская обл.

Сообщение moLCHec »

Я пишу на Си в ICCV7 for AVR там всё просто. при объявлении переменной добавляешь соответствующий заголовок и все переменые которые после него иницилизируются в eeprom. Хоть int[x][x], лишь бы памяти хватило.
Настоящий кот всегда либо голоден,
либо невыспался ...
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Гость

Сообщение Гость »

Вроде разобрался. Все оказалось намного проще.

Работа с eeprom в CodeVision сделана прозрачной, вот так:

eeprom int ee_test = 1;
int test;

test = ee_test; // чтение из ЕЕПРОМ
ee_test = test; // запись в ЕЕПРОМ
Реклама
Мявтор!
Аватара пользователя
Сообщения: 384
Зарегистрирован: Ср май 17, 2006 18:39:01
Откуда: Москва

Сообщение Pavel V. »

Предыдущее сообщение от меня, забыл войти..
Контактная информация:
Реклама
Первый раз сказал Мяу!
Сообщения: 38
Зарегистрирован: Пн мар 29, 2010 12:19:06

Сообщение pavelm-ks »

А вот у меня на CV 1.25.8 Professional нифига такой вариант не работал.
Протрахался 2 часа с форматом переменных. В итоге проблема решилать через работу с указателями (если я все правильно понял).

В обще изначально писал так(когда не работало):
eeprom unsigned int wheele_set=170;
eeprom unsigned char cilinders_set=4;
....
//далее в main присваивал это значение другой переменной

wheele=wheele_set;
cilinders=cilinders_set;
// и дальше использовал уже эти переменные при вычислениях . И нифига - работало по ппц как криво . (точнее это была не работа? а какието непоянтные глюки т. . е в eeprom что-то псалось но что не понятно).
А вот когда записал :
eeprom unsigned int *wheele_set;
eeprom unsigned char *cilinders_set;

*wheele_set=170;
*cilinders_set=4;

wheele=*wheele_set;
cilinders=*cilinders_set;
// то все заработало как часики.
Но т.к. я чайтик, то так и не понял до конца в чем был прикол...:(.
Первый раз сказал Мяу!
Сообщения: 21
Зарегистрирован: Сб янв 11, 2014 17:13:19

Сообщение Alex2014 »

а я и так и так пробовал и ничего не получилось. я сам начинающий, если что сильно не ругайте) у меня вот в чем вопрос, если объявить переменные в eeprom:
eeprom unsigned int *wheele_set;
eeprom unsigned char *cilinders_set;
и тут же присвоить им какие либо значения
*wheele_set=170;
*cilinders_set=4;
то если я правильно понимаю, какие действия не производи с ними в процессе работы, все равно при следущем включении им присвоются эти же значения. И смысл тогда в eeprom?
Или присвоение значений 170 и 4 уже в ходе самой программы? Тогда другой вопрос, какие значения будут в этих переменных, если я просто объявлю их и захочу сразу прочитать? просто у меня именно такой случай, в протеусе вроде все работает, а железе замирает именно на индикации переменной, записанной в eeprom. Если кто знает подскажите.
Поставщик валерьянки для Кота
Сообщения: 2222
Зарегистрирован: Вт ноя 27, 2007 11:32:06
Откуда: Tashkent

Сообщение uk8amk »

Код: Выделить всё

eeprom unsigned int *wheele_set;
Это не переменная, а указатель на область памяти в еепром. Для тех компиляторов, поддерживающих прозрачную работу с еепром.

Код: Выделить всё

*wheele_set=170;
А вот это генерирует код для записи значения 170 по адресу указателя wheele_set. Т.е. это не первоначальная инициализация в процессе создания HEX или EEP файла, а модификация ячейки уже при работе программы.
какие значения будут в этих переменных, если я просто объявлю их и захочу сразу прочитать?
Будут те же значения, что были в EEP/HEX файле.
pcb
Опытный кот
Сообщения: 833
Зарегистрирован: Пт авг 12, 2011 09:14:27
Откуда: Млечный путь/Земля/РФ/Екатеринбург

Сообщение pcb »

pavelm-ks писал(а): А вот когда записал :
eeprom unsigned int *wheele_set;
eeprom unsigned char *cilinders_set;

*wheele_set=170;
*cilinders_set=4;

wheele=*wheele_set;
cilinders=*cilinders_set;
// то все заработало как часики.
Но т.к. я чайтик, то так и не понял до конца в чем был прикол...:(.
Вы объявили переменные указатели но не проинициализировали их.
Как оно работало? :shock:
Alex2014 писал(а):то если я правильно понимаю, какие действия не производи с ними в процессе работы, все равно при следущем включении им присвоются эти же значения.
Да.

У меня есть проекты, где еепром хорошо пользуется.

Сделано следующим образом
есть некий байтик в еепромке означающий была ли инициализация, по умолчанию = ФАЛСЕ.
если не было инициализации:
1. инициализируем переменные
2. записываем в еепром
3. меняем некий байтик на ТРУЕ
4. записываем некий байтик в еепром
Разработал:
-BLDC
-ФУОЗ/МПСЗ
-SMART BMS
-ECU/EDC на STM32F4(43%)+CPLD(57%)
-Моноинжектор на ATSAMD20G16
-контроллер эффектов для RGB LED ленты
-умные часы/обратный счет/секундомер
-устройство измерения емкости АКБ
Первый раз сказал Мяу!
Сообщения: 21
Зарегистрирован: Сб янв 11, 2014 17:13:19

Сообщение Alex2014 »

pcb вы написали:
У меня есть проекты, где еепром хорошо пользуется.

Сделано следующим образом
есть некий байтик в еепромке означающий была ли инициализация, по умолчанию = ФАЛСЕ.
если не было инициализации:
1. инициализируем переменные
2. записываем в еепром
3. меняем некий байтик на ТРУЕ
4. записываем некий байтик в еепром[/quote]

А можно пример какой нибудь. я просто не понял насчет байта, который означает была ли инициализация или нет. Его надо при объявлении переменных тоже как то объявить? значит нужно присвоить ему какое то значение, иначе же фигня получится (если я правильно понимаю).
pcb
Опытный кот
Сообщения: 833
Зарегистрирован: Пт авг 12, 2011 09:14:27
Откуда: Млечный путь/Земля/РФ/Екатеринбург

Сообщение pcb »

Alex2014 писал(а): А можно пример какой нибудь.
Я пишу для аврок на WinAVR, не суть важно.
Alex2014 писал(а): я просто не понял насчет байта, который означает была ли инициализация или нет. Его надо при объявлении переменных тоже как то объявить? значит нужно присвоить ему какое то значение, иначе же фигня получится (если я правильно понимаю).
Объявить надо, но не инициализировать.

Объявление переменных в еепром = задание адреса в этой самой еепром.
Изначально после стирания еепром в нем содержится 0чФФ
Соответственно в момент работы алгоритма значение байта инициализации будет отличное от труе, соответственно после сброса процессора на ветку инициализации уже не попадаем :)
Разработал:
-BLDC
-ФУОЗ/МПСЗ
-SMART BMS
-ECU/EDC на STM32F4(43%)+CPLD(57%)
-Моноинжектор на ATSAMD20G16
-контроллер эффектов для RGB LED ленты
-умные часы/обратный счет/секундомер
-устройство измерения емкости АКБ
Первый раз сказал Мяу!
Сообщения: 21
Зарегистрирован: Сб янв 11, 2014 17:13:19

Сообщение Alex2014 »

Спасибо вроде понял. Только вот 0чФФ это которое 0хFF ?
Родился
Сообщения: 3
Зарегистрирован: Пн авг 12, 2013 14:03:44
Откуда: г. Омск

Сообщение ffllyy23 »

полезная вещь интернет. за день разобрался для чего EEPROM и как с ним работать.
Последний раз редактировалось ffllyy23 Сб июл 19, 2014 22:06:48, всего редактировалось 1 раз.
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

ffllyy23 писал(а):как используя встроенной EEPROM по очередно записывать вход с АЦП в разные области памяти , а затем считывать для вставления данных в разные области порграммы
Шедевр :)))
Вы хоть сами поняли что написали ? :))
Контактная информация:
Первый раз сказал Мяу!
Аватара пользователя
Сообщения: 27
Зарегистрирован: Вт июл 08, 2014 14:27:38
Откуда: Славянск-на-Кубани

Сообщение Vanes »

Согласен, зачем такие тяжбы ??? если есть необходимость в хранении значения переменной после обесточивания МК тгда EEPROM, а если нет то просто при каждом цикле работы с АЦП записывать значения в переменные и потом суй их куда хочешь.
Изображение Истина где то рядом :-)
Опытный кот
Аватара пользователя
Сообщения: 721
Зарегистрирован: Ср июн 11, 2014 09:43:13
Откуда: США

Сообщение Pink-Pank »

Особенно учитывая тот факт, что запись в EEPROMдлится около 10 мс (частота не более 100 Гц), а АЦП может работать на частототе где-то до мегагерца.
Fucking static initialization order fiasco
Контактная информация:
Первый раз сказал Мяу!
Аватара пользователя
Сообщения: 27
Зарегистрирован: Вт июл 08, 2014 14:27:38
Откуда: Славянск-на-Кубани

Сообщение Vanes »

Я использовал запись в EEPROM в своих "твареньях" вот каким образом: Ставил перед стабилизатором питания МК конденсатор большой емкостью, получается своеобразная батарейка. А одной ножкой МК проверяю напряжения входе питания всей схемы и как только пропадает на ней напруга программа производит запись нужных мне переменных в EEPROM. как то так.
Изображение Истина где то рядом :-)
Ответить

Вернуться в «AVR»