Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Внутренее еепром в авр
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Lexi
Назрел вопрос... Помогите советом плиз!!
Задача такова...
Есть прошивка, это к примеру... Это моя прошива, но под PIC
В ней все хорошо, но...
Все настройки, такие как IP сервера надо задружать из внутренего еепрома.
Вот тут и встает задача, как это сделать??
Для примера я програматором записал 5 байт в еепром, начиная с 0х00 заканчивая 0х04.
Допустим, что там значения '1','2','3','4','5'.
Есть нейкий массив, инициализарованый в SRAM как int mas[5];
Задача загрузить эти данные из еепром в этот массив.
В моем компиляторе я делал бы так

Код
for(i=0;i<5;i++) mas[i]=read_eepom(i);


Всем откликнувшимся на проблему заранее грамаднейшее спасибо!!
GDI
В CVAVR как и в многих других компиляторах есть ключевое слово eeprom, если его написать перед типом переменной при объявлении, например так:
Код
eeprom char i;
то переменная будет располагаться в ЕЕПРОМ и в дальнейшем компилятор сам будет подставлять команды чтения ЕЕПРОМ и сам будет разбираться с относительным смещением этой переменной в карте памяти, а для программиста эта переменная будет как обычная... т.е. ей можно присваивать значение
Код
i = 10;
, но не стоит забывать что она все таки размещается в относительно медленной памяти ЕЕПРОМ и доступ к переменной займет гораздо большее время. Точно так же можно объявить и массив в ЕЕПРОМ, тогда нужный вам кусок кода будет выглядеть примерно так
Код
int mas[5];
eeprom int eemas[5];
....
for(char i=0;i<5;i++) mas[i]=eemas[i];
Lexi
А если у меня таких массивов 5 или 10??
Как я узнаю в какую ячйку eeprom обратится мой компилятор при вышеизложеном коде??
GDI
Цитата
А если у меня таких массивов 5 или 10?
Объявляете соответственно 5 или 10 массивов в ЕЕПРОМ, да хоть 100, лишь бы они там поместились...

Цитата
Как я узнаю в какую ячйку eeprom обратится мой компилятор при вышеизложеном коде?
А зачем вам это знать? Обращаетесь к массивам по имени, т.е. работаете с ними как с обычными переменными в ОЗУ.
AndyBig
В IAR, например, есть директивы, которыми можно прямо указать адрес переменной в памяти. Например:
Код
int i @0x0100

Посмотрите описание к CVAVR, возможно и там есть подобная возможность...

Цитата
А зачем вам это знать?

Ну, если человек записывает эти настройки единожды при программировании, то знать это все-таки надо smile.gif.
Lexi
Цитата(AndyBig @ Jan 9 2008, 11:17) *
Посмотрите описание к CVAVR, возможно и там есть подобная возможность...
Ну, если человек записывает эти настройки единожды при программировании, то знать это все-таки надо smile.gif.

Да имено так и происходит.... Пользователь будет туда вводить некоторые данные, с которым будет прошива работать
GDI
Цитата
Ну, если человек записывает эти настройки единожды при программировании, то знать это все-таки надо

Если переменные при объявлении еще и проинициализировать, то CVAVR создаст файл для прошивки ЕЕПРОМ с этими значениями. Вообще то компилятор размещает переменные в ЕЕПРОМ в том порядке в каком их объявляет программист, так что не составляет большого труда определить где находится конкретная переменная. В свое время я переменные ЕЕПРОМ объявлял в одном файле eeprom.c а в соответствующем файле eeprom.h объявлял их же с идентификатором extern и инклюдил этот файл во все остальные файлы проекта, т.о. я точно знал что все переменные у меня идут в определенном порядке.
AndyBig
Цитата
Вообще то компилятор размещает переменные в ЕЕПРОМ в том порядке в каком их объявляет программист

Это не регламентируется и не факт, что очередная версия компилятора будет делать так же smile.gif
Можно, конечно, и вообще потом посмотреть MAP... Но все это не лучшие варианты.
Lexi
то есть, если я правильно понял, то если инициализирую
char eeprom IP[16];
char eeprom Port[5];
то под IP займутся ячейки от 0 по 15 , а для Port 16-21
Смогу ли я потом прочесть данные после предворительной записи в еепром, вернее оперировать ими как массив IP и Port???
GDI
Это не регламентируется, но делается так... да и с чего бы компилятору делать както по-другому? Ему и так забот хватает, помимо того чтобы программеру козни с переменными в еепроме строить.. smile.gif
Lexi
Вот это из хелпа
Цитата
twak.gif Accessing the AVR internal EEPROM is accomplished using global variables, preceded by the keyword eeprom.

Example:

/* The value 1 is stored in the EEPROM during chip programming */

eeprom int alfa=1;

eeprom char beta;

eeprom long array1[5];

/* The string is stored in the EEPROM during chip programming */

eeprom char string[]=”Hello”;

void main(void) {
int i;

/* Pointer to EEPROM */
int eeprom *ptr_to_eeprom;

/* Write directly the value 0x55 to the EEPROM */
alfa=0x55;

/* or indirectly by using a pointer */

ptr_to_eeprom=&alfa;

*ptr_to_eeprom=0x55;

/* Read directly the value from the EEPROM */
i=alfa;
/* or indirectly by using a pointer */
i=*ptr_to_eeprom;
}


Это относиться к делу?
GDI
Цитата
то есть, если я правильно понял, то если инициализирую
char eeprom IP[16];
char eeprom Port[5];

Тут вы только объявили переменные, а не проинициализировали, инициализировать надо так:
char eeprom Port[5] = {1,2,3,4,5};

Цитата
то под IP займутся ячейки от 0 по 15 , а для Port 16-21
именно так.

Цитата
Смогу ли я потом прочесть данные после предворительной записи в еепром, вернее оперировать ими как массив IP и Port?

Конечно сможете, компилятор просто будет брать данные из ЕЕПРОМ, а уж что и когда вы туда положили - это ваше дело... только если вы будете делать инициализацию так как я описал выше, то данные что вы запишете в ЕЕПРОМ будут затерты инициализацией, так что ее стоит делать только раз, чтобы создать файл прошивки для ЕЕПРОМ, а потом удалить и перекомпилировать проект, сохранив предварительно файл прошивки еепрома в другое место.
Т.е. делаете примерно так:
1. делаете и отлаживаете проект с инициализацией ЕЕПРОМ
char eeprom Port[5] = {1,2,3,4,5};
получаете файл прошивки ЕЕПРОМ и сохраняете его в другое место
2. убираете инициализацию
char eeprom Port[5]; и перекомпилируете проект
3. прошиваете контроллер программой от п.2 а ЕЕПРОМ прошиваете файлом от п.1
AndyBig
Цитата
Это не регламентируется, но делается так... да и с чего бы компилятору делать както по-другому?

Ну мало ли что взбредет в голову авторам компилятора smile.gif. Может быть они решат для экономии ресурса еепром размещать переменные с циклическим сдвигом после каждой перекомпиляции wink.gif
Цитата
Это относиться к делу?

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

Нельзя без строгого регламента, поэтому АВР и лошают.
Компиляторы такие, а не камни.
Все на авось, а потом и моя репутация коту под хвост.

Я разве не прав??
AndyBig
Попробуйте указать адрес массивов как и в IAR:
eeprom char IP[16] @0x00;
eeprom char Port[5] @0x10;

По идее cvavr допускает указание адресов переменных таким образом... Правда в руководстве к нему сказано только про SRAM-переменные, но может и на епром пройдет...
Lexi
Цитата(AndyBig @ Jan 9 2008, 12:47) *
Попробуйте указать адрес массивов как и в IAR:
eeprom char IP[16] @0x00;
eeprom char Port[5] @0x10;

Не прошло, только для SRAM
Цитата(AndyBig @ Jan 9 2008, 12:47) *
По идее cvavr допускает указание адресов переменных таким образом... Правда в руководстве к нему сказано только про SRAM-переменные, но может и на епром пройдет...

придеться делать как GDI говорил.


Еще один аопрос, где можно почитать про протокол, как шить eeprom. Хочу написать ПО для отдельной прошивы EEPROM в человеческом и товарном виде.
AndyBig
Цитата
Не прошло, только для SRAM

А в IAR проходит, только что попробовал...
Цитата
где можно почитать про протокол, как шить eeprom

Шить откуда? Из своей прошивки? Снаружи?
Если снаружи, то читайте даташит на мегу, раздел Memory Programming.
Lexi
Спасибо за ответы, буду насиловать клаву (клавиатуру) дальше smile.gif
Всем beer.gif
011119xx
а как в WINAVR работать с EEPROM?
Непомнящий Евгений
Если нужны фиксированные адреса - я бы работал не через квалификаторы eeprom, а вручную - через регистры проца. В этом случае вы сами совершенно точно знаете, что где лежит.
В WINAVR, насколько я знаю, есть в библиотеке отдельные функции чтения\записи.
011119xx
Цитата(Непомнящий Евгений @ Jan 10 2008, 11:11) *
В WINAVR, насколько я знаю, есть в библиотеке отдельные функции чтения\записи.

функции есть только что-то не удается их использовать
mdmitry
Использую функции для работы с EEPROM в ATmega128, 1281,2561 (запись текущих установок) из библиотеки Winavr. Возможно Вы не подключили необходимые хедеры. Работает корректно, для страховки использую мажоритарную схему (2 из 3), так как блоки записи короткие (16 байт).
011119xx
разобрался, но объявления типа eeprom u16 data[8]; не проходят
Сергей Борщ
Цитата(011119xx @ Jan 10 2008, 09:47) *
разобрался, но объявления типа eeprom u16 data[8]; не проходят
Ну, если ничего не помогает - попробуйте почитать документацию (Подсказка: c:/WinAVR/doc/avr-libc).
011119xx
К примеру так не проходит:

#include <avr/eeprom.h>

eeprom unsigned int i[8];

int main(void)
{

}
Сергей Борщ
Цитата
попробуйте почитать документацию

Цитата(011119xx @ Jan 10 2008, 10:36) *
К примеру так не проходит:
Гы... гы... ы.... cranky.gif Где вы в документации на avr-libc такое нашли??
011119xx
такого там нет. это была проверка на вшивость
D H
Примите и мои пять копеек:
В даташите есть примеры для записи/чтения епром. берем целиком кусок из даташита и готова функция чтения/записи. Потом используй ее, как использовал для пиков:
MyVar=EEPROM_read(адрес);
EEPROM_write(адрес,MyVar);
В даташите на мегу16/32 это стр.22, для мега8 это стр21, дальше сам найдешь. smile.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.