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

Вообще-то, как говорил кот Матроскин, чтобы что-то продать(прочитать) нужно вначале купить(записать) wink.gif
union вам в помощь.
mempfis_
Цитата(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)); //чтение
............................................................
VladimirYU
В опциях проекта выходной формат Intel-extended не забыть поставить.
bbill
Спасибо 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 не влияет.
VladimirYU
Цитата(bbill @ Mar 24 2010, 14:51) *
В опциях проекта выходной формат стоит ubrof8. установка intel-extended не влияет.

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

Например:

int __eeprom val = 0x1234;
bbill
У меня в опциях линкера стоит

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


на выходе два HEX файла.
Где сие вычитал, к сожалению, не помню.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.