ATmega16: EEPROM

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Аватара пользователя
Piroman17
Грызет канифоль
Сообщения: 296
Зарегистрирован: Пт янв 12, 2007 17:16:35
Откуда: Дубна
Контактная информация:

ATmega16: EEPROM

Сообщение Piroman17 »

Насколько я понимаю EEPROM не очищается после отключения питания, как в него что-то записать? (Юзаю компилятор CVAVR).
"Всё новое - хорошо забытое старое" - для творцов без творческий мысли.
Аватара пользователя
Aheir
Модератор
Сообщения: 4517
Зарегистрирован: Пн апр 03, 2006 11:43:25
Откуда: Санкт - Петербург
Контактная информация:

Сообщение Aheir »

Правильно понимаете.. :)
Вот в догонку библиотека для пользования ЕЕПРОМа Атмеловских камней
(писал сам и давно, так что сильно не пинайте, но на всех моих процессорах работает, от AT90S2313 до ATMega128) :)

Желательно не использовать первую ячейку ЕЕПРОМа, а то бывает, что при проблемах с питанием она слетает (в смысле, содержимое портится).
Вложения
avr_eeprom.rar
(555 байт) 679 скачиваний
Оптимизм х (Опыт + Знания) = const
Аватара пользователя
Abaktyсh
Вечно гонимый
Сообщения: 232
Зарегистрирован: Ср фев 28, 2007 17:48:07

Re: ATmega16: EEPROM

Сообщение Abaktyсh »

Piroman17 писал(а):Насколько я понимаю EEPROM не очищается после отключения питания, как в него что-то записать? (Юзаю компилятор CVAVR).


В точном соответствии с примером в CVAVR и с примером кода в даташите (чтоб использовать Си код из даташита в CVAVR нужен мой заголовочный файл m8_128.h - так как в CVAVR не прописаны биты регистров.

Aheir писал(а):Желательно не использовать первую ячейку ЕЕПРОМа


И помнить что счет ячеек начинается с НУЛЯ.
Аватара пользователя
dx40
Нашел транзистор. Понюхал.
Сообщения: 182
Зарегистрирован: Вт июл 11, 2006 12:39:16
Откуда: Москва
Контактная информация:

Сообщение dx40 »

Люди, какая библиотека???
Это же CVAVR - все делает сам.
Просто объявляешь глобальную переменную (сразу после инклюдов), например так:
eeprom int a,b;
и пользуешься ими как обычными переменными. Но надо помнить, что обращение к ним занимает много времени и требует много программной памяти.
И еще при использовании EEPROM надо обязательно включать BOD (фьюзами) иначе после первого же выключения питания данные попортятся.
Аватара пользователя
Piroman17
Грызет канифоль
Сообщения: 296
Зарегистрирован: Пт янв 12, 2007 17:16:35
Откуда: Дубна
Контактная информация:

Сообщение Piroman17 »

Можно поконкретнее про фьюзы... Какие на ноль ставить?
"Всё новое - хорошо забытое старое" - для творцов без творческий мысли.
Аватара пользователя
Aheir
Модератор
Сообщения: 4517
Зарегистрирован: Пн апр 03, 2006 11:43:25
Откуда: Санкт - Петербург
Контактная информация:

Сообщение Aheir »

Фьюз BODEN ставим в 0, т.е. активируем.

dx40 писал(а):объявляешь глобальную переменную (сразу после инклюдов), например так:
eeprom int a,b;
и пользуешься ими как обычными переменными


А как считать в эту переменную данные из ЕЕПРОМ при повторном включении устройства?
Оптимизм х (Опыт + Знания) = const
Аватара пользователя
dx40
Нашел транзистор. Понюхал.
Сообщения: 182
Зарегистрирован: Вт июл 11, 2006 12:39:16
Откуда: Москва
Контактная информация:

Сообщение dx40 »

При любом обращении к этой переменной она автоматически считывается из eeprom(или записывается), т.е. с ними можно работать как с обычными переменными, но после выключения-включения их значение не изменяется.
Аватара пользователя
Aheir
Модератор
Сообщения: 4517
Зарегистрирован: Пн апр 03, 2006 11:43:25
Откуда: Санкт - Петербург
Контактная информация:

Сообщение Aheir »

Т.е. объявлять их надо

eeprom unsigned char a, b;

если я напишу объявление

eeprom unsigned char a = 0;

то мне в ЕЕПРОМ сразу 0 пропишется?
Оптимизм х (Опыт + Знания) = const
Аватара пользователя
Abaktyсh
Вечно гонимый
Сообщения: 232
Зарегистрирован: Ср фев 28, 2007 17:48:07

Сообщение Abaktyсh »

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

Сообщение Aheir »

Угу, например, нормальный супервизор пользовать.. 8)
Оптимизм х (Опыт + Знания) = const
Аватара пользователя
Abaktyсh
Вечно гонимый
Сообщения: 232
Зарегистрирован: Ср фев 28, 2007 17:48:07

Сообщение Abaktyсh »

Возможно компиляторы знают ошибку. А если нет то можно объявить первую переменную в EEPROM и не использовать ее в программе, полагаю она и будет в ячейке 0.

Добавлено:

Я проверил - CVAVR не использует ячейку "0" EEPROM.

Нужно будет посмотреть как в других компиляторах.
Кашпо
Опытный кот
Сообщения: 764
Зарегистрирован: Пт фев 02, 2007 10:19:58
Откуда: Железногорск

Сообщение Кашпо »

Aheir писал(а):Т.е. объявлять их надо

eeprom unsigned char a, b;

если я напишу объявление

eeprom unsigned char a = 0;

то мне в ЕЕПРОМ сразу 0 пропишется?

Странно всё это. У меня написано примерно так:
eeprom int X = 123;
в процессе выполнения программы я иногда туда что-нить пишу, чтобы потом при запуске или перезагрузке оно считывалось в прежнем виде.

Но после выключения/включения питания в X содержится совсем не то, что писалось в процессе работы программы. Такое ощущение, что там содержится 123, (пока точно не проверял) т.е. то, что записано в компиляторе в качестве инициализации. Может такое быть?

P.S. контроллер atmega128, компилятор cvavr
Аватара пользователя
dx40
Нашел транзистор. Понюхал.
Сообщения: 182
Зарегистрирован: Вт июл 11, 2006 12:39:16
Откуда: Москва
Контактная информация:

Сообщение dx40 »

BOD включен?
Кашпо
Опытный кот
Сообщения: 764
Зарегистрирован: Пт фев 02, 2007 10:19:58
Откуда: Железногорск

Сообщение Кашпо »

dx40 писал(а):BOD включен?

Вот не помню. по-мойму включал. но точно не скажу.
я просто и хотел узнать может ли быть так что компилятор при включении инициализирует ячейки eeprom если для них прописаны значения при объявлении?
их конечно можно не прописывать, но тогда компилятор ворчит что есть неинициализированные eeprom.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

Какой еще компилятор при включении?! Откуда? Компилятор сгенерировал код, который потом зашили в память - и все, компилятор отдыхает. Или как всегда все делается в эмуляторах?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
tych
Э...
Сообщения: 2792
Зарегистрирован: Ср апр 04, 2007 08:39:14
Откуда: Москва
Контактная информация:

Сообщение tych »

ИМХО ОЧЕВИДНО что он спросил:

Компилятор создает код который иницирует EEPROM при включении МК ?
Думайте сами, решайте сами ... а вот он-лайн перевод на корявый русский http://translate.ru
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

МНЕ НЕ ОЧЕВИДНО.
Чтобы было очевидно, надо использовать ассемблер. Для меня логично было бы, если компилятор для переменных в eeprom формировал бы просто hex-файл для начальной прошивки... То есть аналогично ассемблеру:

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

     .eeseg
var: .byte  123

А то, что именно он там творит - это на совести реализаций Си, сие мне неведомо :)
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
tych
Э...
Сообщения: 2792
Зарегистрирован: Ср апр 04, 2007 08:39:14
Откуда: Москва
Контактная информация:

Сообщение tych »

Я ж про ВОПРОС писал. А не про то что реально делает компилятор.
Думайте сами, решайте сами ... а вот он-лайн перевод на корявый русский http://translate.ru
Кашпо
Опытный кот
Сообщения: 764
Зарегистрирован: Пт фев 02, 2007 10:19:58
Откуда: Железногорск

Сообщение Кашпо »

не ругайтесь господа коты ;-)
Я хотел сказать то, что понял товарищ tych.
Я немного в курсе, что компилятор сгенерил код и отдыхает ;)
Вчера проверил - BOD отключен :)) . Включать пока не пробовал. Но после включения питания в этой ячейке EEPROM лежит приблизительно одно и тоже число. (почему приблизительно, потому как точное значение на ЖК экранчик я не вывожу, а вывожу только результат обработки этого значения некоей функцией с округлением до целого. Результат совпадает).

Если бы можно было повторить эту ситуацию в симуляторе - но ведь нет. в симуляторе EEPROM не сохраняется между симуляциями.
Приходится шить контроллер. В общем - попробую сегодня включить BOD. если не поможет убиру начальные значения. В общем отпишусь.
Кашпо
Опытный кот
Сообщения: 764
Зарегистрирован: Пт фев 02, 2007 10:19:58
Откуда: Железногорск

Сообщение Кашпо »

В общем всё оказалось намного проще. Я сам обнулял EEPROM в самом начале программы. Точнее она обнулялась некоей функцией, котороя изначально не предназачалась для вызова в начале программы :)) .

В общем мой косяк :)))
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»