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

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

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

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

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

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

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

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

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

Сообщение Mamonth »

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

Сообщение Aheir »

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

Процедуры чтения/записи двухбайтового числа - как раз тебе подойдут...
Вложения
untitled.rar
(488 байт) 1872 скачивания
Аватара пользователя
moLCHec
Мявтор!
Сообщения: 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; // запись в ЕЕПРОМ
Аватара пользователя
Pavel V.
Мявтор!
Сообщения: 384
Зарегистрирован: Ср май 17, 2006 18:39:01
Откуда: Москва
Контактная информация:

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

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

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

Сообщение 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;
// то все заработало как часики.
Но т.к. я чайтик, то так и не понял до конца в чем был прикол...:(.
Alex2014
Первый раз сказал Мяу!
Сообщения: 21
Зарегистрирован: Сб янв 11, 2014 17:13:19

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

Сообщение Alex2014 »

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

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

Сообщение uk8amk »

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

eeprom unsigned int *wheele_set;

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

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

*wheele_set=170;

А вот это генерирует код для записи значения 170 по адресу указателя wheele_set. Т.е. это не первоначальная инициализация в процессе создания HEX или EEP файла, а модификация ячейки уже при работе программы.

какие значения будут в этих переменных, если я просто объявлю их и захочу сразу прочитать?


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

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

Сообщение 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 ленты
-умные часы/обратный счет/секундомер
-устройство измерения емкости АКБ
Alex2014
Первый раз сказал Мяу!
Сообщения: 21
Зарегистрирован: Сб янв 11, 2014 17:13:19

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

Сообщение Alex2014 »

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

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

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

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

Сообщение pcb »

Alex2014 писал(а):А можно пример какой нибудь.

Я пишу для аврок на WinAVR, не суть важно.

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


Объявить надо, но не инициализировать.

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

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

Сообщение Alex2014 »

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

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

Сообщение ffllyy23 »

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

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

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

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

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

Сообщение Vanes »

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

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

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

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

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

Сообщение Vanes »

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

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