Страница 1 из 1
Atmega8: запись/чтение встроенной EEPROM
Добавлено: Чт июл 06, 2006 15:25:09
Pavel V.
Доброго времени суток!
Я что-то никак не могу разобраться с работой встроенной EEPROM.
Задача такая: есть некий термостат, в котором кнопками задается температура стабилизации. Хотелось бы эту самую температуру сохранять в EEPROM на случай пропадания питания.
Алгоритм простой - после задания температуры, она записывается из временной переменной в EEPROM, а при включении устройства, читается из EEPROM в ту же самую переменную.
В CodeVision AVR есть встроенный механизм работы с EEPROM, но я так и не смог разобраться в нем.. У меня проблемы в несоответствием типов данных.
К какому типу нужно преобразовать число (int), чтобы можно было записать его в EEPROM, а потом прочитать в опять же int?
Добавлено: Пт июл 07, 2006 03:12:58
Mamonth
Устанавливаешь адрес, а потом считываешь...
Добавлено: Пт июл 07, 2006 10:00:03
Aheir
Чтобы записать int в eeprom его надо сначала на 2 байта разделить, а потом уже их писать в разные ячейки, а после чтения снова склеивать..
Я делал так (см. вложение)
Процедуры чтения/записи двухбайтового числа - как раз тебе подойдут...
Добавлено: Сб июл 08, 2006 08:42:27
moLCHec
Я пишу на Си в ICCV7 for AVR там всё просто. при объявлении переменной добавляешь соответствующий заголовок и все переменые которые после него иницилизируются в eeprom. Хоть int[x][x], лишь бы памяти хватило.
Добавлено: Вс июл 23, 2006 10:10:03
Гость
Вроде разобрался. Все оказалось намного проще.
Работа с eeprom в CodeVision сделана прозрачной, вот так:
eeprom int ee_test = 1;
int test;
test = ee_test; // чтение из ЕЕПРОМ
ee_test = test; // запись в ЕЕПРОМ
Добавлено: Вс июл 23, 2006 10:10:45
Pavel V.
Предыдущее сообщение от меня, забыл войти..
Re: Atmega8: запись/чтение встроенной EEPROM
Добавлено: Пн янв 28, 2013 18:29:49
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;
// то все заработало как часики.
Но т.к. я чайтик, то так и не понял до конца в чем был прикол...

.
Re: Atmega8: запись/чтение встроенной EEPROM
Добавлено: Ср янв 29, 2014 19:58:17
Alex2014
а я и так и так пробовал и ничего не получилось. я сам начинающий, если что сильно не ругайте) у меня вот в чем вопрос, если объявить переменные в eeprom:
eeprom unsigned int *wheele_set;
eeprom unsigned char *cilinders_set;
и тут же присвоить им какие либо значения
*wheele_set=170;
*cilinders_set=4;
то если я правильно понимаю, какие действия не производи с ними в процессе работы, все равно при следущем включении им присвоются эти же значения. И смысл тогда в eeprom?
Или присвоение значений 170 и 4 уже в ходе самой программы? Тогда другой вопрос, какие значения будут в этих переменных, если я просто объявлю их и захочу сразу прочитать? просто у меня именно такой случай, в протеусе вроде все работает, а железе замирает именно на индикации переменной, записанной в eeprom. Если кто знает подскажите.
Re: Atmega8: запись/чтение встроенной EEPROM
Добавлено: Ср янв 29, 2014 22:25:41
uk8amk
Это не переменная, а указатель на область памяти в еепром. Для тех компиляторов, поддерживающих прозрачную работу с еепром.
А вот это генерирует код для записи значения 170 по адресу указателя wheele_set. Т.е. это не первоначальная инициализация в процессе создания HEX или EEP файла, а модификация ячейки уже при работе программы.
какие значения будут в этих переменных, если я просто объявлю их и захочу сразу прочитать?
Будут те же значения, что были в EEP/HEX файле.
Re: Atmega8: запись/чтение встроенной EEPROM
Добавлено: Ср янв 29, 2014 22:44:15
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;
// то все заработало как часики.
Но т.к. я чайтик, то так и не понял до конца в чем был прикол...

.
Вы объявили переменные указатели но не проинициализировали их.
Как оно работало?
Alex2014 писал(а):то если я правильно понимаю, какие действия не производи с ними в процессе работы, все равно при следущем включении им присвоются эти же значения.
Да.
У меня есть проекты, где еепром хорошо пользуется.
Сделано следующим образом
есть некий байтик в еепромке означающий была ли инициализация, по умолчанию = ФАЛСЕ.
если не было инициализации:
1. инициализируем переменные
2. записываем в еепром
3. меняем некий байтик на ТРУЕ
4. записываем некий байтик в еепром
Re: Atmega8: запись/чтение встроенной EEPROM
Добавлено: Чт янв 30, 2014 11:01:20
Alex2014
pcb вы написали:
У меня есть проекты, где еепром хорошо пользуется.
Сделано следующим образом
есть некий байтик в еепромке означающий была ли инициализация, по умолчанию = ФАЛСЕ.
если не было инициализации:
1. инициализируем переменные
2. записываем в еепром
3. меняем некий байтик на ТРУЕ
4. записываем некий байтик в еепром[/quote]
А можно пример какой нибудь. я просто не понял насчет байта, который означает была ли инициализация или нет. Его надо при объявлении переменных тоже как то объявить? значит нужно присвоить ему какое то значение, иначе же фигня получится (если я правильно понимаю).
Re: Atmega8: запись/чтение встроенной EEPROM
Добавлено: Чт янв 30, 2014 18:43:28
pcb
Alex2014 писал(а):А можно пример какой нибудь.
Я пишу для аврок на WinAVR, не суть важно.
Alex2014 писал(а): я просто не понял насчет байта, который означает была ли инициализация или нет. Его надо при объявлении переменных тоже как то объявить? значит нужно присвоить ему какое то значение, иначе же фигня получится (если я правильно понимаю).
Объявить надо, но не инициализировать.
Объявление переменных в еепром = задание адреса в этой самой еепром.
Изначально после стирания еепром в нем содержится 0чФФ
Соответственно в момент работы алгоритма значение байта инициализации будет отличное от труе, соответственно после сброса процессора на ветку инициализации уже не попадаем

Re: Atmega8: запись/чтение встроенной EEPROM
Добавлено: Чт янв 30, 2014 18:59:40
Alex2014
Спасибо вроде понял. Только вот 0чФФ это которое 0хFF ?
Re: Atmega8: запись/чтение встроенной EEPROM
Добавлено: Сб июл 19, 2014 17:20:38
ffllyy23
полезная вещь интернет. за день разобрался для чего EEPROM и как с ним работать.
Re: Atmega8: запись/чтение встроенной EEPROM
Добавлено: Сб июл 19, 2014 19:01:10
Аlex
ffllyy23 писал(а):как используя встроенной EEPROM по очередно записывать вход с АЦП в разные области памяти , а затем считывать для вставления данных в разные области порграммы
Шедевр
Вы хоть сами поняли что написали ?

Re: Atmega8: запись/чтение встроенной EEPROM
Добавлено: Вт июл 22, 2014 07:11:45
Vanes
Согласен, зачем такие тяжбы ??? если есть необходимость в хранении значения переменной после обесточивания МК тгда EEPROM, а если нет то просто при каждом цикле работы с АЦП записывать значения в переменные и потом суй их куда хочешь.
Re: Atmega8: запись/чтение встроенной EEPROM
Добавлено: Вт июл 22, 2014 07:55:14
Pink-Pank
Особенно учитывая тот факт, что запись в EEPROMдлится около 10 мс (частота не более 100 Гц), а АЦП может работать на частототе где-то до мегагерца.
Re: Atmega8: запись/чтение встроенной EEPROM
Добавлено: Вт июл 22, 2014 14:09:45
Vanes
Я использовал запись в EEPROM в своих "твареньях" вот каким образом: Ставил перед стабилизатором питания МК конденсатор большой емкостью, получается своеобразная батарейка. А одной ножкой МК проверяю напряжения входе питания всей схемы и как только пропадает на ней напруга программа производит запись нужных мне переменных в EEPROM. как то так.