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

 
 
> Байты, биты, есть вопрос
Cpraum
сообщение Nov 7 2009, 10:48
Сообщение #1





Группа: Участник
Сообщений: 5
Регистрация: 5-11-09
Пользователь №: 53 425



Доброго времени суток...

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

есть 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-го байта | во второй байт____

Сообщение отредактировал Cpraum - Nov 7 2009, 10:50
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 3)
AHTOXA
сообщение Nov 7 2009, 11:28
Сообщение #2


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Код
// получаем откуда-то значение для ЦАП:
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;


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
V_G
сообщение Nov 7 2009, 11:52
Сообщение #3


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

Группа: Свой
Сообщений: 1 818
Регистрация: 15-10-09
Из: Владивосток
Пользователь №: 52 955



Попробую поправить, начиная с вычисления byte2:

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


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

Код
byte2 = (BYTE)(i & 0xFF);


Сообщение отредактировал V_G - Nov 7 2009, 12:05
Go to the top of the page
 
+Quote Post
Cpraum
сообщение Nov 7 2009, 13:32
Сообщение #4





Группа: Участник
Сообщений: 5
Регистрация: 5-11-09
Пользователь №: 53 425



Отлично, все работает...

Огромное вам спасибо!
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 07:16
Рейтинг@Mail.ru


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