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

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

Табл 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).


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

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

*
= 5 + 6

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

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