Табл 5. Команд битовых операций
Команда |
Описание |
Действие |
Циклы |
Код операции |
Флаги |
ATtiny |
ATmega |
sbi P,b |
Set Bit in I/O Rerister |
I/O(P,b)←1 |
2 |
1001 1010 PPPP Pbbb |
None |
+ |
+ |
cbi P,b |
Clear Bit in I/O |
I/O(P,b)←0 |
2 |
1001 1000 PPPP Pbbb |
None |
+ |
+ |
lsl Rd |
Logical Shift Left |
Rd(n+1)←Rd(n), Rd(0)←0 |
1 |
0000 11dd dddd dddd |
Z,C, |
+ |
+ |
lsr Rd |
Logical Shift Right |
Rd(n)←Rd(n+1), Rd(7)←0 |
1 |
1001 010d dddd 0110 |
Z,C, |
+ |
+ |
rol Rd |
Rotate Left through Carry |
Rd(0)←C, Rd(n+1)←Rd(n), C←Rd(7) |
1 |
0001 11dd dddd dddd |
Z,C, |
+ |
+ |
ror Rd |
Rotate Right through Carry |
Rd(7)←C, Rd(n)←Rd(n+1), C←Rd(0) |
1 |
1001 010d dddd 0111 |
Z,C, |
+ |
+ |
asr Rd |
Arithmetic Shift Right |
Rd(n)←Rd(n+1), |
1 |
1001 010d dddd 0101 |
Z,C, |
+ |
+ |
swap Rd |
Swap Nibbles |
Rd(3…0)←Rd(7…4), |
1 |
1001 010d dddd 0010 |
None |
+ |
+ |
bst Rr,b |
Bit Store from |
T←Rr(b) |
1 |
1111 101b bbbb 0bbb |
T |
+ |
+ |
bld Rd,b |
Bit Load from T |
Rd(b)←T |
1 |
1111 100b bbbb 0bbb |
None |
+ |
+ |
bset s |
Flag Set |
SREG(s)←1 |
1 |
1001 0100 0sss 1000 |
SREG(s) |
+ |
+ |
bclr s |
Flag Clear |
SREG(s)←0 |
1 |
1001 0100 1sss 1000 |
SREG(s) |
+ |
+ |
sec |
Set Carry |
C←1 |
1 |
1001 0100 0000 1000 |
C |
+ |
+ |
clc |
Clear Carry |
C←0 |
1 |
1001 0100 1000 1000 |
C |
+ |
+ |
sez |
Set Zero Flag |
Z←1 |
1 |
1001 0100 0001 1000 |
Z |
+ |
+ |
clz |
Clear Zero Flag |
Z←0 |
1 |
1001 0100 1001 1000 |
Z |
+ |
+ |
sen |
Set Negative Flag |
N←1 |
1 |
1001 0100 0010 1000 |
N |
+ |
+ |
cln |
Clear Negative Flag |
N←0 |
1 |
1001 0100 1010 1000 |
N |
+ |
+ |
sev |
Set Twos Complement Overflow |
V←1 |
1 |
1001 0100 0011 1000 |
V |
+ |
+ |
clv |
Clear Twos Complement Overflow |
V←0 |
1 |
1001 0100 1011 1000 |
V |
+ |
+ |
ses |
Set Signed Test Flag |
S←1 |
1 |
1001 0100 0100 1000 |
S |
+ |
+ |
cls |
Clear Signed Test Flag |
S←0 |
1 |
1001 0100 1100 1000 |
S |
+ |
+ |
seh |
Set Half Carry Flag |
H←1 |
1 |
1001 0100 0101 1000 |
H |
+ |
+ |
clh |
Clear Half Carry Flag |
H←0 |
1 |
1001 0100 1101 1000 |
H |
+ |
+ |
set |
Set Transfer bit |
T←1 |
1 |
1001 0100 0110 1000 |
T |
+ |
+ |
clt |
Clear Transfer bit |
T←0 |
1 |
1001 0100 1110 1000 |
T |
+ |
+ |
sei |
Global Interrupt Enable |
I←1 |
1 |
1001 0100 0111 1000 |
I |
+ |
+ |
cli |
Global Interrupt Disable |
I←0 |
1 |
1001 0100 1111 1000 |
I |
+ |
+ |
Команды данной группы доступны всем без исключения моделям AVR и сведены в табл.5.
Управлять отдельными битами первых 32 РВВ возможно благодаря командам sbi P,b (Установить бит в регистре ввода-вывода) и cbi P,b (Сбросить бит в регистре ввода-вывода). Обе команды выполняются за 2 машинных цикла.
При управлении разрядами портов микроконтроллера необходимо помнить о конечном времени установления сигналов, которое в разных случаях может составлять 0,5…1,5 периода тактовой частоты. Поэтому между изменением режимов работы линий ввода-вывода необходимо реализовать соответствующую программную задержку:
sbi PORTC,PC0 ; установка высокого уровня на линии 0 порта С cbi DDRC,DDC0 ; настройка линии 0 порта С на ввод rjmp PC+1 ; задержка 2 машинных цикла sbic PINC,PINC0 ; чтение значения линии 0 порта С и программный rjmp bit_set ; переход на метку bit_set если высокий уровень rjmp bit_clear ; или на метку bit_set если низкий уровень . bit_set: . bit_clear: .
Следующим типом команд являются сдвиговые операции, которых у AVR 5 разновидностей. Команды lsl Rd (Логический сдвиг влево), lsr Rd (Логический сдвиг вправо) осуществляют сдвиг содержимого регистра Rd на один разряд вправо и влево соответственно. При этом в младший бит после команды lsl Rd (в старший после lsr Rd) заносится 0. Например, результатом сдвига числа 0b11010111 = 0xD7 влево будет 0b10101110 = 0xAE, а вправо 0b01101011 = 0x6B.
Так или иначе старший бит результата при lsl Rd и младший при lsr Rd теряется. В тех случаях, когда это недопустимо, необходимо использовать циклический сдвиг rol Rd (Вращение влево через флаг переноса С) и ror Rd (Вращение вправо через флаг переноса C). Обе команды функционируют подобно lsl Rd, lsr Rd, но с одним важным отличием: старший разряд Rd после команды rol Rd (младший после ror Rd) заносятся во флаг переноса С из регистра флагов SREG. При этом содержимое самого бита С предварительно копируется в младший разряд регистра при rol Rd (старший после rol Rd). Так при циклическом сдвиге того же числа 0b11010111 = 0xD7 влево получим 0b1010111c, а вправо 0bc1101011, где на месте c будет значение C до выполнения команды. После операции флаг C окажется установленным (у числа 0b11010111 = 0xD7 MSB, MLB = 1). Обратим внимание на то, что вместо lsl Rd на самом деле выполняется add Rd,Rd, а вместо lsr Rd - adс Rd,Rd.
Ещё одна с виду необычная сдвиговая команда asr Rd. (Арифметический сдвиг вправо) разработана для деления на два знаковых чисел, представленных в дополнительном коде. В ходе операции все биты регистра сдвигаются на один разряд вправо (как при lsr Rd), кроме старшего 7-го, который остается неизменным (MSB является знаком результата и не может изменится при делении на положительное число 2). Если применить asr Rd к регистру в котором находится, например, число 0b11010010 = -46, то получим 0b11101001 = -23. Разумеется такое деление будет безошибочным, только для знаковых 1-байтовых чисел из диапазона -128…127.
Следующая команда swap Rd (Переставить полубайты в регистре) меняет местами старшую и младшую тетрады любого РОН и при этом не оказывает влияние ни на один из флагов регистра SREG. Эта инструкция очень удобна, например, для работы с двоично-кодированными десятичными числами. С ее помощью также легко организовать, например, умножение на 16:
swap R16 ; умножение на 16 1-байтового числа mov R17,R16 ; R17:R16 = 16*R16 andi R16,0xF0 andi R17,0x0F
В AVR пересылку бита из одного регистра в другой можно легко осуществить, используя команды bst Rr,b (Запись бита во флаг T), bld Rd,b (Чтение бита из флага T). Первая команда копирует бит b из регистра Rd во флаг T из РВВ SREG. Вторая производит обратное действие – перемещает содержимое флага T в соответствующий бит b регистра Rd. Поскольку флаг T является надежным хранилищем бита информации (не одна арифметическая и логическая команды на него не влияют), то между командами сохранения и восстановления может быть выполнен такой объем кода, какой требует логика программы.
В группе битовых операций отдельно существуют две инструкции специально разработанные для установки и сброса битов РВВ SREG (флагов программы). Это bset s (Установить флаг), bclr s (Сбросить флаг) соответственно. Других способов напрямую влиять на флаги нет, ведь sbi P,b и cbi P,b, как уже говорилось не будут работать с SREG, адрес в пространстве ввода-вывода у которого 0x3F. Под s в операнде понимается номер флага. Таким образом для установки флага C необходимо записать bset 0, для сброса Z, например, bclr 1 и т.д. что, конечно, неудобно. Поэтому на практике пользуются более наглядными псевдокомандами. Для bset s это sec (Установить С), sez (Установить Z), sen (Установить N), sev (Установить V), ses (Установить S), seh(Установить H), set (Установить T), sei (Установить I). Для bclr s это clc (Сбросить С), clz (Сбросить Z), cln (Сбросить N), clv (Сбросить V), cls (Сбросить S), seh (Сбросить H), clt (Сбросить T), cli (Сбросить I).
Перейти к следующей части: Группа команд управления процессором
Комментарии (0) | Я собрал (0) | Подписаться
Для добавления Вашей сборки необходима регистрация