Использование логических операторов tinyAVR

November 12, 2014 by admin Комментировать »

Все эти операторы являются двуместными, т. е. они работают с битами операндов и сохраняют результат в соответствующих битах указанной выходной переменной.

Битовый оператор NOT

Этот оператор инвертирует биты операнда. Это одноместный оператор:

Битовый оператор OR

Побитовый оператор or выполняет операцию логического ИЛИ с битами операндов. Например, предположим, что у нас есть два байта данных: а = obioioioio и ь = oboioioioi. Тогда выражение с=а|ь выполняет логическое ИЛИ по битам а и ь, а затем сохраняет результат в с. Результат будет равен оьишш.

Мы уже обсудили проблему при выставлении контакта 3 порта PORTB в логическую 1 (не затрагивая значения контакта 1 того же самого порта). Решить эту проблему можно при помощи побитового ИЛИ:

PORTB = PORTB| ОЬООООЮОО;

Как видно, выполняется логическая операция ИЛИ по содержимому PORTB и числу с единицей в третьем бите. Мы знаем, что если какой-то из операндов оператора or равен 1, то результат будет равен 1 (независимо от второго операнда). Поэтому данная операция выставляет третий бит порта PORTB в 1. Но что будет с остальными битами? Остальные биты порта PORTB будут подвергнуты побитовому or с нулями, а при этом результат всегда равен второму операнду. Следовательно, мы добились желаемого. Этот оператор можно записать кратко:

PORTB |= ОЬООООЮОО;

Побитовый оператор AND

Побитовый AND выполняет логическую операцию И с битами операндов. Предположим, что у нас как и в предыдущем примере есть два байта данных а = оьюююю и ь = оьою ίο ιοί. Тогда выражение с=а&ь выполняет логическое И по битам а и ь, а затем сохраняет результат в с. Результат равен оьоооооооо.

Мы обсудили, как установить отдельные биты в 1 при помощи операции or. Аналогично биты можно устанавливать в 0 при помощи оператора and:

PORTB = PORTB&- (ОЬООООЮОО);

Оператор ~ дает обратный побитовый код, поэтому эквивалентным оператором будет:

PORTB = PORTB& ( ОМ 1110111) ;

Выполняется логическая операция И по содержимому порта PORTB и числу с нулем в третьем бите. Мы знаем, что если любой из операндов оператора and равен 0, то результат тоже будет равен 0 (независимо от второго операнда). Эта операция выставляет третий бит порта PORTB в 0. А что же будет с остальными битами? Остальные биты PORTB подверглись операции and с единицами, а если один из операндов операции and равен 1, то результат равен второму операнду. Следовательно, мы получили решение и для этой проблемы.

Побитовый оператор XOR

Побитовый xor (исключающее ИЛИ) выполняет логическую операцию xor по битам двух операндов. Как и в предыдущих случаях предположим, что у нас есть два байта данных а = obioioioii и ь = oboioioioi. Тогда выражение с=аль выполняет логическое xor по битам а и ь, а затем сохраняет результат в с. Значение с после этого будет равно оьшшю.

При программировании контроллеров AVR оператор xor используется для переключения битов порта без проверки условий в операторе if-else. Если один из операндов этого оператора равен 1, то в результате получается обратный код второго операнда; а если один из операндов равен 0, то результат равен второму операнду. Поэтому контакт 4 порта PORTC можно переключить следующим образом:

Использование операторов сдвига вправо и влево

Эти операторы сдвигают содержимое двоичной переменной влево или вправо на указанное число битов.

Предположим, что начальное содержимое переменной а показано в следующей таблице:

Бит 7

Бит 6

Бит 5

Бит 4

Бит 3

Бит 2

Бит 1

БитО

1

1

1

1

0

1

1

1

Мы выполняем операцию сдвига влево на четыре бита:

а = а<<4;

После операции содержимое а будет таким, как показано в следующей таблице:

Бит 7

Битв

Бит 5

Бит 4

Бит 3

Бит 2

Бит 1

БитО

0

1

1

1

0

0

0

0

Вы видите, что содержимое переменной а было сдвинуто влево на 4 бита и четырем младшим битам были присвоены нули.

Давайте рассмотрим другой пример:

Ь = 1«2;

Этот оператор говорит компилятору о том, что нужно сдвинуть содержимое единицы влево на 2 бита. Первоначально единица представляется так, как показано в следующей таблице:

Бит 7

Бит 6

Бит 5

Бит 4

Бит 3

Бит 2

Бит 1

БитО

0

0

0

0

0

0

0

1

После операции содержимое переменной ь будет таким:.

Бит 7

Бит 6

Бит 5

Бит 4

Бит 3

Бит 2

Бит 1

БитО

0

0

0

0

0

1

0

0

Второй бит переменной ь стал равен 1. Это стандартный способ манипуляции отдельными битами. Применение побитового xor к любому порту и переменной ь (с последующим сохранением результата обратно в порт) установит второй бит в 1 и не повлияет на другие биты (как это уже было разъяснено ранее). Например, рассмотрим следующие операторы для объявления седьмого бита порта PORTD как выходного:

DDRD | = 1«7 ;

Все биты регистров ввода/вывода контроллеров AVR имеют имена, которые можно найти в спецификации контроллера. Эти имена затем транслируются компилятором WinAVR в макросы. Например, контакты регистра PORTD имеют имена от PD7 до PD0 и объявляются в компиляторе так:

#define PD7 7 and others alike

Таким образом, следующая строка кода также устанавливает третий бит порта PORTB в единицу:

PORTB |= 1«РВЗ;

Изучив этот материал, вы сможете понять все коды проекта 1 из главы 1.

Источник: Гадре, Д., Занимательные проекты на базе микроконтроллеров tinyAVR / Дхананья Гадре, Нигул Мэлхотра: Пер. с англ. — СПб.: БХВ-Петербург, 2012. — 352 с.: ил. — (Электроника)

Оставить комментарий

микросхемы мощности Устройство импульсов питания пример приемника провода витков генератора выходе напряжение напряжения нагрузки радоэлектроника работы сигнал сигнала сигналов управления сопротивление усилитель усилителя усиления устройства схема теория транзистора транзисторов частоты