Перейти к содержанию
    

считать long из EEPROMa

Подскажите, как на Си считать из EEPROMa с байтовой организацией, переменную типа long.

Любая 8-ми битная АВРка. Компилятор ИАР 5.30.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Подскажите, как на Си считать из EEPROMa с байтовой организацией, переменную типа long.

Любая 8-ми битная АВРка. Компилятор ИАР 5.30.

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

union вам в помощь.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Подскажите, как на Си считать из 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)); //чтение
............................................................

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В опциях проекта выходной формат Intel-extended не забыть поставить.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо 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 не влияет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В опциях проекта выходной формат стоит ubrof8. установка intel-extended не влияет.

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

 

Например:

 

int __eeprom val = 0x1234;

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

 

на выходе два HEX файла.

Где сие вычитал, к сожалению, не помню.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...