Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Байты, биты
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
Cpraum
Доброго времени суток...

В Си я новичок, и столкнулся со следующей проблемой:

есть 2 байта:
byte1 = 0byyyyxxxx
byte2 = 0bxxxxxxxx

Два этих байта управляют ЦАП, где биты "y" - это константы(параметры ЦАП)
а биты "x" - задают значение напряжения, т.е. переменные.
Данный ЦАП являеться 12 разрядным, следовательно для задяния напряжения
необходимо 12 бит (от 0 = 000000000000 до 4095 = 111111111111).

Возникает такой вопрос: как перевести int в 12 битов, а потом сделать из них два байта следующим образом:
byte1 = 0byyyyxxxx
byte2 = 0bxxxxxxxx
где эти 12 битов встанут на места "x".

Вот пример:

int i = 3589;
12 битов от i = 111000000101;

Получаем два байта:
byte1 = 0byyyy1110
byte2 = 0b00000101

где "y" - константы

111000000101 = 1110 00000101
-------------------- \/--|----\/------------
______конец 1-го байта | во второй байт____
AHTOXA
Код
// получаем откуда-то значение для ЦАП:
unsigned int i = get_i();  // i=xxxxxxxx yyyyyyyy
// сразу оставляем только 12 битов:
i &= 0x0FFF;   // i=0000xxxx yyyyyyyy
// младшие 8 битов - в byte2:
byte2 = i; // byte2 = yyyyyyyy;
//  двигаем i на 8 разрядов вправо:
i >>= 8; // i = 00000000 0000xxxx;
// чистим младшие 4 разряда byte1:
byte1 &= 0xF0;
// и заносим старшие четыре бита из i в byte1:
byte1 |= i; // byte1 = zzzzxxxx;
V_G
Попробую поправить, начиная с вычисления byte2:

Код
byte2 = i & 0xFF;
byte1 = (i>>8) & 0x0F;
byte1 |= 0byyyy0000;


Возможно, в первой и второй строке нужно будет использовать приведение к байтовому типу, но это зависит от того, в каком Си вы работаете. Под Виндой в VC++, например, корректнее будет написать так:

Код
byte2 = (BYTE)(i & 0xFF);
Cpraum
Отлично, все работает...

Огромное вам спасибо!
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.