Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Битовая арифметика на си
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему
Чип-Хрум
Помогите разобраться , я понимаю как воспользоваться этими сторочками но я их
сам не понимаю , короче нужен сансей каторый смог их правильно расшифровать,
или разжевать.
#define bitset(var,bitno) ((var) |= 1 << (bitno))
#define bitclr(var,bitno) ((var) &= ~(1 << (bitno)))

#define set_cs() (PORTB |= (1 << PB4))
#define clr_cs() (PORTB &= ~(1 << PB4))

#define get_miso() ((PINB & (1 << PB6)) ? 1 : 0)
И еще нужно из переменной типа char вывести нулевой бит
в порт В 5_й ноги опишите кто силен.
Нужно что-то универсальное для передачи бита из переменной в порт и назад.

Распишите комментарий как можно подробнее.
zltigo
Цитата(Чип-Хрум @ Apr 11 2007, 12:37) *
Распишите комментарий как можно подробнее.

Почитайте соответствующую главу в любой книжке имеющей отношение к языку "C". Можно по диагонали и без подробностей.
rezident
Керниган и Ричи, "Язык С", раздел 4.11.2. Макроподстановка
http://lib.ru/CTOTOR/kernigan.txt
_Bill
Цитата(Чип-Хрум @ Apr 11 2007, 13:37) *
Помогите разобраться , я понимаю как воспользоваться этими сторочками но я их
сам не понимаю , короче нужен сансей каторый смог их правильно расшифровать,
или разжевать.
#define bitset(var,bitno) ((var) |= 1 << (bitno))
#define bitclr(var,bitno) ((var) &= ~(1 << (bitno)))

#define set_cs() (PORTB |= (1 << PB4))
#define clr_cs() (PORTB &= ~(1 << PB4))

#define get_miso() ((PINB & (1 << PB6)) ? 1 : 0)
И еще нужно из переменной типа char вывести нулевой бит
в порт В 5_й ноги опишите кто силен.
Нужно что-то универсальное для передачи бита из переменной в порт и назад.

Распишите комментарий как можно подробнее.

А какие тут комментарии???
Код
    if (var & (1<<0))
           PORTB |= (1<<5);   // Set bit 5
    else
          PORTB &= ~(1<<5); // Clear bit 5
v_shamaev
Цитата(Чип-Хрум @ Apr 11 2007, 14:37) *
Помогите разобраться , я понимаю как воспользоваться этими сторочками но я их
сам не понимаю , короче нужен сансей каторый смог их правильно расшифровать,
или разжевать.
#define bitset(var,bitno) ((var) |= 1 << (bitno))

Установить бит bitno в переменной var

Цитата(Чип-Хрум @ Apr 11 2007, 14:37) *
#define bitclr(var,bitno) ((var) &= ~(1 << (bitno)))


Сбросить бит bitno в переменной var

Цитата(Чип-Хрум @ Apr 11 2007, 14:37) *
#define set_cs() (PORTB |= (1 << PB4))
#define clr_cs() (PORTB &= ~(1 << PB4))

Аналогично, в порту PORTB установить или сбросить бит PB4.

Откомпилируйте в ASM, а там с карандашом разберете по регистрам.
Чип-Хрум
Ув. Народ данного сайта я не просил тыркать в меня книшками я их на предмет битовой арифметики
перелистал в доль и поперек , пример программы таков есть 0 бит в переменной char его нужно перенести в порт B на 5 ногу как это сделать ?
Слабонервных прошу не отвечать !
rumit2000
Цитата(Чип-Хрум @ Apr 11 2007, 17:42) *
.... 0 бит в переменной char его нужно перенести в порт B на 5 ногу как это сделать ?....


#define NBit 0
char testA;

if (testA && (1<<NBit))
{
PORTB |= (1<<PB5);
}
else
{
PORTB &= ~(1<<PB5);
}

если совсем по простому
afad
Можно и так.
вначале 1 раз на всю программу запишем:
#define clr(a,c) (a &=~(1<<c)) //Сбросить бит
#define set(a,c) (a |= (1<<c)) //Установить бит
#define tst(a,c) (a & (1<<c)) //Проверить бит

Требуемое Вам действие запишется так (переменную типа char обзовем Var):

if(tst(Var,0)==0){clr(PORTB,5);}else{set(PORTB,5);}

По моему вполне наглядно.
SpyBot
Попытайсо глянуть сюда
http://www.chip-news.ru/archive/chipnews/200010/15.html
InvisibleFed
"|" - или
"&" - и
"~" - не

все просто если ты знаком с битовой арифметикой, то что тебе еще не понятно? Синтаксис С? опять-же, по книжке быстрее.
Axxel
Первая ваша строчка:

#define bitset(var,bitno) ((var) |= 1 << (bitno))

Ну, define ,уверен что знаете как работает.

((var) |= 1 << (bitno)) то же что var=var|(1<<bitno);

все конструкции типа:
|=
&=
^=
+=
-=
и.т.д

означают следующее:
a|=b означает a=a|b;
a&=b означает a=a&b; и.т.д

(1<<bitno) bitno-заданная вами переменная

т.е как бы получается что в числе 0
в двоичном 0000 0000
вы сдвигаете еденицу на bitno,
к примеру bitno=3;

результатом (1<<3)
будет 0000 1000 или число 8
счет начинается с 0
т.е (1<<0) будет равняться 0000 0001(единица)
(1<<7) соответственно 1000 0000 (128)


Последняя строчка:
#define get_miso() ((PINB & (1 << PB6)) ? 1 : 0)

(PINB&(1<<PB6))-выражение
? результат выражения истинный-подставляем 1
: результат ложный подставляем 0

ну а потом в теле программы что-то типа:

if(get_miso()){some actions...}
else{other actions...}





вроде бы все smile.gif
aforestman
Renesas предлагает менее мозгокрутный доступ к битам регистра

Код
/********************************************************
*   declare SFR bit                                     *
********************************************************/
struct bit_def {
        char    b0:1;
        char    b1:1;
        char    b2:1;
        char    b3:1;
        char    b4:1;
        char    b5:1;
        char    b6:1;
        char    b7:1;
};
union byte_def{
    struct bit_def bit;
    char    byte;
};

/*------------------------------------------------------
    Processor mode register 0
------------------------------------------------------*/
union byte_def pm0_addr;
#define     pm0     pm0_addr.byte

#define     pm03        pm0_addr.bit.b3     /* Software reset bit */


А далее в программе

pm03 = 1;

if (pm03) {};

или

pm0 = 0x04;
Herz
Цитата(aforestman @ Apr 12 2007, 08:03) *
Renesas предлагает менее мозгокрутный доступ к битам регистра

Менее?! Человеку с элементарными логическими операциями терпения не хватает разобраться, а Вы ему структуры и объединения подсовываете... smile.gif
Axxel
Да, кстати по-моему должен подойти
общеизвестный курс, как раз битовые операции
там хорошо разъяснены.

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