Регистр состояния 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


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

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

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

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




Комментарии

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

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

Ваш email не будет опубликован. Обязательные поля отмечены *


Вы можете использовать это HTMLтеги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>