Цитата(Xenom0rph @ Jan 30 2009, 18:59)

на МК приходят биты, мне их надо записать в массив, так как их достаточно много, не очень удобно, писать один бит в массив как байт..
"..писать один бит в массив как байт.." не то что "..не очень удобно", а и слишком расходно, особенно для МК
Понятное дело, что нужно сначала побитно принять данные, потом упаковать в нужный формат числа и лишь потом записывать полученное число в массив.
Вот Вам для примера ( пример для 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"