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

 
 
> считать long из EEPROMa
bbill
сообщение Mar 24 2010, 03:28
Сообщение #1


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

Группа: Участник
Сообщений: 76
Регистрация: 21-10-05
Пользователь №: 9 941



Подскажите, как на Си считать из EEPROMa с байтовой организацией, переменную типа long.
Любая 8-ми битная АВРка. Компилятор ИАР 5.30.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 6)
Dog Pawlowa
сообщение Mar 24 2010, 06:02
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Цитата(bbill @ Mar 24 2010, 07:28) *
Подскажите, как на Си считать из EEPROMa с байтовой организацией, переменную типа long.
Любая 8-ми битная АВРка. Компилятор ИАР 5.30.

Вообще-то, как говорил кот Матроскин, чтобы что-то продать(прочитать) нужно вначале купить(записать) wink.gif
union вам в помощь.


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
mempfis_
сообщение Mar 24 2010, 06:31
Сообщение #3


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

Группа: Свой
Сообщений: 1 001
Регистрация: 27-06-06
Пользователь №: 18 409



Цитата(bbill @ Mar 24 2010, 06:28) *
Подскажите, как на Си считать из EEPROMa с байтовой организацией, переменную типа long.
Любая 8-ми битная АВРка. Компилятор ИАР 5.30.


Код
__eeprom long my_long_var; //объявление

.....................................
my_long_var = 0x12345678; //запись
.....................................

............................................
other_var = my_long_var; //чтение
........................................


Или запись через указатель:

Код
__eeprom unsigned char eeBuff[16]; //массив в еепром

............................................................
long data;
data = 0x11223344; //данные
unsigned char __eeprom *peeData; //уазатель на еепром
peeData = eeBuff; //инициализция указателя
*(peeData+3) = (unsigned char)  (data>>24); //запись
*(peeData+2) = (unsigned char)  (data>>16);
*(peeData+1) = (unsigned char)  (data>>8);
*(peeData+0) = (unsigned char)  (data>>0);
............................................................

data = ((long)  (*(peeData+3)<<24))|((long)|(*(peeData+2)<<16))|(*(peeData+1)<<8))|(*(peeData+0)<<0)); //чтение
............................................................
Go to the top of the page
 
+Quote Post
VladimirYU
сообщение Mar 24 2010, 07:56
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 426
Регистрация: 5-04-07
Из: Санкт-Петербург
Пользователь №: 26 782



В опциях проекта выходной формат Intel-extended не забыть поставить.
Go to the top of the page
 
+Quote Post
bbill
сообщение Mar 24 2010, 11:51
Сообщение #5


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

Группа: Участник
Сообщений: 76
Регистрация: 21-10-05
Пользователь №: 9 941



Спасибо mempfis за ответ.
Моя ошибка заключалась в том, что сначала нужно было сделать приведение типа, а потом делать сдвиг
было
Код
u_char adress = eeDataLong;
...
data_long |= ((EEPROM_read(adress++)) <<8);
data_long |= (EEPROM_read(adress++)) <<16;
...

стало
Код
...
data_long |= ((EEPROM_read(adress++)) <<8);
data_long |= ((long)(EEPROM_read(adress++))) <<16;
...


to Dog Pawlowa:
Для записи приведение типа делать не нужно, ошибок не было.
Код
u_long long_data;
...
EEPROM_write(adress++, long_data >>=8);
EEPROM_write(adress++, long_data >>=16);
...


В опциях проекта выходной формат стоит ubrof8. установка intel-extended не влияет.
Go to the top of the page
 
+Quote Post
VladimirYU
сообщение Mar 24 2010, 13:05
Сообщение #6


Местный
***

Группа: Свой
Сообщений: 426
Регистрация: 5-04-07
Из: Санкт-Петербург
Пользователь №: 26 782



Цитата(bbill @ Mar 24 2010, 14:51) *
В опциях проекта выходной формат стоит ubrof8. установка intel-extended не влияет.

Повлияет, если есть инициализируемые переменные в ЕЕПРОМ, тогда на выходе будет два HEX файла. Прошивка для флэш и для ЕЕПРОМ.

Например:

int __eeprom val = 0x1234;
Go to the top of the page
 
+Quote Post
bbill
сообщение Mar 24 2010, 13:55
Сообщение #7


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

Группа: Участник
Сообщений: 76
Регистрация: 21-10-05
Пользователь №: 9 941



У меня в опциях линкера стоит

Код
-we133=i
-Ointel-extended,(CODE)=$PROJ_DIR$\--Имя проекта--.hex
-Ointel-extended,(XDATA)=$PROJ_DIR$\ee_--Имя проекта--.hex


на выходе два HEX файла.
Где сие вычитал, к сожалению, не помню.
Go to the top of the page
 
+Quote Post

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

 


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


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