реклама на сайте
подробности

 
 
> Как записать биты в массив
Xenom0rph
сообщение Jan 30 2009, 15:59
Сообщение #1


Частый гость
**

Группа: Новичок
Сообщений: 85
Регистрация: 2-10-08
Пользователь №: 40 646



на МК приходят биты, мне их надо записать в массив, так как их достаточно много, не очень удобно, писать один бит в массив как байт, а сделано так, вот хочу переделать но никогда не работал с битами. И не знаю как их правильно туда помещать.
Задача такая на МК пришел поток 0 и 1. Допустим 1010011010101011, сейчас это занимает 16 байт, но ведь как то можно это в 2 байта уложить, вопрос как? Ну и потом это надо вывести по USART на ПК иопять получить 1010011010101011, но уже как 16 байт!
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 5)
Stanislav_S
сообщение Jan 30 2009, 17:25
Сообщение #2


извечный пессимист
*****

Группа: Свой
Сообщений: 1 113
Регистрация: 9-10-06
Из: Днепропетровск
Пользователь №: 21 125



Цитата(Xenom0rph @ Jan 30 2009, 20:59) *
на МК приходят биты, мне их надо записать в массив, так как их достаточно много, не очень удобно, писать один бит в массив как байт, а сделано так, вот хочу переделать но никогда не работал с битами. И не знаю как их правильно туда помещать.
Задача такая на МК пришел поток 0 и 1. Допустим 1010011010101011, сейчас это занимает 16 байт, но ведь как то можно это в 2 байта уложить, вопрос как? Ну и потом это надо вывести по USART на ПК иопять получить 1010011010101011, но уже как 16 байт!

Ну например можно так с помощью битового поля, так упаковывается один байт:
Код
union input_data
{
  unsigned char data;
  struct
  {
    unsigned char in0:1;
    unsigned char in1:1;
    unsigned char in2:1;
    unsigned char in3:1;
    unsigned char in4:1;
    unsigned char in5:1;
    unsigned char in6:1;
    unsigned char in7:1;
  }byte;
};


--------------------
Slaves are those of this world
Given freedom to lay chains upon The Master
The wolf is no longer free
Release the chains and come for me
Go to the top of the page
 
+Quote Post
Xenom0rph
сообщение Jan 30 2009, 17:59
Сообщение #3


Частый гость
**

Группа: Новичок
Сообщений: 85
Регистрация: 2-10-08
Пользователь №: 40 646



rolleyes.gif а как этим пользоваться?
Go to the top of the page
 
+Quote Post
ARV
сообщение Jan 30 2009, 18:08
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581



и как к этому битовому полю обращаться, чтоб удобно было? это явно не то!

может, вот так лучше:
Код
unsigned char buf[2];

// макросы для работы с битом номер х
#define set_bit(x) (buf[x/8] | (1<<(x % 8))
#define clr_bit(x) (buf[x/8] & ~(1<<(x % 8))
#define get_bit(x) (buf[x/8] & (1<<(x % 8))
когда надо в массив записать 1, используем set_bit(), когда нолик - clr_bit(), а когда надо проверить, что там в массиве, то используем get_bit()
Код
// вывод битов из массива
for(i=0; i<16; i++)
   if(get_bit(i))
      printf("1");
   else
      printf("0");


--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post
OLEG_BOS
сообщение Jan 30 2009, 18:09
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 386
Регистрация: 1-12-05
Пользователь №: 11 639



Цитата(Xenom0rph @ Jan 30 2009, 18:59) *
на МК приходят биты, мне их надо записать в массив, так как их достаточно много, не очень удобно, писать один бит в массив как байт..

"..писать один бит в массив как байт.." не то что "..не очень удобно", а и слишком расходно, особенно для МК biggrin.gif
Понятное дело, что нужно сначала побитно принять данные, потом упаковать в нужный формат числа и лишь потом записывать полученное число в массив.
Вот Вам для примера ( пример для 8- битного АVR)один из вариантов побитного чтения 16-ти битных ( 2 байта ) последовательных данных с порта МК . При необходимости можно без труда переделать с другую произвольную длину..
Код
/*
*****************************************************************************
*                Чтение последовательных 16-ти битных данных  с входа DAT_IN
* Чтение данных происходит по переднему фронту сигнала CLK
*****************************************************************************
*/
#define PIN_DAT_IN              PINB
#define MASK_PIN_DAT_IN    0x10
.......
int ReadData (void)
{
    int data = 0;
    unsigned char temp;

    for (unsigned char i = 0; i < 16; i++)
    {
        Clk_set(0);                        /*   */
        
        temp = PIN_DAT_IN;                    /* Читаем  состояние входов  порта контроллера */
                                    /* По маске выделяем вход с которого читаем данные  */
        if (temp & MASK_PIN_DAT_IN)
        {
            data |= 0x01;                    /* Если на входе  "1" */
        }
        data <<= 1;                        /* Сдвигаем данные для приема следующего бита */                    
        Clk_set(1);                        /*  */
    }

    return(data);
}


Обратное преобразование на компе противоположное упаковке:
В цыкле с последующим сдвигом по маске выделяем бит( начиная со старшего значащего или младшего бита - завистит от того куда делаем сдвиг и по какому биту выставленна маска), который хотим отобразить на экране. Если в нужном бите "1" значит печатаем на экране "1", если "0" - значит печатаем "0" rolleyes.gif
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Jan 31 2009, 09:49
Сообщение #6


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(ARV @ Jan 30 2009, 21:08) *
и как к этому битовому полю обращаться, чтоб удобно было? это явно не то!
А в чём проблема? В структуре есть поля битовые или нет - это без разницы. Обращаться напрямую очень просто и очень удобно.
Код
struct_name.field_name1 = 1;
struct_name.field_name2 = 0;
Единственное ограничение - нельзя сделать массив из бит.
Поэтому работать в цикле с битовыми полями действительно невозможно.
Для упаковки бит в байты хороший вариант OLEG_BOS продемонстрировал.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 13:58
Рейтинг@Mail.ru


Страница сгенерированна за 0.01401 секунд с 7
ELECTRONIX ©2004-2016