Регистр состояния 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 — общее разрешение прерываний

6-й разряд регистра SREG — «Хранение копируемого бита» — обозначается буквой «Т»:
Этот разряд мы можем использовать в своих целях, как ячейку для временного хранения информации размерностью в один бит.
Для сброса этого разряда в ноль, существует команда CLT:
Как я уже говорил, в этом разряде мы можем сохранять нужные для нас данные. Для этого существует две команды, по которым нужный разряд РОН переносится в флаг «Т» — 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:

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

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

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

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

0-й разряд регистра SREG — «Флаг переноса» — обозначается буквой «С»:
Этот флаг устанавливается при возникновении переполнения (переноса в старший разряд) при выполнении арифметической операции над байтами. Этот регистр сигнализирует о переполнении байта (размер числа стал больше 255). Также этот разряд используется как бит памяти в операциях сдвига.
Флаг нуля сбрасываем командой CLC:
Вы наверное заметили в описании команд строчку «Эквивалентна команде BCLRx«. Очень много команд в МК AVR дублируются. Так же и в этом случае: для сброса разрядов регистра SREG существует CLx, где «х» — буквенное обозначение регистра, и в тоже время есть другая команда — BCLRx, — которая аналогична CLx, но в этом случае вместо «х» в конце, пишите номер разряда):
Для установки флагов регистра SREG существует команда BSETx. Как и в предыдущей, для установки флага разряда, «х» заменяете на номер разряда регистра, который необходимо установить:
В описании каждой команды микроконтроллера можно узнать какие разряды регистра SREG принимают участие в ней, какие не принимают, и какие принимают определенное значение:
Описание разрядов (битов) регистра SREG из книги Евстифеева А.В. :
Предыдущие статьи:
♦ Микроконтроллер и как его победить
♦ Микроконтроллер и системы счисления
♦ Микроконтроллер и логические операции
♦ Общее устройство микроконтроллера
♦ Арифметико-логическое устройство и организация памяти — память программ, память данных, энергонезависимая память
♦ Регистры общего назначения, регистры ввода/вывода, стек, счетчик команд
Следующая статья:
♦ Порты ввода/вывода микроконтроллера








Понравилось. Жду продолжения.