работа с битами.

dj_FoXX
dj_FoXX аватар
Offline
Зарегистрирован: 06.09.2016

Доброе время суток!!

нужна помощь в написании кода, что нужно:

есть число (analog read + преобразования - не важно), на выходе число от 0 до 8000. его нужно преобразовать в двоичный вид, на 13 разрядов, так чтоб на маленьких числах не пропадали нули в старших разрядах ( 0x101 должен выглядеть как "0 0000 0000 0101".

и это не все)) эти 13 разрядов нужно разрезать на 2 части: 6 старших (S) и 7 младших (M), эти "кусочки" нужно вставить в 16 разрядов в виде "xxSSSSSSxMMMMMM", где вместо иксов будут нужные мне биты (0 или 1).

далее это все отправляется в serial.print…

на ком порту сидит программа, она читает эти 16 бит и уже сама преобразовывает информацию...

заранее спасибо!))

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

dj_FoXX пишет:

нужна помощь в написании кода

Вам нужна помощь или нужно написать код за Вас? 

Если первое, давайте Ваш код и говорите на чём застопорились.

А если второе, то обратитесь в профильный раздел, там Вам напишут.

ptr
Offline
Зарегистрирован: 28.05.2016

byte you_bit_7 = 0x80, you_bits_14_15 = 0xC0;
byte hb, lb;
int ab;

ab=analogRead( ... );
hb=((ab>>6)&0x7F)|you_bit_7;
lb=(byte)(ab&0x3F)|you_bit_14_15;

Serial.write(lb);
Serial.write(hb);
 

ptr
Offline
Зарегистрирован: 28.05.2016

Хотя ни фига не понял, отправлять сначала младший байт в UART или старший...

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015
dj_FoXX
dj_FoXX аватар
Offline
Зарегистрирован: 06.09.2016

приветствуется любая информация по теме. писать полностью программму не требуется, достаточно подсказать именно по разбивке по-разрядно...

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

dj_FoXX
dj_FoXX аватар
Offline
Зарегистрирован: 06.09.2016

ptr пишет:

byte you_bit_7 = 0x80, you_bits_14_15 = 0xC0;
byte hb, lb;
int ab;

ab=analogRead( ... );
hb=((ab>>6)&0x7F)|you_bit_7;
lb=(byte)(ab&0x3F)|you_bit_14_15;

Serial.write(lb);
Serial.write(hb);
 

 

спасибо, попробую отпишусь)

ptr
Offline
Зарегистрирован: 28.05.2016

Спасибо! Знал, но просто забыл это сделать. Прошу прощения...

dj_FoXX
dj_FoXX аватар
Offline
Зарегистрирован: 06.09.2016

ну что, попробовал, мой код такой:

int hb, lb, hb2;
int ab, ab2;
ab=SHDK*4;
ab2=SHDK*4;
hb=((ab>>7)&127);
lb=(ab2&127);


hb2 = (hb <<8);
int lam = (hb2|lb);

Serial.print(A);
Serial.print(hb2);
Serial.print(lb);

но, проблема такая: теряются нолики, которые в старших разрядах, а без них "принимающая" программа неправильно считает, и выдает абракадабру... 

кто обьяснит, как а ардуино  работает связка serial.print-com порт... 

ptr
Offline
Зарегистрирован: 28.05.2016

dj_FoXX пишет:

теряются нолики, которые в старших разрядах

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

dj_FoXX
dj_FoXX аватар
Offline
Зарегистрирован: 06.09.2016

ptr пишет:

 

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

 

буду пробовать))

DIVGENY
Offline
Зарегистрирован: 23.08.2016

https://youtu.be/iaY4j88zoBo

 

для наглядности можно было бы передать в монитор порта как 16-битное значение
 
твой код....
 unsigned int data_com = hb2*256 + lb;
 Serial.print((data_com), BIN);

это для того что бы не терялись нулеые старшие биты младшего байта,
но в мониторе порта все равно обрежутся старшие нулевые биты старшего байта.
для наглядности число можно сделать 32-битным, вписав в старший 17 разряд единицу и игнорируя ее..
для этого уже применяется
unsigned long, которая занимает 4 байта в памяти МК

тогда так
unsigned long data_com = hb2*256 + lb + 0x10000;

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

Serial.begin(хххх);

терминальные программы

но скорее всего твоя ошибка кроется вот в чем

Serial.write()

не тоже самое, что и Serial.print()

dj_FoXX
dj_FoXX аватар
Offline
Зарегистрирован: 06.09.2016

спасибо, решилось.... код такой:

ab=SHDK*3.906;
ab2=SHDK*3.906;
hb=((ab>>7)&127);
lb=(ab2&127);


Serial.write(0xb2);
Serial.write(0x82);
Serial.write(0x43);
Serial.write(0x13);
Serial.write(hb);
Serial.write(lb);

b2, 82, 43, 13 -  заголовок. по нему начинается прием данных, hb  и lb преобразованные данные.