ATmega16: EEPROM

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

Сообщение Piroman17 »

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

Сообщение Aheir »

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

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

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

Piroman17 писал(а):Насколько я понимаю EEPROM не очищается после отключения питания, как в него что-то записать? (Юзаю компилятор CVAVR).
В точном соответствии с примером в CVAVR и с примером кода в даташите (чтоб использовать Си код из даташита в CVAVR нужен мой заголовочный файл m8_128.h - так как в CVAVR не прописаны биты регистров.
Aheir писал(а):Желательно не использовать первую ячейку ЕЕПРОМа
И помнить что счет ячеек начинается с НУЛЯ.
Нашел транзистор. Понюхал.
Аватара пользователя
Сообщения: 182
Зарегистрирован: Вт июл 11, 2006 12:39:16
Откуда: Москва

Сообщение dx40 »

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

Сообщение Piroman17 »

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

Сообщение Aheir »

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

Сообщение dx40 »

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

Сообщение Aheir »

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

eeprom unsigned char a, b;

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

eeprom unsigned char a = 0;

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

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

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

Сообщение Aheir »

Угу, например, нормальный супервизор пользовать.. 8)
Оптимизм х (Опыт + Знания) = const
Контактная информация:
Вечно гонимый
Аватара пользователя
Сообщения: 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
Нашел транзистор. Понюхал.
Аватара пользователя
Сообщения: 182
Зарегистрирован: Вт июл 11, 2006 12:39:16
Откуда: Москва

Сообщение dx40 »

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

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

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

Сообщение ARV »

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

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

Сообщение tych »

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

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

Сообщение ARV »

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

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

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

Мой уютный бложик... заходите!
Контактная информация:
Э...
Аватара пользователя
Сообщения: 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 в самом начале программы. Точнее она обнулялась некоей функцией, котороя изначально не предназачалась для вызова в начале программы :)) .

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

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