roboforum.ru

Технический форум по робототехнике.

[FAQ] 2*8bit to 16bit и наоборот

[FAQ] 2*8bit to 16bit и наоборот

toshas » 29 фев 2008, 20:32

подскажите как написать, не могу найти (

char a;
char b;
int c;
c=.... ?

int c;
char a;
char b;
a=....?
b=....?

спасибо!

Добавлено спустя 1 час 6 минут 40 секунд:
для 16->2*8:
a=c; //младшие биты
b=(с>>8);//старшие биты

так ?

Добавлено спустя 8 минут:
а для 2*8->16:
c=a;//младшие
с=c+(b<<8);старшие ?

Re: 2*8bit to 16bit и наоборот

-= Александр =- » 01 мар 2008, 00:46

char a,b;
int c;

c=a+(int)b<<8;

обратно:

a=(char)c>>8;
b=(char)(c&&0x0F);

Re: 2*8bit to 16bit и наоборот

Vooon » 01 мар 2008, 01:29

-= Александр =- писал(а):b=(char)(c&&0x0F);

ошибочка, должно быть (c & 0xFF),
но И с маской можно не делать, просто (char)(c)

Re: 2*8bit to 16bit и наоборот

Сергей » 01 мар 2008, 02:29

Код: Выделить всёРазвернуть
/**
* @def GetLowByte(x)
* @brief Извлечение из слова младшего байта
*/
#define GetLowByte(x) ((char)(x))

/**
* @def GetHighByte(x)
* @brief Извлечение из слова старшего байта
*/
#define GetHighByte(x) ((x)>>8)

/**
* Получаем слово, посредством соединения старшего и младшего байтов
* @param HighByte Старший байт
* @param LowByte Младший байт
* @return Слово(16-бит)
*/
uint16_t GetWord(uint8_t HighByte, uint8_t LowByte)
{
   return ((HighByte & 0xFF)<<8)|(LowByte & 0xFF);
}

2*8bit to 16bit и наоборот

rig » 01 мар 2008, 07:29

для 2*8->16:
Код: Выделить всёРазвернуть
adress_с   =&с;
* adress_с   = a;
*(adress_с+1)= b;


для 16->2*8:
Код: Выделить всёРазвернуть
 adress_c=&c;
a   =*adress_c;
b   =*(adress_c+1);


сколько вариантов то оказывается! :shock:

Re: 2*8bit to 16bit и наоборот

toshas » 01 мар 2008, 17:59

всем спасибо за подсказки, программатор снова заработает, будем использовать )

Re: [FAQ] 2*8bit to 16bit и наоборот

Кирилл » 21 июн 2008, 18:31

а как на бейсике это осуществить? или хотя бы на асме...
ну вообщем с помощью человека с electronix.ru во такое намутил, вдруг кому пригодиться:
Код: Выделить всёРазвернуть
Dim Val16 As Word 
Dim Lowb As Byte
Dim Highb As Byte
Dim TempHb As Integer
Dim Temp As Integer
Dim Temp2 As Integer

TempHb = Val16 / 255
Highb = TempHb 'старший байт
Temp = TempHb * 255
Temp2 = Val16 - TempHb
Lowb = Temp2 - Temp 'младший байт

Re: [FAQ] 2*8bit to 16bit и наоборот

elmot » 16 мар 2013, 13:45

Осторожно, некропост.
Я тут обнаружил, что как минимум Raisonanse C complier для STM8 генерит жуткий говнокод для стандартной конструкции переписывания 16-бит числа в 8-бит регистры. Прошу учесть, что порядок байтов для stm8 - старший, младший, порядок записи регистров имеет значение.

Итак, стандартный код на С из всех учебников
Код: Выделить всёРазвернуть
     unsigned int ch1Sum;
...
     TIM5_CCR1H = ch1Sum >> 8;
     TIM5_CCR1L = ch1Sum;

генерит вот что:
Код: Выделить всёРазвернуть
;TIM5_CCR1H = ch1Sum >> 8; 
         LDW   X,ch1Sum
         CLR   A
         RRWA  X,A
         LD    A,XL
         LD    TIM5_CCR1,A
;TIM5_CCR1L = ch1Sum;
         MOV   TIM5_CCR1+1,ch1Sum+1

Короче, жуть.
Переписываем так:
Код: Выделить всёРазвернуть
     unsigned int ch1Sum;
...
     TIM5_CCR1H = ((u8*)&ch1Sum)[0];
     TIM5_CCR1L = ch1Sum;

Получаем адекватные 2 MOVa:
Код: Выделить всёРазвернуть
;TIM5_CCR1H = ((u8*)&ch1Sum)[0]; 
       MOV   TIM5_CCR1,ch1Sum
;TIM5_CCR1L = ch1Sum;
       MOV   TIM5_CCR1+1,ch1Sum+1

И аналогично в обратную сторону:
Код: Выделить всёРазвернуть
    unsigned int uSonicRange;
...
      ((unsigned char *)&uSonicRise)[0] = TIM1_CCR2H;
      ((unsigned char *)&uSonicRise)[1] = TIM1_CCR2L;


cron
Rambler\'s Top100 Mail.ru counter