Обозначения, хитрости на языке си

Здесь все вопросы по языку программирования С
cas2010
Сообщения: 3
Зарегистрирован: 15 апр 2013, 20:25

Обозначения, хитрости на языке си

Сообщение cas2010 » 15 апр 2013, 20:31

Добрый день всем хотелось бы обсуждать и прикреплять хитрости и разные обозначения в программировании на языке СИ с коментариями...
1) Вот допустим я до сих пор не пойму что это означает "<<" или ">>"
вот допустим в этой строке TIMSK = (1 << TOIE0); что же это означает?
2) ir.rx_buffer <<= 1; здесь не понятно что "<<=" это?
3)if(delta > IrPulseThershold) ir.rx_buffer |= 1; здесь непонятно "|=" это что?
4) DDRD &= ~(1<<PIND6); здесь мне не понятно "&=~" что это?
5) TCCR1A=(0<<COM1A1)|(0<<COM1A0)|(0<<WGM11)|(0<<WGM10); здесь меж скобками "|" что это?

вот подобные вопросы продолжаем...

Аватара пользователя
gurvinok
Сообщения: 1473
Зарегистрирован: 02 мар 2013, 09:18
Откуда: Москва

Re: Обозначения, хитрости на языке си

Сообщение gurvinok » 15 апр 2013, 21:39

Это обычные логические операторы.

Код: Выделить всё

x = y << 1; // Означает это то что в переменную х мы кладем значение у и при этом сдвинутое на 1 бит влево.
То есть если у = 0b00000001, то у << 1 будет 0b00000010 Если записать у << 5 то будет 0b00010000. Просто бит сдвинули на 5 разрядов влево. Знак >> тоже самое но вправо. За сдвинутым битом все разряды заполняются нулями.

Код: Выделить всё

x ~= x; // Тильда - это побитовое отрицание 
Если х = 0b01010101, то ~x = 0b10101010

Код: Выделить всё

x |= y // Это побитовое сложение
Чаще всего используют для наложении маски. Пример.
х = 0b00001111 требуется изменить 7-й и 5-й биты на 1. Пишем х |= y при y = 0b10100000 получаем 0b10101111
То есть мы как бы логически складываем каждый бит с битом одного разряда и если хоть в одном была единица, то на выходе будет тоже единица.

Код: Выделить всё

x &= y // это побитовое логическое умножение
если х = 0b00000110 и делаем так x &= y при у = 0b00000010 то получаем 0b00000010. Единица будет в том разряде, в котором у обеих переменных в одном разряде две 1

Обобщаю

Код: Выделить всё

|| - Побайтное ИЛИ
&& - Побайтное И
! - Побайтное НЕ
~ - Побитная инверсия
| - Побитное ИЛИ
& - Побитное И
>> - Сдвиг вправо
<< - Сдвиг влево
Ну как-то так. Если не понятно, задавай вопросы будем разбираться.
Если долго мучиться, может быть получится.

cas2010
Сообщения: 3
Зарегистрирован: 15 апр 2013, 20:25

Re: Обозначения, хитрости на языке си

Сообщение cas2010 » 16 апр 2013, 05:28

Большое спасибо... если не трудно выкладывайте еще подобные хитрости и обозначения... будет интересно... извените что я чайник...

Аватара пользователя
gurvinok
Сообщения: 1473
Зарегистрирован: 02 мар 2013, 09:18
Откуда: Москва

Re: Обозначения, хитрости на языке си

Сообщение gurvinok » 16 апр 2013, 06:49

Нет проблем. Здесь можно быть и чайником и кипятильником. Можно задавать любые вопросы. Мы все такими были. ;)
Если долго мучиться, может быть получится.

ученик
Сообщения: 12
Зарегистрирован: 27 дек 2014, 14:52

Re: Обозначения, хитрости на языке си

Сообщение ученик » 27 дек 2014, 15:01

У меня тоже вопрос unsigned int time_val @10 , это переменная беззнаковая , @10 - это как расшифровать?
Что означает @.

Аватара пользователя
gurvinok
Сообщения: 1473
Зарегистрирован: 02 мар 2013, 09:18
Откуда: Москва

Re: Обозначения, хитрости на языке си

Сообщение gurvinok » 27 дек 2014, 22:14

Если для AVR то обращение к ячейке памяти. Точнее переменная time_val будет храниться в ОЗУ по адресу 10. Дайте весь код и все станет ясно.
Если долго мучиться, может быть получится.

ученик
Сообщения: 12
Зарегистрирован: 27 дек 2014, 14:52

Re: Обозначения, хитрости на языке си

Сообщение ученик » 29 дек 2014, 17:16

unsigned int time_val @10;
/* число сколько раз надо отсчитать по 0,2 сек. ???

А @ - означает адрес ?

Двух байтовая переменная time_val

Младший байт числа будет в регистре 10 а старший в регистре 11 и при отладке можно будет увидеть состояние SW1 SW2 */

Это из обучающего урока(http://www.123avr.com/z3.htm)
просто не пойму как получилось 0,2 секунды.

Аватара пользователя
gurvinok
Сообщения: 1473
Зарегистрирован: 02 мар 2013, 09:18
Откуда: Москва

Re: Обозначения, хитрости на языке си

Сообщение gurvinok » 29 дек 2014, 23:22

Ответ на первый вопрос.
unsigned int time_val @10; означает, создать переменную беззнаковую, двубайтовую по адресу в ОЗУ 10. То есть по адресу 10 будет лежать старший байт, а по адресу 11 младший.
Пример: 0b1111111100000000 кладем в ОЗУ по адресу 10. В 10 адрес запишется 0b11111111, а в 11 0b00000000
Если в хексе то будет так 0xFF00, в 10 0xFF, а в 11 0x00.
В итоге: знак @ - это указатель на конкретный адрес ОЗУ. Так как 10 и 11 адрес попадают в регистровую память, соответственно старший байт окажется в регистре 10, а младший в регистре 11

Ответ на второй вопрос.
Там написан бред. Как можно создать таймер на функции delay_ms(); Бросьте эту ерунду и вооружитесь даташитом на МК и скачайте на Атмеле AtmelStudio 6. Далее начните разбираться с портов ввода/вывода. Что такое DDRx, PORTx, PINx. А уже потом таймеры и все прочее. Если будут вопросы и непонятки, пишите разъясню.
Если долго мучиться, может быть получится.

ученик
Сообщения: 12
Зарегистрирован: 27 дек 2014, 14:52

Re: Обозначения, хитрости на языке си

Сообщение ученик » 31 дек 2014, 18:46

Studio есть даташиты нашел, учусь дальше, благодарю за помощь буду обращаться.

Аватара пользователя
gurvinok
Сообщения: 1473
Зарегистрирован: 02 мар 2013, 09:18
Откуда: Москва

Re: Обозначения, хитрости на языке си

Сообщение gurvinok » 31 дек 2014, 19:08

Нет проблем. Я здесь всегда. С Новым Годом!
Если долго мучиться, может быть получится.

Ответить