Регистр состояния 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 из книги Евстифеева А.В. :
Предыдущие статьи:
♦ Микроконтроллер и как его победить
♦ Микроконтроллер и системы счисления
♦ Микроконтроллер и логические операции
♦ Общее устройство микроконтроллера
♦ Арифметико-логическое устройство и организация памяти – память программ, память данных, энергонезависимая память
♦ Регистры общего назначения, регистры ввода/вывода, стек, счетчик команд
Следующая статья:
♦ Порты ввода/вывода микроконтроллера
Понравилось. Жду продолжения.