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

 
 
 
Reply to this topicStart new topic
> Битовая арифметика на си, Да блин на ассемблере с битами проще было
Чип-Хрум
сообщение Apr 11 2007, 13:37
Сообщение #1


Участник
*

Группа: Новичок
Сообщений: 33
Регистрация: 1-04-07
Пользователь №: 26 675



Помогите разобраться , я понимаю как воспользоваться этими сторочками но я их
сам не понимаю , короче нужен сансей каторый смог их правильно расшифровать,
или разжевать.
#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_й ноги опишите кто силен.
Нужно что-то универсальное для передачи бита из переменной в порт и назад.

Распишите комментарий как можно подробнее.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Apr 11 2007, 13:42
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



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

Почитайте соответствующую главу в любой книжке имеющей отношение к языку "C". Можно по диагонали и без подробностей.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
rezident
сообщение Apr 11 2007, 13:47
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Керниган и Ричи, "Язык С", раздел 4.11.2. Макроподстановка
http://lib.ru/CTOTOR/kernigan.txt
Go to the top of the page
 
+Quote Post
_Bill
сообщение Apr 11 2007, 14:16
Сообщение #4


Местный
***

Группа: Участник
Сообщений: 416
Регистрация: 18-04-06
Из: Челябинск
Пользователь №: 16 219



Цитата(Чип-Хрум @ 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
Go to the top of the page
 
+Quote Post
v_shamaev
сообщение Apr 11 2007, 15:00
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 304
Регистрация: 5-07-04
Из: г. Москва
Пользователь №: 259



Цитата(Чип-Хрум @ 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, а там с карандашом разберете по регистрам.


--------------------
Водку пьянствовать и безобразия нарушать!!!
Go to the top of the page
 
+Quote Post
Чип-Хрум
сообщение Apr 11 2007, 16:42
Сообщение #6


Участник
*

Группа: Новичок
Сообщений: 33
Регистрация: 1-04-07
Пользователь №: 26 675



Ув. Народ данного сайта я не просил тыркать в меня книшками я их на предмет битовой арифметики
перелистал в доль и поперек , пример программы таков есть 0 бит в переменной char его нужно перенести в порт B на 5 ногу как это сделать ?
Слабонервных прошу не отвечать !
Go to the top of the page
 
+Quote Post
rumit2000
сообщение Apr 11 2007, 16:56
Сообщение #7


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

Группа: Свой
Сообщений: 175
Регистрация: 16-03-07
Из: Москва
Пользователь №: 26 228



Цитата(Чип-Хрум @ 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);
}

если совсем по простому


--------------------
Быстро, Дёшево, Качественно-выбери любые 2 пункта
Go to the top of the page
 
+Quote Post
afad
сообщение Apr 11 2007, 17:52
Сообщение #8


Местный
***

Группа: Свой
Сообщений: 212
Регистрация: 26-08-04
Пользователь №: 545



Можно и так.
вначале 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);}

По моему вполне наглядно.
Go to the top of the page
 
+Quote Post
SpyBot
сообщение Apr 11 2007, 18:32
Сообщение #9


Местный
***

Группа: Свой
Сообщений: 285
Регистрация: 5-11-05
Пользователь №: 10 491



Попытайсо глянуть сюда
http://www.chip-news.ru/archive/chipnews/200010/15.html
Go to the top of the page
 
+Quote Post
InvisibleFed
сообщение Apr 12 2007, 02:28
Сообщение #10


Местный
***

Группа: Свой
Сообщений: 401
Регистрация: 18-11-06
Из: Хабаровск
Пользователь №: 22 469



"|" - или
"&" - и
"~" - не

все просто если ты знаком с битовой арифметикой, то что тебе еще не понятно? Синтаксис С? опять-же, по книжке быстрее.
Go to the top of the page
 
+Quote Post
Axxel
сообщение Apr 12 2007, 05:19
Сообщение #11


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

Группа: Новичок
Сообщений: 140
Регистрация: 31-01-07
Из: Челябинск
Пользователь №: 24 896



Первая ваша строчка:

#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

Сообщение отредактировал Axxel - Apr 12 2007, 05:47


--------------------
Если боишься - не говори. если сказал - не бойся. ©
Go to the top of the page
 
+Quote Post
aforestman
сообщение Apr 12 2007, 09:03
Сообщение #12


Участник
*

Группа: Свой
Сообщений: 63
Регистрация: 3-05-05
Пользователь №: 4 696



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;
Go to the top of the page
 
+Quote Post
Herz
сообщение Apr 12 2007, 09:48
Сообщение #13


Гуру
******

Группа: Модераторы
Сообщений: 10 983
Регистрация: 23-11-05
Пользователь №: 11 287



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

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

Сообщение отредактировал Herz - Apr 12 2007, 09:50
Go to the top of the page
 
+Quote Post
Axxel
сообщение Apr 12 2007, 10:00
Сообщение #14


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

Группа: Новичок
Сообщений: 140
Регистрация: 31-01-07
Из: Челябинск
Пользователь №: 24 896



Да, кстати по-моему должен подойти
общеизвестный курс, как раз битовые операции
там хорошо разъяснены.

Да простят меня модераторы smile.gif


--------------------
Если боишься - не говори. если сказал - не бойся. ©
Go to the top of the page
 
+Quote Post
Чип-Хрум
сообщение Apr 12 2007, 13:56
Сообщение #15


Участник
*

Группа: Новичок
Сообщений: 33
Регистрация: 1-04-07
Пользователь №: 26 675



Спасибо что подсказали теперь понятно все стало !!!
Go to the top of the page
 
+Quote Post

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

 


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


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