реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Внутренее еепром в авр, компилятор CVAVR
Lexi
сообщение Jan 9 2008, 05:53
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 131
Регистрация: 27-06-07
Из: Беларусь, Гомель
Пользователь №: 28 752



Назрел вопрос... Помогите советом плиз!!
Задача такова...
Есть прошивка, это к примеру... Это моя прошива, но под 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);


Всем откликнувшимся на проблему заранее грамаднейшее спасибо!!

Сообщение отредактировал Lexi - Jan 9 2008, 05:54
Go to the top of the page
 
+Quote Post
GDI
сообщение Jan 9 2008, 07:18
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 235
Регистрация: 14-05-05
Из: Санкт-Петербург
Пользователь №: 5 008



В 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];


--------------------
http://www.embedders.org Блоги разработчиков электроники.
Go to the top of the page
 
+Quote Post
Lexi
сообщение Jan 9 2008, 08:04
Сообщение #3


Частый гость
**

Группа: Свой
Сообщений: 131
Регистрация: 27-06-07
Из: Беларусь, Гомель
Пользователь №: 28 752



А если у меня таких массивов 5 или 10??
Как я узнаю в какую ячйку eeprom обратится мой компилятор при вышеизложеном коде??
Go to the top of the page
 
+Quote Post
GDI
сообщение Jan 9 2008, 08:15
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 235
Регистрация: 14-05-05
Из: Санкт-Петербург
Пользователь №: 5 008



Цитата
А если у меня таких массивов 5 или 10?
Объявляете соответственно 5 или 10 массивов в ЕЕПРОМ, да хоть 100, лишь бы они там поместились...

Цитата
Как я узнаю в какую ячйку eeprom обратится мой компилятор при вышеизложеном коде?
А зачем вам это знать? Обращаетесь к массивам по имени, т.е. работаете с ними как с обычными переменными в ОЗУ.


--------------------
http://www.embedders.org Блоги разработчиков электроники.
Go to the top of the page
 
+Quote Post
AndyBig
сообщение Jan 9 2008, 08:17
Сообщение #5


Иногдящий
****

Группа: Свой
Сообщений: 691
Регистрация: 28-02-05
Пользователь №: 2 931



В IAR, например, есть директивы, которыми можно прямо указать адрес переменной в памяти. Например:
Код
int i @0x0100

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

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

Ну, если человек записывает эти настройки единожды при программировании, то знать это все-таки надо smile.gif.
Go to the top of the page
 
+Quote Post
Lexi
сообщение Jan 9 2008, 08:34
Сообщение #6


Частый гость
**

Группа: Свой
Сообщений: 131
Регистрация: 27-06-07
Из: Беларусь, Гомель
Пользователь №: 28 752



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

Да имено так и происходит.... Пользователь будет туда вводить некоторые данные, с которым будет прошива работать
Go to the top of the page
 
+Quote Post
GDI
сообщение Jan 9 2008, 08:48
Сообщение #7


Профессионал
*****

Группа: Свой
Сообщений: 1 235
Регистрация: 14-05-05
Из: Санкт-Петербург
Пользователь №: 5 008



Цитата
Ну, если человек записывает эти настройки единожды при программировании, то знать это все-таки надо

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


--------------------
http://www.embedders.org Блоги разработчиков электроники.
Go to the top of the page
 
+Quote Post
AndyBig
сообщение Jan 9 2008, 09:14
Сообщение #8


Иногдящий
****

Группа: Свой
Сообщений: 691
Регистрация: 28-02-05
Пользователь №: 2 931



Цитата
Вообще то компилятор размещает переменные в ЕЕПРОМ в том порядке в каком их объявляет программист

Это не регламентируется и не факт, что очередная версия компилятора будет делать так же smile.gif
Можно, конечно, и вообще потом посмотреть MAP... Но все это не лучшие варианты.
Go to the top of the page
 
+Quote Post
Lexi
сообщение Jan 9 2008, 09:16
Сообщение #9


Частый гость
**

Группа: Свой
Сообщений: 131
Регистрация: 27-06-07
Из: Беларусь, Гомель
Пользователь №: 28 752



то есть, если я правильно понял, то если инициализирую
char eeprom IP[16];
char eeprom Port[5];
то под IP займутся ячейки от 0 по 15 , а для Port 16-21
Смогу ли я потом прочесть данные после предворительной записи в еепром, вернее оперировать ими как массив IP и Port???
Go to the top of the page
 
+Quote Post
GDI
сообщение Jan 9 2008, 09:21
Сообщение #10


Профессионал
*****

Группа: Свой
Сообщений: 1 235
Регистрация: 14-05-05
Из: Санкт-Петербург
Пользователь №: 5 008



Это не регламентируется, но делается так... да и с чего бы компилятору делать както по-другому? Ему и так забот хватает, помимо того чтобы программеру козни с переменными в еепроме строить.. smile.gif


--------------------
http://www.embedders.org Блоги разработчиков электроники.
Go to the top of the page
 
+Quote Post
Lexi
сообщение Jan 9 2008, 09:27
Сообщение #11


Частый гость
**

Группа: Свой
Сообщений: 131
Регистрация: 27-06-07
Из: Беларусь, Гомель
Пользователь №: 28 752



Вот это из хелпа
Цитата
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;
}


Это относиться к делу?
Go to the top of the page
 
+Quote Post
GDI
сообщение Jan 9 2008, 09:34
Сообщение #12


Профессионал
*****

Группа: Свой
Сообщений: 1 235
Регистрация: 14-05-05
Из: Санкт-Петербург
Пользователь №: 5 008



Цитата
то есть, если я правильно понял, то если инициализирую
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


--------------------
http://www.embedders.org Блоги разработчиков электроники.
Go to the top of the page
 
+Quote Post
AndyBig
сообщение Jan 9 2008, 09:36
Сообщение #13


Иногдящий
****

Группа: Свой
Сообщений: 691
Регистрация: 28-02-05
Пользователь №: 2 931



Цитата
Это не регламентируется, но делается так... да и с чего бы компилятору делать както по-другому?

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

Да, но об этом вам сказали с самого начала. А вот об определение конкретного адреса переменных - в этой цитате ни слова.
Go to the top of the page
 
+Quote Post
Lexi
сообщение Jan 9 2008, 09:43
Сообщение #14


Частый гость
**

Группа: Свой
Сообщений: 131
Регистрация: 27-06-07
Из: Беларусь, Гомель
Пользователь №: 28 752



Ну все сделал...
Сим300 подрубил, сервак настроил, конект есть, все надежно....
Но полько одина проблема (я тут клаву уже по монитору).....
Написал проток для радиосвязи....
Отладил работает....
Сча бери другой компилятор и все заново подгонять...

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

Я разве не прав??
Go to the top of the page
 
+Quote Post
AndyBig
сообщение Jan 9 2008, 09:47
Сообщение #15


Иногдящий
****

Группа: Свой
Сообщений: 691
Регистрация: 28-02-05
Пользователь №: 2 931



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

По идее cvavr допускает указание адресов переменных таким образом... Правда в руководстве к нему сказано только про SRAM-переменные, но может и на епром пройдет...
Go to the top of the page
 
+Quote Post
Lexi
сообщение Jan 9 2008, 10:17
Сообщение #16


Частый гость
**

Группа: Свой
Сообщений: 131
Регистрация: 27-06-07
Из: Беларусь, Гомель
Пользователь №: 28 752



Цитата(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 в человеческом и товарном виде.
Go to the top of the page
 
+Quote Post
AndyBig
сообщение Jan 9 2008, 10:28
Сообщение #17


Иногдящий
****

Группа: Свой
Сообщений: 691
Регистрация: 28-02-05
Пользователь №: 2 931



Цитата
Не прошло, только для SRAM

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

Шить откуда? Из своей прошивки? Снаружи?
Если снаружи, то читайте даташит на мегу, раздел Memory Programming.
Go to the top of the page
 
+Quote Post
Lexi
сообщение Jan 9 2008, 10:33
Сообщение #18


Частый гость
**

Группа: Свой
Сообщений: 131
Регистрация: 27-06-07
Из: Беларусь, Гомель
Пользователь №: 28 752



Спасибо за ответы, буду насиловать клаву (клавиатуру) дальше smile.gif
Всем beer.gif
Go to the top of the page
 
+Quote Post
011119xx
сообщение Jan 10 2008, 06:04
Сообщение #19


Местный
***

Группа: Свой
Сообщений: 381
Регистрация: 5-07-05
Из: Уфа
Пользователь №: 6 544



а как в WINAVR работать с EEPROM?
Go to the top of the page
 
+Quote Post
Непомнящий Евген...
сообщение Jan 10 2008, 06:11
Сообщение #20


Знающий
****

Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153



Если нужны фиксированные адреса - я бы работал не через квалификаторы eeprom, а вручную - через регистры проца. В этом случае вы сами совершенно точно знаете, что где лежит.
В WINAVR, насколько я знаю, есть в библиотеке отдельные функции чтения\записи.
Go to the top of the page
 
+Quote Post
011119xx
сообщение Jan 10 2008, 06:20
Сообщение #21


Местный
***

Группа: Свой
Сообщений: 381
Регистрация: 5-07-05
Из: Уфа
Пользователь №: 6 544



Цитата(Непомнящий Евгений @ Jan 10 2008, 11:11) *
В WINAVR, насколько я знаю, есть в библиотеке отдельные функции чтения\записи.

функции есть только что-то не удается их использовать
Go to the top of the page
 
+Quote Post
mdmitry
сообщение Jan 10 2008, 07:25
Сообщение #22


Начинающий профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 25-10-06
Из: СПб
Пользователь №: 21 648



Использую функции для работы с EEPROM в ATmega128, 1281,2561 (запись текущих установок) из библиотеки Winavr. Возможно Вы не подключили необходимые хедеры. Работает корректно, для страховки использую мажоритарную схему (2 из 3), так как блоки записи короткие (16 байт).


--------------------
Наука изощряет ум; ученье вострит память. Козьма Прутков
Go to the top of the page
 
+Quote Post
011119xx
сообщение Jan 10 2008, 07:47
Сообщение #23


Местный
***

Группа: Свой
Сообщений: 381
Регистрация: 5-07-05
Из: Уфа
Пользователь №: 6 544



разобрался, но объявления типа eeprom u16 data[8]; не проходят
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jan 10 2008, 07:57
Сообщение #24


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(011119xx @ Jan 10 2008, 09:47) *
разобрался, но объявления типа eeprom u16 data[8]; не проходят
Ну, если ничего не помогает - попробуйте почитать документацию (Подсказка: c:/WinAVR/doc/avr-libc).


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
011119xx
сообщение Jan 10 2008, 08:36
Сообщение #25


Местный
***

Группа: Свой
Сообщений: 381
Регистрация: 5-07-05
Из: Уфа
Пользователь №: 6 544



К примеру так не проходит:

#include <avr/eeprom.h>

eeprom unsigned int i[8];

int main(void)
{

}
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jan 10 2008, 08:47
Сообщение #26


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата
попробуйте почитать документацию

Цитата(011119xx @ Jan 10 2008, 10:36) *
К примеру так не проходит:
Гы... гы... ы.... cranky.gif Где вы в документации на avr-libc такое нашли??


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
011119xx
сообщение Jan 10 2008, 09:05
Сообщение #27


Местный
***

Группа: Свой
Сообщений: 381
Регистрация: 5-07-05
Из: Уфа
Пользователь №: 6 544



такого там нет. это была проверка на вшивость
Go to the top of the page
 
+Quote Post
D H
сообщение Jan 11 2008, 11:01
Сообщение #28


Участник
*

Группа: Участник
Сообщений: 62
Регистрация: 1-11-06
Пользователь №: 21 847



Примите и мои пять копеек:
В даташите есть примеры для записи/чтения епром. берем целиком кусок из даташита и готова функция чтения/записи. Потом используй ее, как использовал для пиков:
MyVar=EEPROM_read(адрес);
EEPROM_write(адрес,MyVar);
В даташите на мегу16/32 это стр.22, для мега8 это стр21, дальше сам найдешь. smile.gif
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 19:32
Рейтинг@Mail.ru


Страница сгенерированна за 0.01603 секунд с 7
ELECTRONIX ©2004-2016