работа с битами.
- Войдите на сайт для отправки комментариев
Втр, 06/09/2016 - 20:03
Доброе время суток!!
нужна помощь в написании кода, что нужно:
есть число (analog read + преобразования - не важно), на выходе число от 0 до 8000. его нужно преобразовать в двоичный вид, на 13 разрядов, так чтоб на маленьких числах не пропадали нули в старших разрядах ( 0x101 должен выглядеть как "0 0000 0000 0101".
и это не все)) эти 13 разрядов нужно разрезать на 2 части: 6 старших (S) и 7 младших (M), эти "кусочки" нужно вставить в 16 разрядов в виде "xxSSSSSSxMMMMMM", где вместо иксов будут нужные мне биты (0 или 1).
далее это все отправляется в serial.print…
на ком порту сидит программа, она читает эти 16 бит и уже сама преобразовывает информацию...
заранее спасибо!))
нужна помощь в написании кода
Вам нужна помощь или нужно написать код за Вас?
Если первое, давайте Ваш код и говорите на чём застопорились.
А если второе, то обратитесь в профильный раздел, там Вам напишут.
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);
Хотя ни фига не понял, отправлять сначала младший байт в UART или старший...
ptr,
http://arduino.ru/forum/obshchii/vstavka-programmnogo-koda-v-temukomment...
приветствуется любая информация по теме. писать полностью программму не требуется, достаточно подсказать именно по разбивке по-разрядно...
пока в мыслях разбивать двоичный результат поразрядно в массив, а уже оттуда доставать побитно...
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,
http://arduino.ru/forum/obshchii/vstavka-programmnogo-koda-v-temukomment...
Спасибо! Знал, но просто забыл это сделать. Прошу прощения...
ну что, попробовал, мой код такой:
но, проблема такая: теряются нолики, которые в старших разрядах, а без них "принимающая" программа неправильно считает, и выдает абракадабру...
кто обьяснит, как а ардуино работает связка serial.print-com порт...
теряются нолики, которые в старших разрядах
Само собой. В примере я же не зря использовал беззнаковый тип byte. Вы использовали тип int, у которого в старшем разряде знак числа. Если бы использовали unsigned int, то такой проблемы не было.
Само собой. В примере я же не зря использовал беззнаковый тип byte. Вы использовали тип int, у которого в старшем разряде знак числа. Если бы использовали unsigned int, то такой проблемы не было.
буду пробовать))
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()
спасибо, решилось.... код такой:
b2, 82, 43, 13 - заголовок. по нему начинается прием данных, hb и lb преобразованные данные.