Разбор переменной на биты
- Войдите на сайт для отправки комментариев
Сб, 27/09/2014 - 16:35
Добрый день товарищи. Возникла необходимость разобрать переменную размером в два байта на биты и этими битами чтото делать допустим зажигать светодиоды как в моём примере. Написал код работает но есть небольшая проблема решил оформить функцией и неполучается код нгеработает в чем ошибка.
#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); }
А занулять-то входную переменную нафига?
спасибо глаз замылился неувидел очевидного. Как думаете код можно улучшить?
Можно, но заниматься мне этим лень
ну тогда вопросик при отправке числа 65533 тоесть бинарное 0b1111111111111101 получаю 0b1011111111111111 тоесть наоборот что нужно изменить чтобы получить то что и на входе а не наоборот
А где там отправка числа? Не вижу
Если светодиоды горят в "обратном порядке", тогда и формировать их список надо в обратном порядке
(типа
led16 = read_bit_array[0];
)вот отправка
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;
}
}
спасибо максим но не помогло на выходе без изменений
но я думал что можно как то по шаманить со сдвигом по идее так правильней
например, так:
Спасибо самое оно работает отлично
вот что мы имеемв итоге может кому пригодится
#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);
}
спасибо максим но не помогло на выходе без изменений
вот отправка
Не заметил, что никуда и ничего вы не отправляете, а просто заполняете массив.
ну вобщето отправляюкод неполный там еще должна быть работа с модбасом это для работыс регистрами
удобно, компактно, спасибо