Страница 1 из 2
ATmega16: EEPROM
Добавлено: Чт мар 29, 2007 08:31:28
Piroman17
Насколько я понимаю EEPROM не очищается после отключения питания, как в него что-то записать? (Юзаю компилятор CVAVR).
Добавлено: Чт мар 29, 2007 08:43:32
Aheir
Правильно понимаете..
Вот в догонку библиотека для пользования ЕЕПРОМа Атмеловских камней
(писал сам и давно, так что сильно не пинайте, но на всех моих процессорах работает, от AT90S2313 до ATMega128)
Желательно не использовать первую ячейку ЕЕПРОМа, а то бывает, что при проблемах с питанием она слетает (в смысле, содержимое портится).
Re: ATmega16: EEPROM
Добавлено: Чт мар 29, 2007 09:58:53
Abaktyсh
Piroman17 писал(а):Насколько я понимаю EEPROM не очищается после отключения питания, как в него что-то записать? (Юзаю компилятор CVAVR).
В точном соответствии с примером в CVAVR и с примером кода в даташите (чтоб использовать Си код из даташита в CVAVR нужен мой заголовочный файл m8_128.h - так как в CVAVR не прописаны биты регистров.
Aheir писал(а):Желательно не использовать первую ячейку ЕЕПРОМа
И помнить что счет ячеек начинается с НУЛЯ.
Добавлено: Чт мар 29, 2007 10:59:44
dx40
Люди, какая библиотека???
Это же CVAVR - все делает сам.
Просто объявляешь глобальную переменную (сразу после инклюдов), например так:
eeprom int a,b;
и пользуешься ими как обычными переменными. Но надо помнить, что обращение к ним занимает много времени и требует много программной памяти.
И еще при использовании EEPROM надо обязательно включать BOD (фьюзами) иначе после первого же выключения питания данные попортятся.
Добавлено: Чт мар 29, 2007 11:16:30
Piroman17
Можно поконкретнее про фьюзы... Какие на ноль ставить?
Добавлено: Чт мар 29, 2007 11:46:57
Aheir
Фьюз BODEN ставим в 0, т.е. активируем.
dx40 писал(а):объявляешь глобальную переменную (сразу после инклюдов), например так:
eeprom int a,b;
и пользуешься ими как обычными переменными
А как считать в эту переменную данные из ЕЕПРОМ при повторном включении устройства?
Добавлено: Чт мар 29, 2007 22:56:43
dx40
При любом обращении к этой переменной она автоматически считывается из eeprom(или записывается), т.е. с ними можно работать как с обычными переменными, но после выключения-включения их значение не изменяется.
Добавлено: Пт мар 30, 2007 08:26:42
Aheir
Т.е. объявлять их надо
eeprom unsigned char a, b;
если я напишу объявление
eeprom unsigned char a = 0;
то мне в ЕЕПРОМ сразу 0 пропишется?
Добавлено: Пт мар 30, 2007 10:21:44
Abaktyсh
Только нужно принять меры чтоб не использовать 0 ячейку.
Добавлено: Пт мар 30, 2007 11:09:15
Aheir
Угу, например, нормальный супервизор пользовать..

Добавлено: Пт мар 30, 2007 12:59:10
Abaktyсh
Возможно компиляторы знают ошибку. А если нет то можно объявить первую переменную в EEPROM и не использовать ее в программе, полагаю она и будет в ячейке 0.
Добавлено:
Я проверил - CVAVR не использует ячейку "0" EEPROM.
Нужно будет посмотреть как в других компиляторах.
Добавлено: Ср май 02, 2007 09:07:56
Кашпо
Aheir писал(а):Т.е. объявлять их надо
eeprom unsigned char a, b;
если я напишу объявление
eeprom unsigned char a = 0;
то мне в ЕЕПРОМ сразу 0 пропишется?
Странно всё это. У меня написано примерно так:
eeprom int X = 123;
в процессе выполнения программы я иногда туда что-нить пишу, чтобы потом при запуске или перезагрузке оно считывалось в прежнем виде.
Но после выключения/включения питания в X содержится совсем не то, что писалось в процессе работы программы. Такое ощущение, что там содержится 123, (пока точно не проверял) т.е. то, что записано в компиляторе в качестве инициализации. Может такое быть?
P.S. контроллер atmega128, компилятор cvavr
Добавлено: Ср май 02, 2007 11:06:53
dx40
BOD включен?
Добавлено: Ср май 02, 2007 11:17:43
Кашпо
dx40 писал(а):BOD включен?
Вот не помню. по-мойму включал. но точно не скажу.
я просто и хотел узнать может ли быть так что компилятор при включении инициализирует ячейки eeprom если для них прописаны значения при объявлении?
их конечно можно не прописывать, но тогда компилятор ворчит что есть неинициализированные eeprom.
Добавлено: Ср май 02, 2007 12:58:04
ARV
Какой еще компилятор при включении?! Откуда? Компилятор сгенерировал код, который потом зашили в память - и все, компилятор отдыхает. Или как всегда все делается в эмуляторах?
Добавлено: Ср май 02, 2007 13:14:05
tych
ИМХО ОЧЕВИДНО что он спросил:
Компилятор создает код который иницирует EEPROM при включении МК ?
Добавлено: Ср май 02, 2007 14:02:05
ARV
МНЕ НЕ ОЧЕВИДНО.
Чтобы было очевидно, надо использовать ассемблер. Для меня логично было бы, если компилятор для переменных в eeprom формировал бы просто hex-файл для начальной прошивки... То есть аналогично ассемблеру:
А то, что именно он там творит - это на совести реализаций Си,
сие мне неведомо

Добавлено: Ср май 02, 2007 15:18:22
tych
Я ж про ВОПРОС писал. А не про то что реально делает компилятор.
Добавлено: Чт май 03, 2007 03:51:02
Кашпо
не ругайтесь господа коты
Я хотел сказать то, что понял товарищ tych.
Я немного в курсе, что компилятор сгенерил код и отдыхает
Вчера проверил - BOD отключен

. Включать пока не пробовал. Но после включения питания в этой ячейке EEPROM лежит приблизительно одно и тоже число. (почему приблизительно, потому как точное значение на ЖК экранчик я не вывожу, а вывожу только результат обработки этого значения некоей функцией с округлением до целого. Результат совпадает).
Если бы можно было повторить эту ситуацию в симуляторе - но ведь нет. в симуляторе EEPROM не сохраняется между симуляциями.
Приходится шить контроллер. В общем - попробую сегодня включить BOD. если не поможет убиру начальные значения. В общем отпишусь.
Добавлено: Пт май 04, 2007 03:15:16
Кашпо
В общем всё оказалось намного проще. Я сам обнулял EEPROM в самом начале программы. Точнее она обнулялась некоей функцией, котороя изначально не предназачалась для вызова в начале программы

.
В общем мой косяк
