Группа команд операций с битами

Группа команд операций с битами

Табл 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/ORerister 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,N,V + +
lsr   Rd Logical Shift Right Rd(n)←Rd(n+1), Rd(7)←0 1 1001 010d dddd 0110 Z,C,N,V   + +
rol   Rd Rotate Left through Carry Rd(0)←C, Rd(n+1)←Rd(n), C←Rd(7) 1 0001 11dd dddd dddd Z,C,N,V + +
ror   Rd Rotate Right through Carry Rd(7)←C, Rd(n)←Rd(n+1), C←Rd(0) 1 1001 010d dddd 0111 Z,C,N,V + +
asr   Rd Arithmetic Shift Right Rd(n)←Rd(n+1),n=0…6 1 1001 010d dddd 0101 Z,C,N,V + +
swap  Rd Swap Nibbles Rd(3…0)←Rd(7…4),Rd(7…4)←Rd(3…0) 1 1001 010d dddd 0010 None + +
bst   Rr,b Bit Store fromRerister to T T←Rr(b) 1 1111 101b bbbb 0bbb T + +
bld   Rd,b Bit Load from Tto Rerister 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, а вместо rol 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).

Если вы нашли ошибку, выделите ее и нажмите Shift + E или нажмите здесь чтобы сообщить нам.


Категория: Микроконтроллеры
Метки:

Написать коментарий

*
= 5 + 0

Добавить изображение

Последние статьи