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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Как разбить 2 байта по байту))
Xenom0rph
сообщение Oct 17 2008, 11:24
Сообщение #1


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

Группа: Новичок
Сообщений: 85
Регистрация: 2-10-08
Пользователь №: 40 646



Вообщем задача такая, у меня есть число типа unsigned int;
Мне надо записать его в ячейку eeprom. Ячейка это один байт, значит для хранения типа unsigned int требуется две ячейки. Так вот как мне разбить это число по байту и записать в ячейки, а когда мне потребуется это число я его обратно склеил?
Знаю, что как то делается это просто, там страший и младший разряд... и т.д. но вот что то немогу никак вьехать в эти разряды.
Go to the top of the page
 
+Quote Post
Палыч
сообщение Oct 17 2008, 11:29
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Например:
unsigned int A;
unsigned char b, c;
b= A&0xFF;
c= A>>8;
A=(c<<8)|b;

или через union...
Go to the top of the page
 
+Quote Post
Xenom0rph
сообщение Oct 17 2008, 11:59
Сообщение #3


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

Группа: Новичок
Сообщений: 85
Регистрация: 2-10-08
Пользователь №: 40 646



Цитата(Палыч @ Oct 17 2008, 15:29) *
Например:
unsigned int A;
unsigned char b, c;
b= A&0xFF;
c= A>>8;
A=(c<<8)|b;

или через union...


У меня A становится просто b и все.
Допустим A = 2008
после выполнения этого кода
b = 216
c = 7
A = 216
Go to the top of the page
 
+Quote Post
Огурцов
сообщение Oct 17 2008, 12:02
Сообщение #4


Гуру
******

Группа: Участник
Сообщений: 3 928
Регистрация: 28-03-07
Из: РФ
Пользователь №: 26 588



На чем пишем ?

В WinAVR/GCC можно сделать так

#define Vxl_obtain_eeprom_word(aValue, aDefault) (aValue != 0xFFFF ? aValue: aDefault)

static uint16 mTasks_target_temp;
EEMEM static uint16 eTasks_target_temp;

mTasks_target_temp = Vxl_obtain_eeprom_word (eeprom_read_word(&eTasks_target_temp), 700);
eeprom_write_word(&eTasks_target_temp, mTasks_target_temp);
Go to the top of the page
 
+Quote Post
Палыч
сообщение Oct 17 2008, 12:07
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(Xenom0rph @ Oct 17 2008, 14:59) *
У меня A становится просто b и все.
Ошибочка вышла...

A=((unsigned int)c<<8) | b;
Go to the top of the page
 
+Quote Post
Demeny
сообщение Oct 17 2008, 12:09
Сообщение #6


Знающий
****

Группа: Свой
Сообщений: 648
Регистрация: 11-02-06
Из: Санкт-Петербург
Пользователь №: 14 237



Цитата(Xenom0rph @ Oct 17 2008, 15:24) *
Вообщем задача такая, у меня есть число типа unsigned int;
Мне надо записать его в ячейку eeprom. Ячейка это один байт, значит для хранения типа unsigned int требуется две ячейки. Так вот как мне разбить это число по байту и записать в ячейки, а когда мне потребуется это число я его обратно склеил?
Знаю, что как то делается это просто, там страший и младший разряд... и т.д. но вот что то немогу никак вьехать в эти разряды.

Не нужно усложнять. eeprom с логической точки зрения ничем не отличается от "обычной" памяти. Поэтому и хранить там данные можно байтами, словами и целыми структурами. А о правильном расположении байтов пусть заботится компилятор.
Код
unsigned int __eeprom MyArray[10];
unsigned int A, B;
...
MyArray[0] = A;  // тут компилятор сам разложит переменную A побайтно и вставит инструкции побайтного сохранения в eeprom
...
B = MyArray[0]; // тут будет проделана обратная работа.

Примечание: в разных компиляторах квалификатор __eeprom может называться по-разному, но смысл тот же - указать компилятору, что память выделяется в зоне eeprom.


--------------------
Сделано в Китае. Упаковано в России.
Go to the top of the page
 
+Quote Post
Палыч
сообщение Oct 17 2008, 12:21
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(Demeny @ Oct 17 2008, 15:09) *
Не нужно усложнять. eeprom с логической точки зрения ничем не отличается от "обычной" памяти. Поэтому и хранить там данные можно байтами, словами и целыми структурами. А о правильном расположении байтов пусть заботится компилятор.
Не все трансляторы понимают квалификатор __eeprom. Там, где этого квалификатора - нет, поможет изучение файла eeprom.h
Go to the top of the page
 
+Quote Post
Xenom0rph
сообщение Oct 17 2008, 12:54
Сообщение #8


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

Группа: Новичок
Сообщений: 85
Регистрация: 2-10-08
Пользователь №: 40 646



Цитата(Палыч @ Oct 17 2008, 16:07) *
Ошибочка вышла...

A=((unsigned int)c<<8) | b;

2Пылыч Спасибо.

А по поводу прямо назначить область eeprom, что то не очень у меня это получаеться, компилятор CVAVR, там есть типо unsigned char eeprom a[10] только вот что то не заносит он туда ничего(( а пишет в data stack.
Go to the top of the page
 
+Quote Post
DiMomite
сообщение Oct 17 2008, 22:52
Сообщение #9


Участник
*

Группа: Свой
Сообщений: 47
Регистрация: 8-04-06
Из: Одесса
Пользователь №: 15 959



В CVAVR надо писать так: eeprom unsigned char a[10];
Go to the top of the page
 
+Quote Post
Xenom0rph
сообщение Oct 18 2008, 10:25
Сообщение #10


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

Группа: Новичок
Сообщений: 85
Регистрация: 2-10-08
Пользователь №: 40 646



Цитата(DiMomite @ Oct 18 2008, 02:52) *
В CVAVR надо писать так: eeprom unsigned char a[10];

Вот спасибо, "Век живи, век учись"
Go to the top of the page
 
+Quote Post
smalcom
сообщение Oct 19 2008, 02:00
Сообщение #11


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

Группа: Свой
Сообщений: 1 292
Регистрация: 26-06-07
Пользователь №: 28 718



вроде небыло варианта

unsigned int uiA = 0xABCD
unsigned char ucB = ((unsigned char*)&uiA)[0]
unsigned char ucC = ((unsigned char*)&uiA)[1]

или
unsigned int uiA = 0xABCD
unsigned char ucpT = (unsigned char*)&uiA
unsigned char ucB = *ucpT
unsigned char ucC = *(++ucpT)
Go to the top of the page
 
+Quote Post
zltigo
сообщение Oct 19 2008, 09:42
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(smalcom @ Oct 19 2008, 04:00) *
вроде небыло варианта

Очень жаль, что теперь "eсть" sad.gif. Зачем создавать уродство на ровном месте без всякой на то надобности? Кроме общего уродства дополнительные проблемы на не 8bit платформах....


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
smalcom
сообщение Oct 19 2008, 11:49
Сообщение #13


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

Группа: Свой
Сообщений: 1 292
Регистрация: 26-06-07
Пользователь №: 28 718



Цитата
Очень жаль, что теперь "eсть" sad.gif. Зачем создавать уродство на ровном месте без всякой на то надобности? Кроме общего уродства дополнительные проблемы на не 8bit платформах....

прочитай топик сверху, а не снизу. и мнение свое держи при себе тем более, что оно не верное.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Oct 19 2008, 13:07
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(smalcom @ Oct 19 2008, 13:49) *
...и мнение свое держи при себе...

В некоторых случаях молчать просто нельзя.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
lks
сообщение Oct 19 2008, 13:29
Сообщение #15


Местный
***

Группа: Новичок
Сообщений: 493
Регистрация: 18-06-06
Пользователь №: 18 143



Цитата(Палыч @ Oct 17 2008, 15:29) *
или через union...


Ну да.

union LOG { unsigned char aa[2], unsigned int dd; }ff;
unsigned char bb, сс;
unsigned int big;

dd.ff = big;
bb = ff.aa[0];
cc = ff.aa[1];

Вроде бы так должно быть? smile.gif
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 25th June 2025 - 09:46
Рейтинг@Mail.ru


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