Разбор переменной на биты

alexval2007
Offline
Зарегистрирован: 10.11.2012

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


#define LED_1	  2	// тестовый св. диод
#define LED_2	  3	// тестовый св. диод
#define LED_3	  4	// тестовый св. диод
#define LED_4	  5	// тестовый св. диод
#define LED_5	  6	// тестовый св. диод
#define LED_6	  7	// тестовый св. диод
#define LED_7	  8	// тестовый св. диод
#define LED_8	  9	// тестовый св. диод
#define LED_9	  10	// тестовый св. диод
#define LED_10	  11	// тестовый св. диод
#define LED_11	  12	// тестовый св. диод
#define LED_12	  13	// тестовый св. диод
#define LED_13	  14	// тестовый св. диод
#define LED_14	  15	// тестовый св. диод
#define LED_15	  16	// тестовый св. диод
#define LED_16	  17	// тестовый св. диод
//*******************************************************************
unsigned char led1 = 0;//Тестовые светодиоды.
unsigned char led2 = 0;
unsigned char led3 = 0;
unsigned char led4 = 0;
unsigned char led5 = 0;
unsigned char led6 = 0;
unsigned char led7 = 0;
unsigned char led8 = 0;
unsigned char led9 = 0;
unsigned char led10 = 0;
unsigned char led11 = 0;
unsigned char led12 = 0;
unsigned char led13 = 0;
unsigned char led14 = 0;
unsigned char led15 = 0;
unsigned char led16 = 0;
//*******************************************************************
unsigned int read_bit_array[16];  //
//*******************************************************************
void setup() 
{
  pinMode(LED_1, OUTPUT);	// установка вых для св.диода
  pinMode(LED_2, OUTPUT);	// установка вых для св.диода
  pinMode(LED_3, OUTPUT);	// установка вых для св.диода  
  pinMode(LED_4, OUTPUT);	// установка вых для св.диода
  pinMode(LED_5, OUTPUT);	// установка вых для св.диода
  pinMode(LED_6, OUTPUT);	// установка вых для св.диода
  pinMode(LED_7, OUTPUT);	// установка вых для св.диода  
  pinMode(LED_8, OUTPUT);	// установка вых для св.диода
  pinMode(LED_9, OUTPUT);	// установка вых для св.диода
  pinMode(LED_10, OUTPUT);	// установка вых для св.диода
  pinMode(LED_11, OUTPUT);	// установка вых для св.диода  
  pinMode(LED_12, OUTPUT);	// установка вых для св.диода
  pinMode(LED_13, OUTPUT);	// установка вых для св.диода
  pinMode(LED_14, OUTPUT);	// установка вых для св.диода
  pinMode(LED_15, OUTPUT);	// установка вых для св.диода  
  pinMode(LED_16, OUTPUT);	// установка вых для св.диода 
}

void loop()
{
//**********************************************************
led1 = read_bit_array[0];
led2 = read_bit_array[1];
led3 = read_bit_array[2];
led4 = read_bit_array[3];
led5 = read_bit_array[4];
led6 = read_bit_array[5];
led7 = read_bit_array[6];
led8 = read_bit_array[7];
led9 = read_bit_array[8];
led10 = read_bit_array[9];
led11 = read_bit_array[10];
led12 = read_bit_array[11];
led13 = read_bit_array[12];
led14 = read_bit_array[13];
led15 = read_bit_array[14];
led16 = read_bit_array[15];
//**********************************************************
 unsigned int temp = 0;
 temp = 65533;//0xfffd 
 unsigned int input_bit = 0;
 input_bit = temp; //входная переменная регистр 16бит
 unsigned char i = 0;
 
  for (i=0;i<16;i++)
  {
  read_bit_array[i] = (input_bit >> i) & 0x01;
  }

digitalWrite(LED_1, led1);
digitalWrite(LED_2, led2);
digitalWrite(LED_3, led3);
digitalWrite(LED_4, led4);
digitalWrite(LED_5, led5);
digitalWrite(LED_6, led6);
digitalWrite(LED_7, led7);
digitalWrite(LED_8, led8);
digitalWrite(LED_9, led9);
digitalWrite(LED_10, led10);
digitalWrite(LED_11, led11);
digitalWrite(LED_12, led12);
digitalWrite(LED_13, led13);
digitalWrite(LED_14, led14);
digitalWrite(LED_15, led15);
digitalWrite(LED_16, led16);
}

 а вот так неработает 


#define LED_1      2    // тестовый св. диод
#define LED_2      3    // тестовый св. диод
#define LED_3      4    // тестовый св. диод
#define LED_4      5    // тестовый св. диод
#define LED_5      6    // тестовый св. диод
#define LED_6      7    // тестовый св. диод
#define LED_7      8    // тестовый св. диод
#define LED_8      9    // тестовый св. диод
#define LED_9      10    // тестовый св. диод
#define LED_10      11    // тестовый св. диод
#define LED_11      12    // тестовый св. диод
#define LED_12      13    // тестовый св. диод
#define LED_13      14    // тестовый св. диод
#define LED_14      15    // тестовый св. диод
#define LED_15      16    // тестовый св. диод
#define LED_16      17    // тестовый св. диод
//*******************************************************************
void ReadBit(unsigned int input_bit);
unsigned int read_bit_array[16];  //Массив для хранения состояния бит переменной.
//*******************************************************************
unsigned char led1 = 0;//Тестовые светодиоды.
unsigned char led2 = 0;
unsigned char led3 = 0;
unsigned char led4 = 0;
unsigned char led5 = 0;
unsigned char led6 = 0;
unsigned char led7 = 0;
unsigned char led8 = 0;
unsigned char led9 = 0;
unsigned char led10 = 0;
unsigned char led11 = 0;
unsigned char led12 = 0;
unsigned char led13 = 0;
unsigned char led14 = 0;
unsigned char led15 = 0;
unsigned char led16 = 0;
//*******************************************************************
// Чтение битов из переменной.
void ReadBit(unsigned int input_bit)
{
 input_bit = 0; //входная переменная (регистр 16бит)
 unsigned char i = 0;
 
  for (i=0;i<16;i++)
  {
  read_bit_array[i] = (input_bit >> i) & 0x01;
  }
}
//**************************************************************
void setup()
{
  pinMode(LED_1, OUTPUT);    // установка вых для св.диода
  pinMode(LED_2, OUTPUT);    // установка вых для св.диода
  pinMode(LED_3, OUTPUT);    // установка вых для св.диода  
  pinMode(LED_4, OUTPUT);    // установка вых для св.диода
  pinMode(LED_5, OUTPUT);    // установка вых для св.диода
  pinMode(LED_6, OUTPUT);    // установка вых для св.диода
  pinMode(LED_7, OUTPUT);    // установка вых для св.диода  
  pinMode(LED_8, OUTPUT);    // установка вых для св.диода
  pinMode(LED_9, OUTPUT);    // установка вых для св.диода
  pinMode(LED_10, OUTPUT);    // установка вых для св.диода
  pinMode(LED_11, OUTPUT);    // установка вых для св.диода  
  pinMode(LED_12, OUTPUT);    // установка вых для св.диода
  pinMode(LED_13, OUTPUT);    // установка вых для св.диода
  pinMode(LED_14, OUTPUT);    // установка вых для св.диода
  pinMode(LED_15, OUTPUT);    // установка вых для св.диода  
  pinMode(LED_16, OUTPUT);    // установка вых для св.диода
}

void loop()
{
unsigned int temp = 0;
temp = 65533;//0xfffd
ReadBit(temp);
//**********************************************************
led1 = read_bit_array[0];
led2 = read_bit_array[1];
led3 = read_bit_array[2];
led4 = read_bit_array[3];
led5 = read_bit_array[4];
led6 = read_bit_array[5];
led7 = read_bit_array[6];
led8 = read_bit_array[7];
led9 = read_bit_array[8];
led10 = read_bit_array[9];
led11 = read_bit_array[10];
led12 = read_bit_array[11];
led13 = read_bit_array[12];
led14 = read_bit_array[13];
led15 = read_bit_array[14];
led16 = read_bit_array[15];
//**********************************************************
digitalWrite(LED_1, led1);
digitalWrite(LED_2, led2);
digitalWrite(LED_3, led3);
digitalWrite(LED_4, led4);
digitalWrite(LED_5, led5);
digitalWrite(LED_6, led6);
digitalWrite(LED_7, led7);
digitalWrite(LED_8, led8);
digitalWrite(LED_9, led9);
digitalWrite(LED_10, led10);
digitalWrite(LED_11, led11);
digitalWrite(LED_12, led12);
digitalWrite(LED_13, led13);
digitalWrite(LED_14, led14);
digitalWrite(LED_15, led15);
digitalWrite(LED_16, led16);
}








 

 

vdk
Offline
Зарегистрирован: 14.04.2013

А занулять-то входную переменную нафига?

void ReadBit(unsigned int input_bit)
{
input_bit = 0; //входная переменная (регистр 16бит)

 

alexval2007
Offline
Зарегистрирован: 10.11.2012

спасибо глаз замылился неувидел очевидного. Как думаете код можно улучшить?

vdk
Offline
Зарегистрирован: 14.04.2013

Можно, но заниматься мне этим лень

alexval2007
Offline
Зарегистрирован: 10.11.2012

ну тогда вопросик при отправке числа 65533 тоесть бинарное 0b1111111111111101 получаю 0b1011111111111111 тоесть наоборот что нужно изменить чтобы получить то что и на входе а не наоборот

vdk
Offline
Зарегистрирован: 14.04.2013

А где там отправка числа?  Не вижу

Если светодиоды горят в "обратном порядке", тогда и формировать их список надо в обратном порядке

(типа led16 = read_bit_array[0]; )

alexval2007
Offline
Зарегистрирован: 10.11.2012

вот отправка
temp = 65533;//0xfffd
ReadBit(temp);
да я так сделал (типа led16 = read_bit_array[0]; )
но я думал что можно как то по шаманить со сдвигом по идее так правильней
// Чтение битов из переменной.
void ReadBit(unsigned int input_bit)
{
 unsigned char i = 0;
  for (i=0;i<16;i++)
  {
  read_bit_array[i] = (input_bit >> i) & 0x01;
  }
}

maksim
Offline
Зарегистрирован: 12.02.2012
void ReadBit(unsigned int input_bit)
{
  for (char i = 15; i >= 0; i--)
  {
    read_bit_array[i] = (input_bit >> i) & 0x01;
  }
}

 

alexval2007
Offline
Зарегистрирован: 10.11.2012

спасибо максим но не помогло на выходе без изменений

vdk
Offline
Зарегистрирован: 14.04.2013

alexval2007 пишет:

но я думал что можно как то по шаманить со сдвигом по идее так правильней

например, так:

  for (i=0;i<16;i++)
  {
  read_bit_array[15-i] = (input_bit >> i) & 0x01;
  }

 

alexval2007
Offline
Зарегистрирован: 10.11.2012

Спасибо самое оно работает отлично

вот что мы имеемв итоге может кому пригодится

#define LED_1      2    // тестовый св. диод
#define LED_2      3    // тестовый св. диод
#define LED_3      4    // тестовый св. диод
#define LED_4      5    // тестовый св. диод
#define LED_5      6    // тестовый св. диод
#define LED_6      7    // тестовый св. диод
#define LED_7      8    // тестовый св. диод
#define LED_8      9    // тестовый св. диод
#define LED_9      10    // тестовый св. диод
#define LED_10      11    // тестовый св. диод
#define LED_11      12    // тестовый св. диод
#define LED_12      13    // тестовый св. диод
#define LED_13      14    // тестовый св. диод
#define LED_14      15    // тестовый св. диод
#define LED_15      16    // тестовый св. диод
#define LED_16      17    // тестовый св. диод
//*******************************************************************
void ReadBit(unsigned int input_bit);
unsigned int WriteBit();
unsigned int read_bit_array[16];  //Массив для хранения состояния бит переменной HEX to BYTE.
unsigned int write_bit_array[16]; //Массив для хранения состояния бит переменной BYTE to HEX.
unsigned int temp = 0;
//*******************************************************************
unsigned char button1 = 0;//Тестовые кнопки подключённые к Arduino.
unsigned char button2 = 0;
unsigned char button3 = 0;
unsigned char button4 = 0;
unsigned char button5 = 0;
unsigned char button6 = 0;
unsigned char button7 = 0;
unsigned char button8 = 0;
unsigned char button9 = 0;
unsigned char button10 = 0;
unsigned char button11 = 0;
unsigned char button12 = 0;
unsigned char button13 = 0;
unsigned char button14 = 0;
unsigned char button15 = 0;
unsigned char button16 = 0;
//*******************************************************************
unsigned char led1 = 0;//Тестовые светодиоды подключённые к Arduino.
unsigned char led2 = 0;
unsigned char led3 = 0;
unsigned char led4 = 0;
unsigned char led5 = 0;
unsigned char led6 = 0;
unsigned char led7 = 0;
unsigned char led8 = 0;
unsigned char led9 = 0;
unsigned char led10 = 0;
unsigned char led11 = 0;
unsigned char led12 = 0;
unsigned char led13 = 0;
unsigned char led14 = 0;
unsigned char led15 = 0;
unsigned char led16 = 0;
//**************************************************************
// Чтение битов из переменной.
void ReadBit(unsigned int input_bit)
{
        for (char i=0; i<16; i++)
    {
    read_bit_array[15-i] = (input_bit >> i) & 0x01;
    }
}
//**************************************************************
// Запись бит в переменную.
unsigned int WriteBit()
{
 unsigned int output_bit; // В эту переменную принемаем результат из масива битовый код
 unsigned char j = 0;

 for (j=0; j<16; j++)
 {
  output_bit = output_bit << 1;
  if (write_bit_array[j] == 1){output_bit = output_bit + 1;}
 }
 return output_bit;
}
//**************************************************************
void setup()
{
  pinMode(LED_1, OUTPUT);    // установка вых для св.диода
  pinMode(LED_2, OUTPUT);    // установка вых для св.диода
  pinMode(LED_3, OUTPUT);    // установка вых для св.диода  
  pinMode(LED_4, OUTPUT);    // установка вых для св.диода
  pinMode(LED_5, OUTPUT);    // установка вых для св.диода
  pinMode(LED_6, OUTPUT);    // установка вых для св.диода
  pinMode(LED_7, OUTPUT);    // установка вых для св.диода  
  pinMode(LED_8, OUTPUT);    // установка вых для св.диода
  pinMode(LED_9, OUTPUT);    // установка вых для св.диода
  pinMode(LED_10, OUTPUT);    // установка вых для св.диода
  pinMode(LED_11, OUTPUT);    // установка вых для св.диода  
  pinMode(LED_12, OUTPUT);    // установка вых для св.диода
  pinMode(LED_13, OUTPUT);    // установка вых для св.диода
  pinMode(LED_14, OUTPUT);    // установка вых для св.диода
  pinMode(LED_15, OUTPUT);    // установка вых для св.диода  
  pinMode(LED_16, OUTPUT);    // установка вых для св.диода
}
//**********************************************************
void loop()
{
//**********************************************************
button1 = 1;//имитация состояния кнопок
button2 = 0;
button3 = 0;
button4 = 0;
button5 = 1;
button6 = 1;
button7 = 0;
button8 = 1;
button9 = 1;
button10 = 0;
button11 = 1;
button12 = 1;
button13 = 1;
button14 = 1;
button15 = 1;
button16 = 0;
//*************************************************
//запись битов в регистр
write_bit_array[0] = button1;
write_bit_array[1] = button2;
write_bit_array[2] = button3;
write_bit_array[3] = button4;
write_bit_array[4] = button5;
write_bit_array[5] = button6;
write_bit_array[6] = button7;
write_bit_array[7] = button8;
write_bit_array[8] = button9;
write_bit_array[9] = button10;
write_bit_array[10] = button11;
write_bit_array[11] = button12;
write_bit_array[12] = button13;
write_bit_array[13] = button14;
write_bit_array[14] = button15;
write_bit_array[15] = button16;
//**********************************************************  
temp=WriteBit();
//temp = 65533;//0xfffd
ReadBit(temp);
//**********************************************************
led1 = read_bit_array[0];
led2 = read_bit_array[1];
led3 = read_bit_array[2];
led4 = read_bit_array[3];
led5 = read_bit_array[4];
led6 = read_bit_array[5];
led7 = read_bit_array[6];
led8 = read_bit_array[7];
led9 = read_bit_array[8];
led10 = read_bit_array[9];
led11 = read_bit_array[10];
led12 = read_bit_array[11];
led13 = read_bit_array[12];
led14 = read_bit_array[13];
led15 = read_bit_array[14];
led16 = read_bit_array[15];
//**********************************************************
digitalWrite(LED_1, led1);
digitalWrite(LED_2, led2);
digitalWrite(LED_3, led3);
digitalWrite(LED_4, led4);
digitalWrite(LED_5, led5);
digitalWrite(LED_6, led6);
digitalWrite(LED_7, led7);
digitalWrite(LED_8, led8);
digitalWrite(LED_9, led9);
digitalWrite(LED_10, led10);
digitalWrite(LED_11, led11);
digitalWrite(LED_12, led12);
digitalWrite(LED_13, led13);
digitalWrite(LED_14, led14);
digitalWrite(LED_15, led15);
digitalWrite(LED_16, led16);
}

maksim
Offline
Зарегистрирован: 12.02.2012

alexval2007 пишет:

спасибо максим но не помогло на выходе без изменений

alexval2007 пишет:

вот отправка

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

alexval2007
Offline
Зарегистрирован: 10.11.2012

ну вобщето отправляюкод неполный там еще должна быть работа с модбасом это для работыс регистрами

maksim
Offline
Зарегистрирован: 12.02.2012
#define LED_1	  2	// тестовый св. диод
#define LED_2	  3	// тестовый св. диод
#define LED_3	  4	// тестовый св. диод
#define LED_4	  5	// тестовый св. диод
#define LED_5	  6	// тестовый св. диод
#define LED_6	  7	// тестовый св. диод
#define LED_7	  8	// тестовый св. диод
#define LED_8	  9	// тестовый св. диод
#define LED_9	  10	// тестовый св. диод
#define LED_10	  11	// тестовый св. диод
#define LED_11	  12	// тестовый св. диод
#define LED_12	  13	// тестовый св. диод
#define LED_13	  14	// тестовый св. диод
#define LED_14	  15	// тестовый св. диод
#define LED_15	  16	// тестовый св. диод
#define LED_16	  17	// тестовый св. диод

unsigned char leds[] = {LED_1, LED_2, LED_3, LED_4, LED_5, LED_6, LED_7, LED_8, LED_9, LED_10, LED_11, LED_12, LED_13, LED_14, LED_15, LED_16};//Тестовые светодиоды.

//*******************************************************************

void setup() 
{
  for (byte i = 0; i < 16; i++) 
    pinMode(leds[i], OUTPUT); // установка вых для св.диода 	
}

void loop()
{
  unsigned int temp = 0;
  temp = 65533;//0xfffd ;
  for (byte i = 0; i < 16; i++) 
    digitalWrite(leds[15-i], (temp >> i) & 0x01);
}

 

alexval2007
Offline
Зарегистрирован: 10.11.2012

удобно, компактно, спасибо