Atmega8: запись/чтение встроенной EEPROM
- Pavel V.
- Мявтор!
- Сообщения: 384
- Зарегистрирован: Ср май 17, 2006 18:39:01
- Откуда: Москва
- Контактная информация:
Atmega8: запись/чтение встроенной EEPROM
Доброго времени суток!
Я что-то никак не могу разобраться с работой встроенной EEPROM.
Задача такая: есть некий термостат, в котором кнопками задается температура стабилизации. Хотелось бы эту самую температуру сохранять в EEPROM на случай пропадания питания.
Алгоритм простой - после задания температуры, она записывается из временной переменной в EEPROM, а при включении устройства, читается из EEPROM в ту же самую переменную.
В CodeVision AVR есть встроенный механизм работы с EEPROM, но я так и не смог разобраться в нем.. У меня проблемы в несоответствием типов данных.
К какому типу нужно преобразовать число (int), чтобы можно было записать его в EEPROM, а потом прочитать в опять же int?
Я что-то никак не могу разобраться с работой встроенной EEPROM.
Задача такая: есть некий термостат, в котором кнопками задается температура стабилизации. Хотелось бы эту самую температуру сохранять в EEPROM на случай пропадания питания.
Алгоритм простой - после задания температуры, она записывается из временной переменной в EEPROM, а при включении устройства, читается из EEPROM в ту же самую переменную.
В CodeVision AVR есть встроенный механизм работы с EEPROM, но я так и не смог разобраться в нем.. У меня проблемы в несоответствием типов данных.
К какому типу нужно преобразовать число (int), чтобы можно было записать его в EEPROM, а потом прочитать в опять же int?
- Aheir
- Модератор
- Сообщения: 4517
- Зарегистрирован: Пн апр 03, 2006 11:43:25
- Откуда: Санкт - Петербург
- Контактная информация:
Чтобы записать int в eeprom его надо сначала на 2 байта разделить, а потом уже их писать в разные ячейки, а после чтения снова склеивать..
Я делал так (см. вложение)
Процедуры чтения/записи двухбайтового числа - как раз тебе подойдут...
Я делал так (см. вложение)
Процедуры чтения/записи двухбайтового числа - как раз тебе подойдут...
- Вложения
-
- untitled.rar
- (488 байт) 1872 скачивания
-
Гость
Re: Atmega8: запись/чтение встроенной EEPROM
А вот у меня на 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;
// то все заработало как часики.
Но т.к. я чайтик, то так и не понял до конца в чем был прикол...
.
Протрахался 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
а я и так и так пробовал и ничего не получилось. я сам начинающий, если что сильно не ругайте) у меня вот в чем вопрос, если объявить переменные в eeprom:
eeprom unsigned int *wheele_set;
eeprom unsigned char *cilinders_set;
и тут же присвоить им какие либо значения
*wheele_set=170;
*cilinders_set=4;
то если я правильно понимаю, какие действия не производи с ними в процессе работы, все равно при следущем включении им присвоются эти же значения. И смысл тогда в eeprom?
Или присвоение значений 170 и 4 уже в ходе самой программы? Тогда другой вопрос, какие значения будут в этих переменных, если я просто объявлю их и захочу сразу прочитать? просто у меня именно такой случай, в протеусе вроде все работает, а железе замирает именно на индикации переменной, записанной в 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
Код: Выделить всё
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
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. записываем некий байтик в еепром
Разработал:
-BLDC
-ФУОЗ/МПСЗ
-SMART BMS
-ECU/EDC на STM32F4(43%)+CPLD(57%)
-Моноинжектор на ATSAMD20G16
-контроллер эффектов для RGB LED ленты
-умные часы/обратный счет/секундомер
-устройство измерения емкости АКБ
-BLDC
-ФУОЗ/МПСЗ
-SMART BMS
-ECU/EDC на STM32F4(43%)+CPLD(57%)
-Моноинжектор на ATSAMD20G16
-контроллер эффектов для RGB LED ленты
-умные часы/обратный счет/секундомер
-устройство измерения емкости АКБ
Re: Atmega8: запись/чтение встроенной EEPROM
pcb вы написали:
У меня есть проекты, где еепром хорошо пользуется.
Сделано следующим образом
есть некий байтик в еепромке означающий была ли инициализация, по умолчанию = ФАЛСЕ.
если не было инициализации:
1. инициализируем переменные
2. записываем в еепром
3. меняем некий байтик на ТРУЕ
4. записываем некий байтик в еепром[/quote]
А можно пример какой нибудь. я просто не понял насчет байта, который означает была ли инициализация или нет. Его надо при объявлении переменных тоже как то объявить? значит нужно присвоить ему какое то значение, иначе же фигня получится (если я правильно понимаю).
У меня есть проекты, где еепром хорошо пользуется.
Сделано следующим образом
есть некий байтик в еепромке означающий была ли инициализация, по умолчанию = ФАЛСЕ.
если не было инициализации:
1. инициализируем переменные
2. записываем в еепром
3. меняем некий байтик на ТРУЕ
4. записываем некий байтик в еепром[/quote]
А можно пример какой нибудь. я просто не понял насчет байта, который означает была ли инициализация или нет. Его надо при объявлении переменных тоже как то объявить? значит нужно присвоить ему какое то значение, иначе же фигня получится (если я правильно понимаю).
-
pcb
- Опытный кот
- Сообщения: 833
- Зарегистрирован: Пт авг 12, 2011 09:14:27
- Откуда: Млечный путь/Земля/РФ/Екатеринбург
Re: Atmega8: запись/чтение встроенной EEPROM
Alex2014 писал(а):А можно пример какой нибудь.
Я пишу для аврок на WinAVR, не суть важно.
Alex2014 писал(а): я просто не понял насчет байта, который означает была ли инициализация или нет. Его надо при объявлении переменных тоже как то объявить? значит нужно присвоить ему какое то значение, иначе же фигня получится (если я правильно понимаю).
Объявить надо, но не инициализировать.
Объявление переменных в еепром = задание адреса в этой самой еепром.
Изначально после стирания еепром в нем содержится 0чФФ
Соответственно в момент работы алгоритма значение байта инициализации будет отличное от труе, соответственно после сброса процессора на ветку инициализации уже не попадаем
Разработал:
-BLDC
-ФУОЗ/МПСЗ
-SMART BMS
-ECU/EDC на STM32F4(43%)+CPLD(57%)
-Моноинжектор на ATSAMD20G16
-контроллер эффектов для RGB LED ленты
-умные часы/обратный счет/секундомер
-устройство измерения емкости АКБ
-BLDC
-ФУОЗ/МПСЗ
-SMART BMS
-ECU/EDC на STM32F4(43%)+CPLD(57%)
-Моноинжектор на ATSAMD20G16
-контроллер эффектов для RGB LED ленты
-умные часы/обратный счет/секундомер
-устройство измерения емкости АКБ
Re: Atmega8: запись/чтение встроенной EEPROM
Спасибо вроде понял. Только вот 0чФФ это которое 0хFF ?
Re: Atmega8: запись/чтение встроенной EEPROM
полезная вещь интернет. за день разобрался для чего EEPROM и как с ним работать.
Последний раз редактировалось ffllyy23 Сб июл 19, 2014 22:06:48, всего редактировалось 1 раз.
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: Atmega8: запись/чтение встроенной EEPROM
Шедеврffllyy23 писал(а):как используя встроенной EEPROM по очередно записывать вход с АЦП в разные области памяти , а затем считывать для вставления данных в разные области порграммы
Вы хоть сами поняли что написали ?
- Vanes
- Первый раз сказал Мяу!
- Сообщения: 27
- Зарегистрирован: Вт июл 08, 2014 14:27:38
- Откуда: Славянск-на-Кубани
Re: Atmega8: запись/чтение встроенной EEPROM
Согласен, зачем такие тяжбы ??? если есть необходимость в хранении значения переменной после обесточивания МК тгда EEPROM, а если нет то просто при каждом цикле работы с АЦП записывать значения в переменные и потом суй их куда хочешь.
- Pink-Pank
- Опытный кот
- Сообщения: 721
- Зарегистрирован: Ср июн 11, 2014 09:43:13
- Откуда: США
- Контактная информация:
Re: Atmega8: запись/чтение встроенной EEPROM
Особенно учитывая тот факт, что запись в EEPROMдлится около 10 мс (частота не более 100 Гц), а АЦП может работать на частототе где-то до мегагерца.
Fucking static initialization order fiasco
- Vanes
- Первый раз сказал Мяу!
- Сообщения: 27
- Зарегистрирован: Вт июл 08, 2014 14:27:38
- Откуда: Славянск-на-Кубани
Re: Atmega8: запись/чтение встроенной EEPROM
Я использовал запись в EEPROM в своих "твареньях" вот каким образом: Ставил перед стабилизатором питания МК конденсатор большой емкостью, получается своеобразная батарейка. А одной ножкой МК проверяю напряжения входе питания всей схемы и как только пропадает на ней напруга программа производит запись нужных мне переменных в EEPROM. как то так.