Как перевернуть байт

Раздел начинающих пользователей
Правила форума
В песочнице можно спрашивать когда незнаешь где спросить.
В песочнице нелзя посылать в гугл
В песочнице можно задавать любой вопрос, но на него могут и неответить.
Песочница для тех, кто начинает свои вопросы с защиты чайников от пинков.
В песочницу будут перетаскиваться вопросы неполучившие ответа.
Песочница - попытка навести порядок.
На песочницу большие надежды.

Как перевернуть байт

Сообщение andrewproffi (Андрей) » 03 фев 2017, 19:10

Здравствуйте, подскажите пожалуйста каким образом, максимально быстро (не применяя таблиц) можно перевернуть байт? ( то есть было 0b00000111, стало 0b11100000)
найденный способ
G = ((G>>1) & 0x55) | ((G<<1) & 0xAA);
G = ((G>>2) & 0x33) | ((G<<2) & 0xCC);
G = ((G>>4) & 0x0F) | ((G<<4) & 0xF0);
чуть более медленный чем надо :(
либо каким образом можно изменить порядок отправки битов в порт в компоненте ONE WIRE на обратный?
while (counter < 8) //отправка G
{
tx_bit(G);
G = G >> 1;
counter++;
}
Аватар пользователя
Ник: andrewproffi
Имя: Андрей
(Томск)
Суперконсульт
Суперконсульт
Информация о пользователе

Re: Как перевернуть байт

Сообщение Yushik (Андрей) » 03 фев 2017, 20:18

У меня из моих загашников есть только такие данные:

В языке СИ нету операций сдвига по кольцу, их можно заменить следующим кодом. Следует ПОМНИТЬ!!! что данный код не применим для
переменных которые имеют отрицательное значение.

1.unsigned int x = 0x1234ABCD; // число которое двигать надо
2.unsigned int v = 2; // на сколько двигать
3.r=32; //разрядность переменной (32 для int)
4.x = (x >> v) OR (x << (r-v)); // циклический сдвиг вправо
5.x = (x << v) OR (x >> (r-v)); // циклический сдвиг влево



Копирование отдельных 8 старших битов из Ulong в Byte

1.x // переменная Byte
2.Bufer // переменная Ulong
3.y //номер бита с которого нужно начинать копирование (не больше 24 для Ulong)
4.x = (Bufer AND (255 << y)) >> y


1.Копирование младших битов в старшие и наоборот.
2.В-искомый результат, А-исходное число с которым производится вычисление.

B = B OR (A >> 7 AND 1)
B = B OR (A >> 5 AND 2)
B = B OR (A >> 3 AND 4)
B = B OR (A >> 1 AND 8)
B = B OR (A << 7 AND 128)
B = B OR (A << 5 AND 64)
B = B OR (A << 3 AND 32)
B = B OR (A << 1 AND 16)


& ( или and ),
| ( или OR ),
^ ( или XOR ),
- ( или NOT ),
Аватар пользователя
Ник: Yushik
Имя: Андрей
(Симферополь)
Специалист
Специалист
Информация о пользователе

Re: Как перевернуть байт

Сообщение andrewproffi (Андрей) » 04 фев 2017, 04:40

Проблема вроде решена, отправка идет следующим образом
a - новая переменная G - исходный байт для отправки
a = G >> 7;
tx_bit(a);
a = G >> 6;
tx_bit(a);
a = G >> 5;
tx_bit(a);
a = G >> 4;
tx_bit(a);
a = G >> 3;
tx_bit(a);
a = G >> 2;
tx_bit(a);
a = G >> 1;
tx_bit(a);
a = G ;
tx_bit(a);
ps: напоминаю что это макросы из компонента ONE WIRE, конкретно tx_byte
Аватар пользователя
Ник: andrewproffi
Имя: Андрей
(Томск)
Суперконсульт
Суперконсульт
Информация о пользователе
Вернуться наверх

Re: Как перевернуть байт

Сообщение kindofsky (kindofsky) » 04 фев 2017, 07:07

Привет коллеги.
Ну капец... приплыли.... Гланды через жопу достаем.

andrewproffi писал(а):каким образом можно изменить порядок отправки битов

На мой взгляд это правильная мысль. Надо немного капнУть глубже вот эту тему:
andrewproffi писал(а):while (counter < 8) //отправка G
{
tx_bit(G);
G = G >> 1;
counter++;
}


Посмотрите колдовские заклятья бабы Яги написанные в незапамятные времена.
Вот они.
Вдруг поможет?
Я как то стандартный макрос SPI дорабатывал с возможностью работы в обоих направлениях.
Если найду - приложу.
Аватар пользователя
Ник: kindofsky
Имя: kindofsky
(Москва)
Супер Гуру
Супер Гуру
Информация о пользователе
Вернуться наверх

Re: Как перевернуть байт

Сообщение andrewproffi (Андрей) » 04 фев 2017, 07:09

Спасибо посмотрю, у вас случайно светодиодов программируемых WS2812B нет в наличии? :oops:
Аватар пользователя
Ник: andrewproffi
Имя: Андрей
(Томск)
Суперконсульт
Суперконсульт
Информация о пользователе
Вернуться наверх

Re: Как перевернуть байт

Сообщение kindofsky (kindofsky) » 04 фев 2017, 07:28

andrewproffi писал(а):светодиодов программируемых WS2812B нет в наличии?

Не. Таких нету.

Я не занимался компонентом ONE WIRE.
Сходу могу подумать такую схему.
Но похоже работать не будет. Надо попробывать.
Код: выделить все
   MX_UINT8 counter = 8;
   while (counter > 0)
   {
      tx_bit(data);
      data = data << 1;            //Rotate to next bit of data
      counter--;                  //decrement Counter
   }


Вот ещё один момент - Что это за функция?
Что она делает?
Код: выделить все
   void tx_bit(MX_UINT8 out)
{
/*Macro_tx_bit_Start*/

   %a_Clear_OO;                  //Clear Output Pin
   delay_us(1);                  //Delay 1us
   if (out & 0x01)
      %a_Float_OO;               //Float Output Pin
   delay_us(60);                  //Delay 60us
   %a_Float_OO;                  //Float Output Pin
   delay_us(10);                  //Delay 10us

/*Macro_tx_bit_End*/
}


Дело в том что вот эта строка - if (out & 0x01) - показывает КАКОЙ бит будет выводиться в порт.

Если 01 заменить на 07..... то....
Сейчас времени нет исследователь, но я бы копал в этом направлении.
Аватар пользователя
Ник: kindofsky
Имя: kindofsky
(Москва)
Супер Гуру
Супер Гуру
Информация о пользователе
Вернуться наверх

Re: Как перевернуть байт

Сообщение andrewproffi (Андрей) » 04 фев 2017, 07:45

Сходу могу подумать такую схему.
Но похоже работать не будет. Надо попробывать.

не работает

Дело в том что вот эта строка - if (out & 0x01) - показывает КАКОЙ бит будет выводиться в порт.

возможно, с первого раза не получилось. но все равно, время выполнения увеличилось, что не допустимо :(
ну еще посмотрю, спасибо!


да, такой способ работает, если записать в макросе бита так
if (out & 128)
и в макросе байта изменить направление сдвига
Код: выделить все
while (counter < 8)  //отправка G
   {
      tx_bit(G);
      G = G << 1;            //Rotate to next bit of data
      counter++;                  //Increment Counter
   }

Возьму на вооружение, выполнение происходит дольше моего способа, но все равно корректно.
Аватар пользователя
Ник: andrewproffi
Имя: Андрей
(Томск)
Суперконсульт
Суперконсульт
Информация о пользователе
Вернуться наверх

Re: Как перевернуть байт

Сообщение kindofsky (kindofsky) » 04 фев 2017, 08:03

Да, все правильно.
Не 7 а 128 надо указывать...
Теоретически время не может увеличится...
Как это выражается?
Аватар пользователя
Ник: kindofsky
Имя: kindofsky
(Москва)
Супер Гуру
Супер Гуру
Информация о пользователе
Вернуться наверх

Re: Как перевернуть байт

Сообщение andrewproffi (Андрей) » 04 фев 2017, 08:08

в вашей программе есть цикл, за счет него видимо и увеличивается
сверху сигнал по моей программе
снизу по вашей.
У вас нет доступа для просмотра вложений в этом сообщении.
Аватар пользователя
Ник: andrewproffi
Имя: Андрей
(Томск)
Суперконсульт
Суперконсульт
Информация о пользователе
Вернуться наверх

Re: Как перевернуть байт

Сообщение mim (mim) » 04 фев 2017, 09:13

kindofsky писал(а):Посмотрите колдовские заклятья бабы Яги написанные в незапамятные времена.
Вот они.
Вдруг поможет?

andrewproffi , ты ссылку изучил??? Я бы советовал сменить кафтан оператора на скромный колпак читателя... У тебя поразительная способность поднимать одни и теже темы по нескольку раз и развозить кашу для журавля по тарелке... Сколько раз в темах обсуждались приемы и способы выдачи информации по последовательному интерфейсу. И синхронно, и асинхронно (и влево, и вправо, и по маске... :headbang: ), и SPI, и I2C, и RC5 и еще много всякой фигни.
Вот то что советовал - kindofsky.
SHIFT.fcf


PS Кстати, разворот байтов тоже уже прошли...
У вас нет доступа для просмотра вложений в этом сообщении.
I Am Legend
Аватар пользователя
Ник: mim
Имя: mim
(Из Лесу, вестимо...)
Легенда
Легенда
Информация о пользователе
Вернуться наверх

След.

Вернуться в ПЕСОЧНИЦА

Кто сейчас на форуме

Пользователь просматривает форум: Yandex [Bot]