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

 
 
> Как записать биты в массив
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
Ответов
OLEG_BOS
сообщение Jan 30 2009, 18:09
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 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



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

 


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


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