Раскидать побитовый код с nRF24L01

CEBKACooler
Offline
Зарегистрирован: 14.01.2014

Вопрос конечно на уровне новичка, но сделать не получается. Приходит сигнал с nRF24L01, который нужно раскидать как на картинке.

Есть пример програмного кода, как это можно сделать?

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Ну хотите самый простой и понятный способ... Сначала разделите полученные данные на 0x10000 в результате будет 0xFF, далее результат вычитайте из полученных данных, будет 0x0ACC55... Далее делите на 0x10000 в результатн получите 0x0A... Дальше самидогадаетесь :-) 

Есть некрасивый способ делить на 0x100 и присваивать 8битной переменной то что получилось. В результате в восьмибитном чаре или байте будет получатся значение двух младших циферек.

Можно вместо деления использовать сдвиг.

В общем удочку я вам дал...

Есть более правильный способ с точки зрения микропроцессоров - через структуры.... Хотите в понедельник напишу ? А хотите в гугле поищите :-) Но рыба только завтра.

 

 

leshak
Offline
Зарегистрирован: 29.09.2011
  unsigned long inputData=0xFF0ACC55;
  
  for(byte i=0;i<4;i++){
    byte bt=inputData; // берем пладший байт
    Serial.println(bt,HEX);
    inputData=inputData>>8; // сдвигаем враво на байт
  }

 

leshak
Offline
Зарегистрирован: 29.09.2011

brokly пишет:

В общем удочку я вам дал...

Щет... Не заметил. Помешал процессу обучения. Сорри :)

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Ну и как он теперь без рыбы !?

union u32convert  // объявляем такую структуру
{
    unsigned long Val;
     unsigned char Enum[4];
};

u32convert  temp; //объявляем переменную для колдовства


.....// в теле программы колдуем так
 temp32.Val = 0xFF0ACC55;
Serial.println(temp32.Enum[0]);
Serial.println(temp32.Enum[1]);
Serial.println(temp32.Enum[2]);
Serial.println(temp32.Enum[3]);
.....

Получим самый оптимальный код с точки зрения объема и быстродействия ;) Однако как у любого колдовства у этого способа есть недостаток старший байт будет иметь младший индекс, иными словами в нулевом элементе массива окажется 0хFF.  Но это исправляется логикой программирования, что не стоит ни лишнего байта :-)

Кстати в своем первом сообщении ошибся первое деление должно быть на 0х1000000, второе на 0х10000, третье на 0х100.

 

CEBKACooler
Offline
Зарегистрирован: 14.01.2014

Как то сделал, вроде работает

void prov(unsigned long incomingByte) {
   a = incomingByte >> 24; 
   b = (incomingByte >> 16) & 0xFF; 
   c = (incomingByte >> 8) & 0xFF; 
   d = incomingByte & 0xFF; 
}

 

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Во и удочка не нужна... в общем рыбу можно и динамитом наглушить... и шут с ней, что половина сдохнет и утонет :-)

MaksMS
Offline
Зарегистрирован: 11.03.2013

CEBKACooler пишет:

Как то сделал, вроде работает



void prov(unsigned long incomingByte) {
   a = incomingByte >> 24; 
   b = (incomingByte >> 16) & 0xFF; 
   c = (incomingByte >> 8) & 0xFF; 
   d = incomingByte & 0xFF; 
}

 

Что за извращение ?? ) 

Данные можно разделить как incomingByte[0] , incomingByte[1] и тд.. ранее объявив переменную как массив..

Вообще примеров кода для радиомодулей в интернете и тут полно.