Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Простой вопрос по языку C
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Все остальные микроконтроллеры > PIC
Igor3
Занимаюсь модификацией имеющегося исходника на PICС(HI-TECH) под другую периферийную микросхему, управляемую PIC-ом по последовательному трёхпроводному порту. Эта другая периферийная микросхема имеет другую, более сложную организацию адресного пространства контрольных регистров.
В оригинале все 10 bit целой, unsigned переменной загружаются PIC-ом разом в один регистр периферийной микросхемы. А мне нужно эту переменную разбить на три части и загрузить в разные банки, кусками по 2 bit, 4 bit, 4 bit. Как загрузить мне понятно, а как выдернуть из переменной отдельные биты не знаю.
Т.к. программированием никогда не занимался и только вчера скачал книгу Карнигана 07.gif , прошу подсказки в виде пары-тройки строк примера. Надеюсь понятно объяснил свою проблему. 05.gif
Помогите, пожалуйста. Заранее спасибо! beer.gif
spf
Цитата(Igor3 @ May 31 2007, 15:17) *
В оригинале все 10 bit целой, unsigned переменной загружаются PIC-ом разом в один регистр периферийной микросхемы. А мне нужно эту переменную разбить на три части и загрузить в разные банки, кусками по 2 bit, 4 bit, 4 bit. Как загрузить мне понятно, а как выдернуть из переменной отдельные биты не знаю.

Если нужные биты идут попорядку, то достаточно воспользоваться сдвигом и маскированием
Код
int test; // исходный, порядок расположения секций в нем  2-4-4
int test4_1; // первая секция из 4 бит
int test4_2; // вторая секция из 4 бит
int test2_1; // секция из 2 бит

test4_1 = test & 0x0f; // маскировать лишнее
test4_2 = (test >>4) & 0x0f; // сдвинуть на  4 бита и маскировать лишнее
test2_1 = (test >>8) & 0x03; // сдвинуть на  8 бит и маскировать лишнее
Сергей Борщ
Цитата(spf @ May 31 2007, 12:46) *
Код
int test4-1;
Только замените "-"на "_".
spf
Цитата(Сергей Борщ @ Jun 1 2007, 12:42) *
Только замените "-"на "_".

Успел поправить.
Igor3
Огромное спасибо! beer.gif
Я думал в правильном направлении, но меня поставила в тупик опечатка в файле книги по С в примере на использование маскирования, да и в "орфографии" языка С я не уверен, что я бы сам не заблудился smile.gif
zltigo
Цитата(spf @ May 31 2007, 12:46) *
Если нужные биты идут попорядку, то достаточно воспользоваться сдвигом и маскированием

Слишком "в лоб". Элегантнее union.
Код
typedef union mbit {
    unsigned short full;
    struct {
    unsigned short first:4;        
    unsigned short second:4;
    unsigned short tree:2;
    unsigned short dummy:6;
            } parts;
}mbit_u;
spf
Цитата(zltigo @ Jun 1 2007, 23:36) *
Слишком "в лоб". Элегантнее union.

Это понятно, НО я не знаю как с этим справится PICС.
Поэтому и предложил самый простой и наглядный вариант.

А в последнем варианте можно и без думмей wink.gif
Код
    struct {
        unsigned short first:4;        
        unsigned short second:4;
        unsigned short tree:2;
        unsigned short :6;               // неиспользуемые биты нет необходимости именовать
            } parts;
zltigo
Цитата(spf @ Jun 2 2007, 05:14) *
Это понятно, НО я не знаю как с этим справится PICС.

А почему он должен не справиться? Общие указания на то, что компилятору делать, как правило, предпочтильнее, нежели конкретные - типа бери и сдвигай. В этом случае у компилятора остается больше простора для более глобальной оптимизации. Едиинственно, что, пожалуй, для 8bit платформ более проедпочтительным будет указание паковки битовых полей в unsigned char а не short.
Цитата
Поэтому и предложил самый простой и наглядный вариант.

Насчет простоты использования и наглядности предложенного варианта у меня другое мнение smile.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.