Реклама ⓘ
Главная » Микроконтроллеры
Призовой фонд
на апрель 2024 г.
1. 100 руб.
От пользователей

Реклама ⓘ

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

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

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 from
Rerister to T

T←Rr(b)

1

1111 101b bbbb 0bbb

T

+

+

bld  Rd,b

Bit Load from T
to 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, а вместо 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).

Перейти к следующей части:

Теги:

Котов Игорь Юрьевич Опубликована: 2012 г. 0 0
Я собрал 0 0
x

Оценить статью

  • Техническая грамотность
  • Актуальность материала
  • Изложение материала
  • Полезность устройства
  • Повторяемость устройства
  • Орфография
0

Средний балл статьи: 0 Проголосовало: 0 чел.

Комментарии (0) | Я собрал (0) | Подписаться

Статью еще никто не комментировал. Вы можете стать первым.
Добавить комментарий
Имя:
E-mail:
не публикуется
Текст:
Защита от спама:
В чем измеряется сила тока?
Файлы:
 
Для выбора нескольких файлов использйте CTRL

AVR-программатор USB ASP
AVR-программатор USB ASP
МиниПК MK809V - 4 ядра, Android 4.4.2 Discovery V8
вверх