Регистр состояния SREG AVR

Регистр состояния SREG AVR

Процессорное ядро микроконтроллеров:
— регистры ввода/вывода — регистр состояния SREG AVR

Доброго дня уважаемые радиолюбители!
Приветствую вас на сайте «Радиолюбитель«

Сегодня мы с вами рассмотрим один из регистров ввода/вывода — самый главный и самый «востребованный» в программах:
— регистр состояния (регистр статуса) SREG

Регистр ввода/вывода SREG (регистр состояния, он же — регистр статуса)

Регистр SREG воьмиразрядныый (как и все РВВ) и имеет номер $3F (5F в адресном пространстве памяти данных, т.е. по счету он 64, самый последний, хотя и самый главный) и содержит набор флагов показывающих текущее состояние микроконтроллера.
Что означает понятие «набор флагов«.
Каждый из восьми разрядов (битов) регистра называется флагом, который может быть установлен в «единицу» (в разряд записывается логическая единица) — в этом случае считается что «флаг установлен», или сброшен в «ноль» (в разряд записывается логический ноль) — в этом случае говорят что «флаг сброшен». Большинство флагов сбрасывается или устанавливается автоматически, в зависимости от результатов выполненной операции.
Шесть из восьми разрядов регистра соответствует результатам какой-то выполненной микроконтроллером арифметической или логической операции, один разряд мы можем использовать в своих целях, и еще один — является указателем, — разрешены или нет прерывания. С него мы и начнем.

Назначение разрядов (битов) регистра состояния SREG:

Сразу, вместе с изучением разрядов регистра, мы изучим команды, с помощью которых управляются разряды регистра SREG. Все команды очень легко запомнить, так-как они состоят из трех букв: первые две — аббревиатура команды, третья — буква флага.

Для сброса флага регистра предназначена команда: CLx (от слова CLEAR — очистить), где «х» — буквенное обозначение разряда. Для установки флага регистра предназначена команда SEx (от слова SET — установить), где «х» — буквенное обозначение разряда регистра.

7-й разряд регистра SREG — «Общее разрешение прерываний» — обозначается буквой «I»:
Если этот разряд установлен в «1», значит все прерывания разрешены, если установлен в «0» — все прерывания запрещены. Мы можем сами записать в этот разряд 1 или 0, тем самым разрешая, или запрещая использование всех прерываний в программе. Надо иметь ввиду, что мы также можем разрешать или запрещать отдельные прерывания в соответствующих им РВВ. Кроме того, этот флаг сбрасывается автоматически, если произошел вызов процедуры обработки какого-либо прерывания (на время, пока происходит процедура обработки одного прерывания, другие прерывания, если они возникнут в этот момент, не должны мешать ходу обработки текущего прерывания, поэтому на время обработки прерывания происходит общее запрещение прерываний) и автоматически устанавливается после обработки прерывания.

Для управления этим разрядом существует две команды:
CLI — общее запрещение прерываний
SEI — общее разрешение прерываний

Общее запрещение прерываний I   7-й разряд SREG
6-й разряд регистра SREG — «Хранение копируемого бита» — обозначается буквой «Т»:
Этот разряд мы можем использовать в своих целях, как ячейку для временного хранения информации размерностью в один бит.

Для сброса этого разряда в ноль, существует команда CLT:

брос флага Т  6-й разряд SREGКак я уже говорил, в этом разряде мы можем сохранять нужные для нас данные. Для этого существует две команды, по которым нужный разряд РОН переносится в флаг «Т» — BST Rd, b, или содержимое флага «Т» переносится в нужный разряд РОН — BLD Rd, b (здесь — Rd — любой РОН, b — номер бита этого РОН):

Запись разряда РОН в флаг ТПересылка флага Т в разряд РОН

5-й разряд регистра SREG — «Флаг половинного переноса» — обозначается буквой «Н»:
Этот флаг устанавливается автоматически при выполнении некоторых арифметических операций в случае, если имел место перенос из младшей половины байта в старший (из 3-го разряда в 4-й) или заем из старшей половины байта в младшую (из 4-го раазряда в 3-й).
Пример:
Сложение двух двоичных чисел: #b oooo 1ooo и #b 0000 1010. В третьем разряде (четвертый слева) и первого, и второго числа «1». При их сложении, по правилам сложения двоичных чисел, складывая две единицы мы в третьем разряде записываем «0», а в четвертом — «1». Это и называется половинным переносом (из 3-го разряда в 4-й).

Для сброса флага в ноль существует команда CLH:

Сброс флага переноса  Н - 5-й разряд SREG
4,3 и 2 разряды регистра SREG
Сразу скажу — не удивляйтесь прочитанному про эти три разряда регистра, и тем более не пугайтесь. То, что вы прочтете — так написано во всех умных книжках. Эти три регистра также показывают результаты арифметических операций, но с отрицательными числами. К этим разрядам регистра мы еще вернемся, когда будем учиться математическим операциям с отрицательными числами, и тогда, прочитав про них еще раз, уже не будем чувствовать себя как те курчавые создания перед новыми воротами. 
4-й разряд регистра SREG — «Флаг знака» — обозначается буквой «S»:
Этот флаг является результатом операции «Исключающее ИЛИ» между флагами N и V. Этот флаг устанавливается если результат оперции меньше нуля (отрицательный).

Сброс флага осуществляется командой CLS:

Сброс флага знака S 4-й разряд SREG
3-й разряд регистра SREG — «Флаг переполнения дополнительного кода» — обозначается буквой  «V»
Этот флаг используется для операций со знаковыми числам, числами, представленными в дополнительном коде (в так называемом «дополнительном коде» записываются отрицательные числа). Флаг устанавливается в единицу если произойдет переполнение числа в дополнительном коде.

Сброс флага производится командой CLV:

Сброс флага переполнения дополнительного кода V  3-й разряд SREG
2-й разряд регистра SREG — «Флаг отрицательного значения» — обозначается буквой «N»
Этот флаг устанавливается в единицу, если в результате арифметической операции старший разряд результата равен единице.

Флаг можно сбросить командой CLN:

Сброс флага отрицательного значения N 2-й разряд SREG
1-й разряд регистра SREG — «Флаг нуля» — обозначается буквой «Z»:
Этот флаг устанавливается в единицу, если результат выполняемой операции равен нулю (наверное самый понятный разряд регистра)

Флаг нуля сбрасывается по команде CLZ:

Сброс флага нуля Z  1-й разряд SREG
0-й разряд регистра SREG — «Флаг переноса» — обозначается буквой «С»:
Этот флаг устанавливается при возникновении переполнения (переноса в старший разряд) при выполнении арифметической операции над байтами. Этот регистр сигнализирует о переполнении байта (размер числа стал больше 255). Также этот разряд используется как бит памяти в операциях сдвига.

Флаг нуля сбрасываем командой CLC:

Сброс флага переноса  С - 0-й разряд SREG

Вы наверное заметили в описании команд строчку «Эквивалентна команде BCLRx«. Очень много команд в МК AVR дублируются. Так же и в этом случае: для сброса разрядов регистра SREG существует CLx, где «х» — буквенное обозначение регистра, и в тоже время есть другая команда — BCLRx, — которая аналогична CLx, но в этом случае вместо «х» в конце, пишите номер разряда):

Сброс разрядов регисттра SREG

Для установки флагов регистра SREG существует команда BSETx. Как и в предыдущей, для установки флага разряда, «х» заменяете на номер разряда регистра, который необходимо установить:

Установка разрядов регистра SREG

В описании каждой команды микроконтроллера можно узнать какие разряды регистра SREG принимают участие в ней, какие не принимают, и какие принимают определенное значение:

Пример участия регистра SREG в команде микроконтроллера

Описание разрядов (битов) регистра SREG из книги Евстифеева А.В. :

Регистр SREG_1Регистр SREG_2


Предыдущие статьи:

 Микроконтроллер и как его победить
 Микроконтроллер и системы счисления
 Микроконтроллер и логические операции
 Общее устройство микроконтроллера
 Арифметико-логическое устройство и организация памяти — память программ, память данных, энергонезависимая память
 Регистры общего назначения, регистры ввода/вывода, стек, счетчик команд

Следующая статья:

 Порты ввода/вывода микроконтроллера



1 комментарий к “Регистр состояния SREG AVR”

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

Политика конфиденциальности