Регистры

Регистры

Аннотация: В лекции рассказывается о параллельных регистрах и регистрах сдвига, об алгоритмах их работы, параметрах, типовых схемах включения, а также о реализации на их основе некоторых часто встречающихся функций.

Регистры (англ. register) представляют собой, по сути, несколько D-триггеров (обычно от 4 до 16), соединенных между собой тем или иным способом. Поэтому принципиальной разницы между ними и отдельными D-триггерами не существует. Правда, триггеры, входящие в состав регистров, не имеют такого количества разнообразных управляющих входов, как одиночные триггеры.

На схемах регистры обозначаются буквами RG. В отечественных сериях микросхем регистрам соответствуют буквы ИР. Все регистры делятся на две большие группы (рис. 8.1):

  • Параллельные регистры;
  • Регистры сдвига (или сдвиговые регистры).

Существуют регистры и других типов, но они применяются гораздо реже, чем параллельные и сдвиговые, так как имеют узкоспециальное назначение.

В параллельных регистрах (а) каждый из триггеров имеет свой независимый информационный вход (D) и свой независимый информационный выход. Тактовые входы (С) всех триггеров соединены между собой. В результате параллельный регистр представляет собой многоразрядный, многовходовый триггер.

Рис. 8.1. Структура параллельного регистра (а)и сдвигового регистра (б)

В сдвиговых регистрах (б) все триггеры соединены в последовательную цепочку (выход каждого предыдущего триггера соединен со входом D следующего триггера). Тактовые входы всех триггеров (С) объединены между собой.

В результате такой триггер может рассматриваться как линия задержки, входной сигнал которой последовательно перезаписывается из триггера в триггер по фронту тактового сигнала С.

Информационные входы и выходы триггеров могут быть выведены наружу, а могут и не выводиться – в зависимости от функции, выполняемой регистром.

Параллельные регистры, в свою очередь, делятся на две группы:

  • Регистры, срабатывающие по фронту управляющего сигнала С (или тактируемые регистры).
  • Регистры, срабатывающие по уровню управляющего сигнала С (или стробируемые регистры).

Чаще всего в цифровых схемах используются регистры, управляемые фронтом (то есть тактируемые), однако и стробируемые регистры имеют свой круг задач, в которых их ничто не может заменить.

Принцип действия регистров, срабатывающих по фронту тактового сигнала, ничем не отличается от принципа действия D-триггера.

По положительному фронту тактового сигнала С каждый из выходов регистра устанавливается в тот уровень, который был в этот момент на соответствующем данному выходу входе D, и сохраняется таковым до прихода следующего положительного фронта сигнала С.

То есть если триггер запоминает один сигнал (один двоичный разряд, один бит), то регистр запоминает сразу несколько (4, 6, 8, 16) сигналов (несколько разрядов, битов). Память регистра сохраняется до момента выключения питания схемы.

Рис. 8.2. Параллельные регистры стандартных серий, срабатывающие по фронту

В стандартные серии входит несколько типов параллельных регистров, срабатывающих по фронту (рис. 8.2).

Различаются они количеством разрядов, наличием или отсутствием инверсных выходов, наличием или отсутствием входа сброса (–R) или разрешения записи (–WE), а также типом выходных каскадов (2С или 3С) и, соответственно, наличием или отсутствием входа разрешения –EZ. Иногда на схемах тактовый вход С обозначается WR – сигнал записи в регистр.

Большинство регистров имеют восемь разрядов, то есть запоминают один байт информации. Регистр ТМ8 в справочниках обычно называется счетверенным D-триггером (он и в наименовании несет буквы ТМ), хотя он вполне может рассматриваться и как регистр, так как тактовый вход С и вход сброса –R у всех четырех триггеров объединены между собой.

Таблицы истинности регистров очень просты и не отличаются принципиально от таблицы истинности D-триггеров.

Отличие от триггеров появляется только в случае наличия у регистра дополнительных управляющих входов разрешения записи –WE и разрешения выхода –EZ. В качестве примеров в табл. 8.1 приведена таблица истинности регистра ИР27, а в табл. 8.

2 – регистра ИР37. По переходу тактового сигнала С из 0 в 1 (положительный фронт) оба регистра записывают в себя входную информацию.

Таблица 8.1. Таблица истинности регистра ИР27ВходыВыходы-WECDQ
01
01 1 1
X Не меняется
1 Х Не меняется
1 Х Х Не меняется
Таблица 8.2. Таблица истинности регистра ИР37ВходыВыходы-EZCDQ
01
01 1 1
X Не меняется
1 Х Не меняется
1 Х Х Z

Все регистры, имеющие выход с тремя состояниями, обеспечивают повышенную нагрузочную способность. Задержка переключения регистров примерно соответствует задержке переключения триггеров.

Все временные ограничения, накладываемые на входные сигналы в случае триггеров, справедливы и для входных сигналов регистров.

Например, не должна быть слишком малой длительность сигнала С, а также не должна быть слишком малой задержка между установлением сигнала D и приходом положительного фронта сигнала С. Иначе работа регистра может быть нестабильной или даже неправильной.

https://www.youtube.com/watch?v=aq4JlHS9eF0

Одно из основных применений регистров состоит в хранении требуемого кода в течение нужного времени. Если для работы остальной части схемы необходимо иметь входной код, который можно легко изменять, то для этого как раз подходит регистр.

Источник: http://www.intuit.ru/studies/courses/104/104/lecture/3043

Регистры процессора

Скачать бесплатно книгу Ассемблер для начинающих

Начиная с модели 80386 процессоры Intel предоставляют 16 основных регистров для пользовательских программ и ещё 11 регистров для работы с мультимедийными приложениями (MMX) и числами с плавающей точкой (FPU/NPX).

Все команды так или иначе изменяют содержимое регистров. Как уже говорилось, обращаться к регистрам быстрее и удобнее, чем к памяти. Поэтому при программировании на языке Ассемблера регистры используются очень широко.

В этом разделе мы рассмотрим основные регистры процессоров Intel. Названия и состав/количество регистров для других процессоров могут отличаться. Итак, основные регистры процессоров Intel.

Таблица 2.1. Основные регистры процессора.

Название Разрядность Основное назначение
EAX 32 Аккумулятор
EBX 32 База
ECX 32 Счётчик
EDX 32 Регистр данных
EBP 32 Указатель базы
ESP 32 Указатель стека
ESI 32 Индекс источника
EDI 32 Индекс приёмника
EFLAGS 32 Регистр флагов
EIP 32 Указатель инструкции (команды)
CS 16 Сегментный регистр
DS 16 Сегментный регистр
ES 16 Сегментный регистр
FS 16 Сегментный регистр
GS 16 Сегментный регистр
SS 16 Сегментный регистр

Регистры EAX, EBX, ECX, EDX – это регистры общего назначения. Они имеют определённое назначение (так уж сложилось исторически), однако в них можно хранить любую информацию.

Регистры EBP, ESP, ESI, EDI – это также регистры общего назначения. Они имеют уже более конкретное назначение. В них также можно хранить пользовательские данные, но делать это нужно уже более осторожно, чтобы не получить «неожиданный» результат.

Регистр флагов и сегментные регистры требуют отдельного описания и будут более подробно рассмотрены далее.

Пока для вас здесь слишком много непонятных слов, но со временем всё прояснится)))

Когда-то процессоры были 16-разрядными, и, соответственно, все их регистры были также 16-разрядными. Для совместимости со старыми программами, а также для удобства программирования некоторые регистры разделены на 2 или 4 «маленьких» регистра, у каждого из которых есть свои имена. В таблице 2.2 перечислены такие регистры.

Вот пример такого регистра.

Из этого следует, что вы можете написать в своей программе, например, такие команды: MOV AX, 1 MOV EAX, 1Обе команды поместят в регистр AX число 1.

Разница будет заключаться только в том, что вторая команда обнулит старшие разряды регистра EAX, то есть после выполнения второй команды в регистре EAX будет число 1. А первая команда оставит в старших разрядах регистра EAX старые данные.

И если там были данные, отличные от нуля, то после выполнения первой команды в регистре EAX будет какое-то число, но не 1. А вот в регистре AX будет число 1. Сложно? Ну это пока… Со временем вы к таким вещам привыкните.

Мы пока не говорили о разрядах (битах). Эту тему мы обсудим в разделах, посвящённых системам счисления. А сейчас пока вам достаточно знать, что нулевой разряд (бит) – это младший бит. Он крайний справа.

Старший бит – крайний слева. Номер старшего бита зависит от разрядности числа/регистра. Например, в 32-разрядном регистре старшим битом является 31-й бит (потому что отсчёт начинается с 0, а не с 1).

Ниже приведён список регистров общего назначения, которые можно поделить описанным выше способом и при этом к «половинкам» и «четвертинкам» этих регистров можно обращаться в программе как к отдельному регистру.

Таблица 2.2. «Делимые» регистры..

Регистр Старшие разряды Имена 16-ти и 8-ми битных регистров
31…16 15…8 7…0
EAX AX
AH AL
EBX BX
BH BL
ECX CX
CH CL
EDX DX
DH DL
ESI SI
EDI DI
EBP BP
ESP SP
EIP IP

На этом мы закончим наше краткое знакомство с регистрами. Если вам пока не всё понятно – просто прочитайте этот раздел, чтобы более-менее представлять себе, что такое регистры. По мере приобретения новых знаний вы можете вернуться к этому разделу и уже на новом уровне воспринять эту информацию. А в следующем разделе мы коротко опишем процесс выполнения команды.

Источник: http://av-assembler.ru/asm/afd/asm-cpu-registers.htm

Исследование регистров

Лабораторная работа выполняется с помощью учебного лабораторного стенда LESO2.

1 Цель работы

Целью работы является изучение принципа работы схем триггерных регистров и приобретение практических навыков в выполнении микроопераций на регистрах в статическом режиме.

2 Краткие теоретические сведения

Регистры предназначены для хранения и преобразования многоразрядных двоичных чисел. Для запоминания отдельных разрядов числа могут применяться триггеры различных типов. Одиночный триггер можно считать одноразрядным регистром.

Занесение информации в регистр называется операцией записи. Операция выдачи информации из регистра – считывание.

Перед записью информации в регистр, его необходимо обнулить.

Классификация регистров:

  1. по способу ввода/вывода информации:
  1. по способу представления информации:

2.1 Параллельный регистр

Параллельные регистры осуществляют прием и выдачу информации в параллельном коде, а это значит, что для передачи каждого разряда используется отдельная линия.

Для записи информации в регистр на его входных выводах (D0-D3) нужно установить логические уровни, после чего на вход синхронизации (C) подать разрешающий импульс — логическую единицу. После этого на выходах Q0-Q3 появится записанное слово. Регистры запоминают входные сигналы только в момент времени, определяемый сигналом синхронизации.

Рисунок 2.1 – Условно-графическое обозначение параллельного регистра Рисунок 2.2 – Схема параллельного регистра

2.1 Последовательные регистры

Кроме параллельного соединения триггеров для построения регистров используется последовательное соединение этих элементов.

Последовательный регистр (регистр сдвига) обычно служит для преобразования последовательного кода в параллельный и наоборот.

Применение последовательного кода связано с необходимостью передачи большого количества двоичной информации по ограниченному количеству соединительных линий. При параллельной передаче разрядов требуется большое количество соединительных проводников.

Если двоичные разряды последовательно бит за битом передавать по одному проводнику, то можно значительно сократить размеры соединительных линий на плате (и размеры корпусов микросхем).

Принципиальная схема последовательного регистра, собранного на основе D-триггеров и позволяющего осуществить преобразование последовательного кода в параллельный, приведена на рисунке 2.3.

Рассмотрим работу этого регистра. Можно предположить, что в начале все триггеры регистра находятся в состоянии логического нуля, т.е. Q0=0, Q1=0, Q2=0, Q3=0. Если на входе D-триггера Т1 имеет место логический 0, то поступление синхроимпульсов на входы «С» триггеров не меняет их состояния.

Рисунок 2.3 – Схема последовательного регистра

Как следует из рисунка 2.3, синхроимпульсы поступают на соответствующие входы всех триггеров регистра одновременно и записывают в них то, что имеет место на их информационных входах. На информационных входах триггеров Т2, Т3, Т4 – уровни логического «0», т.к.

информационные входы последующих триггеров соединены с выходами предыдущих триггеров, находящихся в состоянии логического «0», а на вход «D» первого триггера, по условию примера, подается «0» из внешнего источника информации.

При подаче на вход «D» первого триггера «1», с приходом первого синхроимпульса, в этот триггер запишется «1», а в остальные триггеры – «0», т.к. к моменту поступления фронта синхроимпульса на выходе триггера Т1 ещё присутствовал логический «0».

Таким образом, в триггер Т1 записывается та информация (тот бит), которая была на его входе «D в момент поступления фронта синхроимпульса и т.д.

При поступлении второго синхроимпульса логическая «1» с выхода первого триггера, запишется во второй триггер, и в результате происходит сдвиг первоначально записанной «1» с триггера Т1 в триггер Т2, из триггера Т2 в триггер Т3 и т.д. Таким образом, производится последовательный сдвиг поступающей на вход регистра информации (в последовательном коде) на один разряд вправо в каждом такте синхроимпульсов.

После поступления четырёх синхроимпульсов регистр оказывается полностью заполненным разрядами числа, вводимого через последовательный ввод «D».

В течение следующих четырёх синхроимпульсов производится последовательный поразрядный вывод из регистра записанного числа, после чего регистр оказывается полностью очищенным (регистр окажется полностью очищенным только при условии подачи на его вход уровня «0» в режиме вывода записанного числа).

Рисунок 2.4 – Временные диаграммы, поясняющие работу регистра сдвига

3 Задание к работе

3.1 Исследовать параллельный регистр

Сконфигурировать ПЛИС в соответствии с рисунком 3.1.

Рисунок 3.1 – Схема 4-х битного параллельного регистра

Записать целые десятичные числа от 0 до 15 в двоичной системе счисления в регистр и считать их. Заполнить таблицу 3.1.

Таблица 3.1 – Коды, записанные в параллельный регистр

Записываемое десятичное число Считанное из регистра двоичное число
1
15

3.2 Исследовать последовательно-параллельный регистр

Сконфигурировать ПЛИС в соответствии с рисунком 3.2.

Рисунок 3.2 – Схема последовательно-параллельного регистра

Элемент 74164 – это последовательно-параллельный регистр.

Для того, что бы выполнить блок Antitinkling, прочтите инструкцию Борьба с дребезгом контактов.

Записать нечётное число в интервале от 32 до 56 в последовательном коде, поразрядно продвигая его влево путём нажатия кнопки Button. Записать результат в отчёт.

3.3 Исследовать параллельно-последовательный регистр

Сконфигурировать ПЛИС в соответствии с рисунком 3.3.

Рисунок 3.3 – Схема параллельно-последовательного регистра

Элемент 74166 представляет собой параллельно-последовательный регистр.

Чтобы записать на входе число необходимо установить на входе STLD логический 0 и подать синхроимпульс, чтобы начать считывать записанное число необходимо на вход STLD подать логическую 1 и подавать синхроимпульсы.

Записать число в интервале от 32 до 56 в параллельном коде и поразрядно считывать его на выходе. Записать результат в отчёт.

4 Содержание отчёта

  1. Цель работы.
  2. Схема исследования параллельного 4-х битного регистра с таблицей 3.1 .
  3. Схема последовательно-параллельного регистра с результатами исследований.
  4. Выводы по каждому заданию.

5 Контрольные вопросы

  1. Назначение регистров.
  2. По каким признакам классифицируются регистры?
  3. Чем определяется разрядность регистров?
  4. Назначение параллельного регистра.
  5. Объяснить принцип работы последовательного регистра.
  6. Объяснить принцип работы параллельного регистра.
  7. Объяснить принцип работы последовательно-параллельного регистра.
  8. Объяснить принцип работы параллельно-последовательного регистра.

Источник: http://www.labfor.ru/guidance/digital-leso2/5

Основы цифровой техники

 материалы в категории

Регистры в цифровой технике

Регистр (от буржуйского to register – регистрировать) – это цифровой узел, предназначенный для записи и хранения числа. Некоторые регистры могут преобразовывать информацию из последовательной формы в параллельную и наоборот. Ну а так как самый простой элемент памяти это триггер, то обычно на них (на триггерах) регистры и выполняются.

Сами по себе регистры бывают разные:

Регистр хранения

Структура регистра хранения на D-триггерах:

Каждый триггер служит для хранения одного разряда числа. Вход R служит для установки триггеров в нулевое состояние перед записью информации. Входное двоичное число подается на входы D0-D2 и при подаче импульса на вход С в триггеры записывается этот код, т. е.

информация. Эта информация может храниться сколь угодно долго, если на вход С не поступают импульсы (или если не обрубят питание). Информация может выводиться как в прямом (с прямых выходов триггеров), так и в инверсном коде (с инверсных выходов). Вроде все понятно.

Регистр сдвига

Другая разновидность регистров – регистр сдвига. Регистр сдвига предназначен для преобразования информации путем ее сдвига под воздействием тактовых импульсов. Посмотрим на структуру регистра сдвига на D-триггерах:

Как видно из рисунка, в регистре сдвига также объединяются входы R и C триггеров. Перед записью информации регистр устанавливается в нулевое состояние. Информация подается на D-вход первого триггера. При подаче импульса на вход С бит информации (лог. 0 или лог. 1) записывается в триггер. При подаче следующего импульса этот бит записывается в следующий триггер.

При этом в первый триггер записывается следующий бит информации и т. д. Другими словами, при воздействии тактовых импульсов информация продвигается по регистру от первого триггера к последнему. При заполнении всех триггеров число в параллельном коде можно вывести с выходов Q0-Q2.

При этом первый бит информации будет присутствовать на выходе Q2, второй – на выходе Q1 и т. п.

Схемы на рисунках 1 и 2 можно объединить. Если между входами и выходами триггеров поставить схемы электронных переключателей, то при воздействии управляющего сигнала регистр можно переводить из последовательного в параллельный и наоборот.

Показанный на рисунке регистр сдвигает информацию только в одну сторону. Такие регистры называют регистром со сдвигом вправо или регистр со сдвигом влево (смотря куда он сдвигает). Существуют регистры, сдвигающие информацию в обе стороны. Направление сдвига определяется управляющим сигналом, подаваемым на специальный вход (ну это уже так, для общей информации так сказать…).

Спросите, где все это можно применить на практике? Ну, вот, к примеру, есть схемка неплохая- автомат световых эффектов. Она вам точно понравится!

Примечание: все что вы здесь прочитали в основном было подсмотрено на сайте Цифровая техника, но если вдруг какие вопросы возникли- у нас и собственный ФОРУМ имеется…

Источник: http://radio-uchebnik.ru/txt/14-osnovy-tsifrovoj-tekhniki/85-registry

Регистры

CodeNet / Языки программирования / Ассемблер

Регистр – это определенный участок памяти внутри самого процессора, от 8-ми до 32-х бит длиной, который используется для промежуточного хранения информации, обрабатываемой процессором. Некоторые регистры содержат только определенную информацию.

Регистры общего назначения – EAX, EBX, ECX, EDX. Они 32-х битные и делятся еще на две части, нижние из которых AX, BX, CD, DX – 16-ти битные, и деляется еще на два 8-ми битных регистра. Так, АХ делится на AH и AL, DX на DH и DL и т.д. Буква “Н” означает верхний регистр.

Так, AH и AL каждый по одному байту, АХ – 2 байта (или word – слово), ЕАХ – 4 байта (или dword – двойное слово). Эти регистры используются для операций с данными, такими, как сравнение, математические операции или запись данных в память.

Регистр СХ чаще всего используется как счетчик в циклах.

АН в DOS программах используется как определитель, какой сервис будет использоваться при вызове INT.

Регистры сегментов – это CS, DS, ES, FS, GS, SS. Эти регистры 16-ти битные, и содержат в себе первую половину адреса “оффсет:сегмент”.

  • CS – сегмент кода (страница памяти) исполняемой в данный момент программы.
  • DS – сегмент (страница) данных исполняемой программы, т.е. константы, строковые ссылки и т.д.
  • SS – сегмент стека исполняемой программы.
  • ES, FS, GS – дополнительные сегменты, и могут не использоваться программой.

Регистры оффсета – EIP, ESP, EBP, ESI, EDI. Эти регистры 32-х битные, нижняя половина которых доступна как регистры IP, SP, BP, SI, DI.

  • EIP – указатель команд, и содержит оффсет (величину смещения относительно начала программы) на линию кода, которая будет исполняться следующей. То есть полный адрес на следующую исполняемую линию кода будет CS:ЕIP.
  • Регистр ESP указывает на адрес вершины стека (адрес, куда будет заноситься следующая переменная командой PUSH).
  • Регистр ЕВР содержит адрес, начиная с которого в стек вносится или забирается информация (или “глубина” стека). Параметры функций имеют положительный сдвиг относительно ЕВР, локальные переменные – отрицательный сдвиг, а полный адрес этого участка памяти будет SS:EBP.
  • Регистр ESI – адрес источника, и содержит адрес начала блока информации для операции “переместить блок” (полный адрес DS:SI), а регистр EDI- адрес назначения в этой операции (полный адрес ES:EDI).

Регистры управления – CR0, CR1, CR2, CR3. Эти 32-х битные регистры устанавливают режим работы процессора (нормальный, защищенный и т.д.), постраничное распределение памяти и т.д. Они доступны только для программ в первом кольце памяти (Kernel, например). Трогать их не следует.

Регистры дебаггера – DR0, DR1, DR2, DR3, DR4, DR5, DR6, DR7. Первые четыре регистра содержат адреса на точки прерывания, остальные устанавливают, что должно произойти при достижении точки прерывания.

Контрольные регистры – TR6, TR7. Используются для контроля постраничной системы распределения памяти операционной системой. Нужны только если вы собираетесь написать свою ОС.

Источник: http://www.codenet.ru/progr/Asm/regs.php

Регистры. Принцип действия, область применения. Типовые интегральные схемы регистров

Регистры – функциональные узлы, предназначенные для приема, хранения, передачи и преобразования информации.

Используются в качестве управляющих и запоминающих устройств генераторов и преобразователей кодов, счетчиков и делителей частоты, узлов временной задержки.

Строятся на синхронных триггерах с динамическим или статическим управлением. Занесение информации в регистр называется операцией ввода или записью. Выдача информации к внешним устройствам характеризует операцию вывода или считывание.

Запись информации в регистр не требует его предварительного обнуления.

Регистры делятся на:

· сдвигающие

· накопительные (памяти, хранения)

· универсальные.

Регистры памятипредназначены для хранения двоичной информации небольшого объема в течение короткого промежутка времени.

Представляют собой набор синхронных триггеров, каждый из которых хранит один разряд двоичного числа. Ввод и вывод информации производится одновременно во всех разрядах параллельного кода.

Ввод обеспечивается тактовым командным импульсом. Считывание может производиться в прямом и обратном коде (с инверсных выходов).

Регистры сдвига. Сущность сдвига – с приходом каждого тактового импульса происходит перезапись (сдвиг) содержимого триггера каждого разряда в соседний разряд без изменения порядка следования «0» и «1». При сдвиге вправо бит из более старшего разряда сдвигается в младший. При сдвиге влево – наоборот.

Сдвигающие регистры классифицируются:

1) по способу ввода и вывода информации на:

· параллельные

· последовательные

· комбинированные

2) по направлению сдвига на:

· однонаправленные

· реверсивные

Обозначаются: RG ←, → и ↔ (влево, вправо и реверсивные)

Универсальные в зависимости от управляющих сигналов могут выполнять как операцию хранения, так и сдвиг.

4-х разрядный сдвигающий регистр с последовательным вводом.

Допустим, что в регистр последовательно вводится начиная с младшего разряда двоичный код 1101, который поступает с внешнего устройства синхронно с тактовыми импульсами. С первым тактовым импульсом в триггер DD1 записывается «1» младшего разряда.

Со следующим тактовым импульсом эта «1» будет сдвинута в триггер DD2 и окажется на его выходе. Одновременно в 1-ый триггер запишется «0». После 4-х тактовых импульсов параллельный код на выходах Q1—Q4 будет соответствовать последовательному входному.

После пятого тактового импульса сигнал, бывший на выходе Q4 выводится из регистра и пропадает. После 8 тактов регистр полностью очищен.

Дополнительная логика позволяет вводить информацию параллельно и снимать последовательно.

Сдвигающийся регистр может быть использован в качестве кольцевого счетчика или счетчика Джонса, который применяется для последовательного вывода информации без ее стирания.

Для этого информация с выхода регистра по цепи ОС снова вводится на вход. Пока на V единица, информация вводится в регистр по входу D и обратная связь не действует. За n тактов запоминается n разрядный код.

Затем на V устанавливается «0» тактовыми импульсами по входу С.

Информация с выхода Qn снова вводится в регистр одновременным последовательным (возможно и параллельным) считыванием и через n тактов находится в исходном состоянии.

К155ИР-1

Четырехразрядный регистр сдвига с последовательным или параллельным вводом информации и параллельным выводом (может быть и последовательным).
Он может выполнять:

· ввод информации параллельным кодом

· ввод информации последовательным кодом со сдвигом влево

· ввод информации последовательным кодом со сдвигом вправо

· хранение.

Регистр имеет:

· 2 тактовых входа С1 и С2.

· управляющий вход выбора режима V2

· 5 информационных входов (V1 для ввода в последовательном коде, D1-D4 для записи в параллельном коде)

· 4 выхода Q1-Q4.

Ввод информации параллельным кодом осуществляется при V2=1 и C2=0. Сдвиг информации в триггерах происходит по перепаду 1-0 на С2. Входы V1 и C1 при этом блокированы.

В этом же режиме по входам V2, С2 производится преобразование последовательного кода в параллельный со сдвигом влево. В этом случае поток информации происходит в обратном направлении. Для этого соединяют Q4 – D3, Q3 – D2, Q2 – D1.

Информация подается на D4. Сдвиг влево по перепаду 1-0 на С2.

V2 V1 С1 С2
X X 1à0 запись параллельного кода, сдвиг влево
вход 1à0 X запись последовательного кода, сдвиг вправо

Во избежание сбоев при смене состояний V2 должна происходить при C1=C2=0.

Ввод информации последовательным кодом: входная информация подается на V1, а тактовые импульсы на С1. Сдвиг вправо происходит при каждом перепаде 1à0 тактовых импульсов.

Дата добавления: 2017-01-26; просмотров: 2448;

Источник: https://poznayka.org/s84316t1.html

Регистры общего назначения, регистры ввода/вывода, стек, счетчик команд

Процессорное ядро микроконтроллеров:
– регистры общего назначения
– регистры ввода/вывода
– стек
– счетчик команд

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

Сегодня мы с вами продолжим более подробное изучение процессорного ядра микроконтроллера.
В прошлый раз мы рассмотрели арифметико-логическое устройство и организацию памяти микроконтроллера.

В этой статье я постараюсь кратко, но и в тоже время как можно подробнее рассмотреть оставшиеся вопросы:
– регистры общего назначения
– регистры ввода/вывода
– стек
– счетчик команд
и очень подробно, но чуть позже,  рассмотрим порты ввода/вывода.

Регистры общего назначения

Регистры общего назначения в любом микроконтроллере играют очень важную роль. В дальнейшем я буду сокращать их название – писать просто РОН.
РОН принимают участие в выполнении практически всех команд МК, и практически все данные проходят через них. В микроконтроллерах AVR имеется 32 РОН (и это очень хорошо, что их так много.

А к примеру, в МК PIC – всего один регистр).
Каждый РОН имеет свое имя: R0, R1, R2 ….. R29, R30, R31. Все РОН объединяются в один файл, который называется файл регистров общего назначения. Регистры общего назначения восьмиразрядные (однобайтовые).

Каждому РОН в области памяти данных (SRAM) отведен свой адрес – они занимают ячейки памяти с “нулевой” по “тридцать первую”, или в шестнадцатиричном исчислении – от $00 (0х00) до $1F (0x1F). Т.е., получается, что ячейки памяти SRAM с 0 по 31, одновременно являются и регистрами общего назначения.

Мы можем в программе прописать команду: “записать 255 в регистр R31″, а можем прописать: “записать 255 в 31 ячейку памяти данных”, – результат будет один и тот же.

Надо помнить, что физически РОН (как и рассматриваемые ниже регистры ввода/вывода) не входят в память данных, но для повышения эффективности работы МК и его производительности, РОН (и регистры ввода/вывода) располагаются в адресном пространстве памяти данных, и к ним можно обращаться как по их именам, так и как к ячейкам памяти ОЗУ (SRAM).

Так как все РОН восьмиразрядные (однобайтовые) то и оперировать они могут только с однобайтными данными.

В случае, если необходимо проводить операции с двухбайтными данными (шестнадцатиразрядными), то РОН с R26 по R31 могут образовывать сдвоенные регистры, которые в свою очередь могут выступать в роли самостоятельных шестандцатиразрядных регистров и тогда они имеют другие имена (такие сдвоенные регистры иногда называют “словом”, по аналогии с ячейками памяти программ):
R26 и R27 – сдвоенный регистр “Х”,
R28 и R29 – сдвоенный регистр “Y”,
R30 и R31 – сдвоенный регистр “Z”.
При этом первый регистр в такой паре (R26, или R28, или R30) играет роль младшего байта и обозначается дополнительной буквой “L”. Например: XL, YL, ZL.
Второй регистр в паре играет роль старшего байта и обозначается дополнительной буквой “H”. Например: XH, YH, ZH.
Это позволяет нам записать (или считать значение), к примеру, двухбайтовое число непосредственно в двойной регистр, обратившись к его буквенному обозначению X, Y или Z, а также считать любой байт (или записать в любой байт) выбрав буквенное обозначение младшего или старшего байта двойного регистра  (к примеру XL или XH).

Кроме того необходимо помнить, что хотя и все регистры общего назначения одинаковы, но не все из них могут участвовать в некоторых операциях. При этом, регистрам с R16 по R31 доступны все операции, а регистрам с R0 по R15 – не все.
И еще. В некоторых МК (Tiny) двойной регистр только один – Z (R30,R31).

В описание каждой команды указывается, какие РОН могут участвовать в данной операции, к примеру:

Регистры ввода/вывода

Как мы уже знаем, в МК присутствует много различных периферийных устройств. Кроме них, в МК есть и внутренние устройства. Всеми этими устройствами необходимо управлять, задавать необходимые режимы работы. Для этих целей в МК существуют регистры ввода/вывода.

Все регистры ввода/вывода (в дальнейшем буду писать РВВ) условно можно разделить на два типа:
служебные регистры микроконтроллера
регистры, относящиеся к конкретным периферийным устройствам
Все регистры ввода/вывода (как и РОН) занимают свое адресное пространство в памяти данных (SRAM) – от 32 до 95 (или в шестнадцатиричном счислении от $20 до $5F) и идут сразу за регистрами общего назначения, в так называемом адресном пространстве ввода/вывода. Каждый регистр восьмиразрядный и занимает память в один байт.
Всего МК может иметь 64 регистра ввода/вывода – максимальное число (за редким исключением). В тоже время, если МК простенький и в нем мало устройств, и он использует меньшее число РВВ, в области памяти данных все равно резервируется 64 адреса. Некоторым, слишком навороченным МК, стандартного значения в 64 РВВ недостаточно. В таких МК в адресном пространстве памяти данных выделяется еще дополнительно 160 ячеек памяти для дополнительных регистров ввода/вывода.

Еще раз напомню, что хотя РОН и РВВ выделяется место в памяти данных, но доступное пространство памяти данных для нас от этого не уменьшается, ведь физически они там не располагаются.

Если написано, что МК имеет память данных 128 байт, то значит мы можем использовать эти 128 байт в своих целях.

Просто первый адрес памяти данных будет начинаться не с нуля, как в памяти программ или энергонезависимой памяти.

Каждый регистр ввода/вывода имеет свой номер – от 0 до 63 (или в шестнадцатиричном виде – от $00 до $3F), который соответствует его адресу в адресном пространстве ввода/вывода.

Адрес РВВ в адресном пространстве ввода/вывода и адреса соответствующих им ячеек в ОЗУ (памяти данных) не совпадают. Если регистр имеет номер 0, то в адресном пространстве ОЗУ он будет занимать 32 ячейку памяти (ведь сначала идут 32 регистра общего назначения, а за ними уже – РВВ).

Для определения адреса РВВ в области памяти данных необходимо прибавить к его номеру 32.
Помимо номера, каждый регистр имеет свое имя (буквенную аббревиатуру) – для удобства программистов.

Для разных МК имена регистров, имеющих одинаковое назначение, обычно совпадают, а вот номер регистра может отличаться. Но это не так и важно, потому, что при программирование оперируют в основном именами регистров.

К примеру, для управления портом ввода-вывода (а их мы рассмотрим очень подробно в следующей статье) имеется три РВВ – один служит для задания направления работы порта (на вывод или ввод информации), второй для … рассмотрим в следующей статье. И так каждое устройство.

Кусочек из таблицы регистров ввода/вывода (первое число – номер регистра, и оно же его адрес в адресном пространстве РВВ, в скобках указывается адрес регистра в адресном пространстве памяти данных, т.е. номер +32):

Назначение и работу РВВ мы будем изучать постепенно, по мере изучения работы устройств МК.
Следующую статью мы посвятим изучению одного, но самого главного, чаще всего используемого в программах – регистру состояния, под названием SREG.

Стек

Стек, или указатель стека – это специальный регистр, который предназначен для организации стековой памяти.
Можно сказать, что стек (точнее стековая память, стек состоит из двух частей: указатель стека и стековая память) – это туннель с тупиком в конце, состоящий из ячеек памяти.

По мере заполнения ячеек памяти первые данные уходят в глубь стека, и добраться до них можно, только вытащив сначала последние введенные данные. Допустим, если мы запишем в стек последовательно три числа: 10,20 и 30, то для того, чтобы затем извлечь из стековой памяти число 10, предварительно придется извлечь числа 30 и 20. Т.е.

, значение записанное последним всегда будет прочитано первым.
Стек широко используются не только МК в своих целях, но и программистами.

К примеру, при выполнении команды перехода к подпрограмме, МК самостоятельно записывает в стек адрес следующей команды, с которой будет продолжено выполнение основной программы после возвращения из подпрограммы.

Возвращаясь из подпрограммы, МК извлекает этот адрес и загружает в счетчик команд, в результате чего выполнение программы продолжается с прерванного места.
Для нас тоже очень удобно сохранять в стеке данные при входе в подпрограмму, а затем извлекать их по возвращению из подпрограммы. Также удобно в стеке сохранять промежуточные результаты вычислений, а затем, по мере необходимости, извлекать их.

В микроконтроллерах, в которых отсутствует память данных (ОЗУ), а это часть МК семейства Tiny, стек организуется аппаратно. В таких МК стек располагается в собственной памяти а глубина его равна трем уровням.

Аппаратный стек не доступен программисту, его в своих целях использует только сам МК, сохраняя в нем адреса команд при переходе к подпрограммам. Так как возможности аппаратного стека мы использовать в своих целях не можем, то на этом и закончим его изучение.

Во всех остальных МК, которые имеют память данных, стек организуется программно. Стек в этом случае не имеет собственной памяти а использует память данных (ОЗУ). Такой стек доступен для наших целей и рассмотрим его подробней.

Для организации процесса записи данных в стек и их чтения предназначен указатель стека.

В качестве указателя стека используются один или два регистра ввода/вывода:
– если память данных небольшая (до 256 байт), используется один восьмиразрядный РВВ – SPL;
– если память данных большая (более 256 байт), к первому РВВ – SPL, добавляется второй – SPH, и вместе они составляют один шестнадцатиразрядный указатель стека.
В указателе стека содержится адрес ячейки памяти, в которую будут записаны или считаны данные.

Для программиста в системе команд МК есть две специальные команды:
PUSH – команда записи в стек
POP – команда чтения из стека
Давайте рассмотри как происходит запись в стек и чтение из него.

Запись данных в стек:
Для того, чтобы записать данные в стек, их предварительно необходимо загрузить в любой РОН.

По команде PUSH МК записывает данные из указанного нами РОН в память данных по адресу, на который указывает указатель стека, а затем уменьшает содержимое стека на 1 (если указатель восьмиразрядный) или на 2 (если указатель шестнадцатиразрядный). Новая команда PUSH запишет данные в следующую ячейку ОЗУ и опять уменьшит содержимое указателя стека. И так, далее.

Чтение данных из стека:
По команде POP, МК сначала увеличивает содержимое указателя стека на 1 или 2, а затем считывает данные с ячейки ОЗУ, на которую указывает указатель стека. И так, далее.

После сброса МК содержимое указателя стека равно нулю. Т.е. получается, что после сброса, указатель стека указывает на нулевую ячейку памяти ОЗУ.

А теперь смотрите, что получится, если мы попробуем что-то записать в стек:
– первая команда PUSH – содержимое РОН будет записано в нулевую ячейку памяти,а затем МК попытается уменьшить содержимое стека на 1 или 2 – и ни чего не получится – адрес ячейки памяти не может быть меньше нуля!
Поэтому, прежде чем пользоваться стековой памятью, необходимо записать в указатель стека значение его вершины – адрес конечной ячейки памяти с которой начнется запись в стек.
Обычно вершиной стека указывают адрес последней ячейки памяти данных. Если у вашего МК ОЗУ составляет 128 байт, то указывают адрес 128 ячейки памяти. Под стек можно использовать всю память, если только вы не будете хранить в ней свои переменные. Если в качестве вершины стека вы укажите конечную ячейку памяти, то следить за стековой памятью в большинстве случаев не обязательно. А если вершиной стека указать ячейку памяти поближе к началу, и при этом использовать ОЗУ для хранения своих данных, то следить за размерностью стека придется – он может залезть на ячейки в которых вы будете хранить свои данные.

Счетчик команд

Счетчик команд – представляет собой регистр, в котором содержится адрес следующей исполняемой команды.

Размер счетчика команд может быть от нескольких разрядов до шестнадцати (двухбайтовый). Размерность счетчика зависит об объема памяти программ. Счетчик команд не доступен для программиста, в него мы не можем ничего записать и не можем из него ничего считать. Работой счетчика команд руководит единолично МК.

При включении питания устройства или сброса микроконтроллера, счетчик команд устанавливается в ноль, т.е. указывает на нулевой адрес памяти программ. Поэтому адресу начинается наша программа (если мы не используем прерывания) или адрес, по которому начинается наша программа (если мы используем прерывания).

 При нормальном ходе программы содержимое счетчика команд автоматически увеличивается на 1 или 2 (в зависимости от выполняемой команды) в каждом машинном цикле. Т.е., после выполнения команды, счетчик будет указывать адрес следующей команды.

Этот порядок будет нарушен, если на пути МК при выполнении программы встретится команда перехода, команда вызова подпрограммы (или возврата из подпрограммы), а также при возникновении прерывания. В этом случае содержимое счетчика – адрес следующей команды, записывается в стек, а в счетчик записывается адрес по которому надо перейти по команде перехода или по прерыванию.

По команде возвращения из подпрограммы, в счетчик записывается адрес команды сохраненный в стеке, программа продолжается дальше. Все это проделывается автоматически, без нашего участия.

В продолжении этой статьи, а точнее – окончании, мы очень подробно рассмотрим порты ввода/вывода микроконтроллера.
После этого, вся теория пойдет вперемешку с практикой. Легче понимать работу микроконтроллера разрабатывая практическое устройство.
Расскажу немного о том, что будет дальше.

После портов ввода/вывода мы начнем собирать цифровой вольтметр, попутно изучая и необходимые для этого теоритические вопросы.
Вольтметр я буду собирать на основе МК ATiny26 – самый подходящий (как мне кажется) для этого микроконтроллер.

Для вывода информации, в целях изучения вопроса подключения к МК различных типов устройств для отображения информации, мы будем использовать сначала светодиодные сегментные индикаторы, которые потом заменим сегментным LCD дисплеем, который потом заменим буквенно-цифровым ЖК индикатором, а его, в свою очередь, если не погибнем в процессе, графическим ЖК индикатором. Затем добавим к вольтметру амперметр, а сверху этого бутерброда положим частотомер. Что будет дальше, честно говоря, я пока не знаю.

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

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

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

♦ Регистр состояния SREG
♦ Порты ввода/вывода микроконтроллера

Источник: http://radio-stv.ru/mikrokontrolleri/ustroystvo-i-programmirovanie-mikrokontrollerov-dlya-nachinayushhih/registryi-obshhego-naznacheniya-registryi-vvoda-vyivoda-stek-schetchik-komand

Регистры

Зачастую для начинающих «регистр» является наиболее сложно усваиваемой частью у микроконтроллеров. К сожалению, без этого понятия никак не обойтись, если есть желание заниматься микроконтроллерами. Для того, чтобы читатель смог ознакомиться с понятием регистра, данный материал упрощён до уровня начинающего.

Кнопки кассетного выключателя

Регистры можно сравнить с кнопочной панелью какого-либо домашнего устройства, где есть выключатели, которые можно включать и выключать. К примеру, кассетный магнитофон, который имел 6 кнопок:

  • Запись

  • Перемотка назад

  • Воспроизведение

  • Перемотка вперед

  • Стоп

  • Пауза

Каждая кнопка имеет свое предназначение, но только при правильном использовании. К примеру, кнопка «Стоп» не делает ничего раньше того, как запустить играть кассету, только после этого она сможет что-либо сделать – останавливает игру кассеты.

Кнопки перемотки «Вперед» или «Назад» можно в любой момент нажимать, т.к. лента начнет крутиться как во время игры кассеты, так и во время стопа.

Запись магнитофона начнется только в том случае, если нажать кнопку «Запись» вместе с кнопкой «Воспроизведение».

У регистров микроконтроллера, также как и у кнопок кассетного магнитофона, есть свои определенные функции. Конечно, в регистрах таких кнопок, как у магнитофона нет, но существует множество транзисторов, которые включают и выключают электричество.

У простейших микропроцессоров регистр состоит из электрических выключателей основанных на 8 транзисторах. Регистр можно рассмотреть на примере 8-битной системе счисления, где каждый бит указывает на состояние кнопки.

К примеру, значение бита 1 указывает на включенную кнопку, а 0 – на выключенную.

Положения «электрических выключателей» регистра и их битовые значения

Поскольку состояние выключателей регистра можно сравнить с числами и наоборот, то регистр можно сравнить с памятью, которая способна хранить данные размером в одно число. Благодаря этим сравнениям, мы пришли к тому, что на самом деле регистры это и есть ячейки памяти.

Задача ячейки памяти заключается обычно в том, чтобы хранить информацию, а в регистре эта информация чем-либо управляет. Если, в изображённый на рисунке регистр, вписать битовое значение 01100001, то 3 воображаемых выключателя нажимаются и что-то начинает происходить.

Если у кассетного магнитофона каждую кнопку можно включать по отдельности, то в регистрах изменение одного «выключателя» или бита происходит сложнее. В любом случае придётся изменить содержание всего регистра разом. Прежде чем говорить об изменении битов, необходимо знать, что регистров у микроконтроллеров много.

Для управления некоторых частей микроконтроллера могут использоваться десятки регистров. Обилие регистров означает то, что их необходимо как-то различать. Для этого используются имена, например, название одного из регистров – PORTB.

На самом деле имена регистров придуманы для упрощения работы разработчиков и всего лишь замещают цифровые адреса.

В программе языка Си для записывания или чтения значения регистра необходимо к нему обратиться как к переменной. Следующий пример демонстрирует запись бинарного значения в выдуманный регистр REG и чтение этого значения в переменную reg. Перед бинарным значением пишется 0b (впереди ноль), чтобы компилятор понял систему счисления.

REG = 0b01100001; unsigned char reg = REG;

В записи и чтении значений регистров ничего сложного нет, сложность появляется тогда, когда необходимо изменить значение отдельных битов в регистре.

Для изменения битов сначала необходимо изучить бинарные операции и различные системы счисления.

Никто не запрещает использовать бинарные числа, но работа с ними неудобна в связи с их длиной и обычно используют шестнадцатеричные числа, которые короче.

Шестнадцатеричные числа

В отличие от бинарной системы, где числа 0 и 1 или от десятичной системы, где числа от 0 до 9, в шестнадцатеричной системе – от 0 до F. Одно шестнадцатеричное число образуется из четырех битов.

На приведённой таблице показаны шестнадцатеричные числа и соответствующие им бинарные числа. Очерёдность их считывания слева направо и их нумерация начинается с нуля.

Впереди приведено бинарное значение регистра 01100001, которое в шестнадцатеричной системе счисления соответствует 61, а на языке Си пишется как 0x61 (впереди ноль).

Для изменения отдельных битов в числе (регистре, переменной или где-либо ещё), нужно использовать бинарные операции.

Бинарная операция – это операция между бинарными числами, где между битами этих чисел происходят отдельные логические операции.

В большинстве микроконтроллеров используется четыре бинарных операции, у каждой из которых несколько названий. Далее приведена соответствующая всем четырём бинарным операциям логическая операция с отдельным битом или битами.

Отрицание, логическое умножение, логическое сложение и неравнозначность

~~PB~~

  • Отрицание / Инверсия
    Отрицание изменяет значение бита на противоположное, т.е. 0 меняется на 1 и 1 меняется на 0. На языке Си знак отрицания “~“.

  • Логическое умножение / Конъюнкция
    При умножении двух битов ответ будет 1, только в случае, если оба бита были 1, во всех других случаях ответ будет 0. В языке Си знак умножения “&“.

  • Логическое сложение / Дизъюнкция
    При сложении двух битов ответ будет 1, если хотя бы значение одного бита 1, во всех других случаях ответ будет 0. В языке Си знак сложения „|“.

  • Неравнозначность / Исключающая дизъюнкция
    При операции неравнозначности между двумя битами ответ будет 1, если значения битов отличаются друг от друга, во всех других случаях ответ будет 0. В языке Си знак неравнозначности «^».

Всё вышеприведённое необходимо для изменения значений отдельных битов. Но одной лишь теории будет недостаточно, поэтому далее приведены некоторые типичные примеры с регистрами.

Операция настройки бита высоким

Для того, чтобы один или несколько битов в регистре настроить высокими т.е. единицей, необходимо использовать операцию логического сложения.

Один операнд операции сложения должен быть регистром, второй бинарным числом, где высокий только тот бит, который желают настроить высоким и в регистре. Это второе бинарное число называют битовой маской.

Рядом изображенная операция на языке Си выглядит следующим образом:

// Предположим, что REG = 0x0F REG = REG | 0x11; // Первый метод REG |= 0x11; // Второй метод // Здесь REG = 0x1F

Операция настройки бита низким

Для того, чтобы один или несколько битов настроить низкими, т.е. нулём, необходимо использовать операцию логического умножения. Один операнд операции должен быть регистром, другой битовой маской, где низким настроен только тот бит, который желают настроить низким и в регистре. Изображённая рядом операция на языке Си выглядит следующим образом:

// Предположим, что REG = 0x0F REG = REG & 0xFE; // Первый метод REG &= 0xFE; // Второй метод // Здесь REG = 0x0E

~~PB~~

Операция инвертирования бита

Для инвертирования одного или нескольких битов в регистре необходимо использовать операцию неравнозначности. Один из операндов операции должен быть регистром, второй битовой маской, где высоким настроен только тот бит, который желают инвертировать и в регистре. Операция, изображенная рядом, на языке Си выглядит следующим образом:

// Предположим, что REG = 0x0F REG = REG ^ 0x11; // Первый метод REG ^= 0x11; // Второй метод (применить разом можно только один) // Здесь REG = 0x1E

Операция инвертирования битов

Для инвертирования битов всего регистра, необходимо использовать операцию отрицания. У данной операции только один операнд. Операция, изображенная рядом, на языке Си выглядит следующим образом:

// Предположим, что REG = 0x0F REG = ~REG; // Здесь REG = 0xF0

Операция чтения бита

Для чтения одного или нескольких значений бита из регистра, необходимо использовать ту же операцию, что и при обнулении – логическое умножение. Один из операндов операции должен быть регистром, другой битовой маской, где высоким настроен только тот бит, значение которого желают считать из регистра. Операция, изображённая рядом, выглядит на языке Си следующим образом:

// Предположим, что REG = 0x0F unsigned char x = REG & 0x01; // Здесь x = 0x01

~~PB~~

На самом деле, во многих языках программирования помимо бинарных операций, существуют и некоторые битовые операции, которые облегчают работу программистов. Такими являются операции смещения бита, которые в бинарном числе смещают биты налево или направо. Основная ценность операций по смещению состоит в том, что они способны превращать разряды битов в битовую маску и наоборот.

Сдвижение бита влево

На указанном рядом изображении, приведён пример операции по сдвигу бита влево. Сдвижение не является логической операцией и у него отсутствует соответствующее обозначение, а на языке Си это “«“.

Сдвиг влево используется для превращения битового разряда в битовую маску. Например, если желают маску 6 бита (NB! разряд 5), то требуется число 1 сдвинуть влево 5 раз.

Операция, приведённая в примере, выглядеть на языке Си следующим образом:

REG = 0x01 5;
// Здесь значение x – 0x01 (т.е. просто 1)

Если в операции сдвижения бита, бит сдвигается из низкого разряда вправо или из высокого влево, то он исчезает. В некоторых языках программирования существуют вращающиеся операции сдвижения битов, где бит не исчезает, а двигается из одного конца в другой. На языке Си вращающиеся операции сдвижения бита отсутствуют, но при желании их можно написать самим.

Все переведённые примеры операций работают помимо регистров и с переменными и константами. Последние могут быть только операндами, а не ответами.

Для того, чтобы сделать что-либо реальное с регистрами микроконтроллера, требуется знать как пользоваться конкретным микроконтроллером. К каждому микроконтроллеру прилагается одна или несколько спецификаций, которая описывает структуру и функциональность микроконтроллера. В спецификации описаны и регистры. Далее изучим, как разобраться в описании регистров в спецификации AVR.

Один регистр AVRиз его спецификации

На изображении приведён регистр UCSRnA микроконтроллера ATmega128, полное название которого “USART Control and Status Register A“. Это регистр, с помощью которого конфигурируется модуль USART AVR-а и с которого можно считать состояния этого модуля.

Все названия регистров AVR пишутся заглавными буквами, но внимательный читатель заметит, что в этом регистре есть маленькая буква n. Маленькой буквой n обозначается индекс какого-нибудь модуля.

Так как в ATmega128 есть 2 очень похожих USART модуля, то в регистре они не записываются вдвойне, а только один раз и вместо буквы n должен читатель вставлять „0“ или „1“. Из чего следует, что в ATmega128 есть регистры UCSR0A и UCSR1A.

Содержимое регистра отмечено в ящике с 8 ячейками, выделенным толстой линией. Каждая ячейка обозначает один бит. Над ящиком приведена очерёдность битов, они возрастают справа налево. Так как AVR – это 8-битный микроконтроллер, большинство регистров так же 8-битные.

Есть некоторые исключения в виде 16-битных регистров, которые состоят из двух 8-битных регистров. Вдобавок к регистрам название имеет каждый бит регистра, так же как и кнопки магнитофона. В спецификации имеется объяснение к каждому биту. Названия битов – это так же сокращения и букву n в них следует заменить индексом модуля.

В некоторых регистрах использованы не все биты, и в этом случае ячейка бита обозначается знаком тире.

Под битами регистра приведены две строки, где написано, является ли бит читаемым (R), записываемым (W) или и тем и другим (R/W).

Например, бит состояния нельзя переписать, и даже в случае, если это пытаются сделать в программе, не принимает бит желаемого значения.

В случае с битом, который можно только записывать, указано одно конкретное значение, которое появляется всегда при его чтении. Во второй стоке под битами указано стандартное значение, которое есть у бита после запуска микроконтроллера (англ. reset).

Если названия регистров AVR указывают на действительный адрес в гнезде памяти, то за названиями битов скрываются их порядковые номера. Исходя из этого, при манипуляции с битами, следует названия битов при помощи операции сдвижения преобразовать в битовую маску. Далее приведены некоторые примерные предложения на языке Си, используемые для регистра модуля USART 0.

// Установка бита TXC0 высоким UCSR0A |= (1

Источник: http://home.roboticlab.eu/ru/avr/registers

Ссылка на основную публикацию
Adblock
detector
",css:{backgroundColor:"#000",opacity:.6}},container:{block:void 0,tpl:"
"},wrap:void 0,body:void 0,errors:{tpl:"
",autoclose_delay:2e3,ajax_unsuccessful_load:"Error"},openEffect:{type:"fade",speed:400},closeEffect:{type:"fade",speed:400},beforeOpen:n.noop,afterOpen:n.noop,beforeClose:n.noop,afterClose:n.noop,afterLoading:n.noop,afterLoadingOnShow:n.noop,errorLoading:n.noop},o=0,p=n([]),h={isEventOut:function(a,b){var c=!0;return n(a).each(function(){n(b.target).get(0)==n(this).get(0)&&(c=!1),0==n(b.target).closest("HTML",n(this).get(0)).length&&(c=!1)}),c}},q={getParentEl:function(a){var b=n(a);return b.data("arcticmodal")?b:(b=n(a).closest(".arcticmodal-container").data("arcticmodalParentEl"),!!b&&b)},transition:function(a,b,c,d){switch(d=null==d?n.noop:d,c.type){case"fade":"show"==b?a.fadeIn(c.speed,d):a.fadeOut(c.speed,d);break;case"none":"show"==b?a.show():a.hide(),d();}},prepare_body:function(a,b){n(".arcticmodal-close",a.body).unbind("click.arcticmodal").bind("click.arcticmodal",function(){return b.arcticmodal("close"),!1})},init_el:function(d,a){var b=d.data("arcticmodal");if(!b){if(b=a,o++,b.modalID=o,b.overlay.block=n(b.overlay.tpl),b.overlay.block.css(b.overlay.css),b.container.block=n(b.container.tpl),b.body=n(".arcticmodal-container_i2",b.container.block),a.clone?b.body.html(d.clone(!0)):(d.before("
"),b.body.html(d)),q.prepare_body(b,d),b.closeOnOverlayClick&&b.overlay.block.add(b.container.block).click(function(a){h.isEventOut(n(">*",b.body),a)&&d.arcticmodal("close")}),b.container.block.data("arcticmodalParentEl",d),d.data("arcticmodal",b),p=n.merge(p,d),n.proxy(e.show,d)(),"html"==b.type)return d;if(null!=b.ajax.beforeSend){var c=b.ajax.beforeSend;delete b.ajax.beforeSend}if(null!=b.ajax.success){var f=b.ajax.success;delete b.ajax.success}if(null!=b.ajax.error){var g=b.ajax.error;delete b.ajax.error}var j=n.extend(!0,{url:b.url,beforeSend:function(){null==c?b.body.html("
"):c(b,d)},success:function(c){d.trigger("afterLoading"),b.afterLoading(b,d,c),null==f?b.body.html(c):f(b,d,c),q.prepare_body(b,d),d.trigger("afterLoadingOnShow"),b.afterLoadingOnShow(b,d,c)},error:function(){d.trigger("errorLoading"),b.errorLoading(b,d),null==g?(b.body.html(b.errors.tpl),n(".arcticmodal-error",b.body).html(b.errors.ajax_unsuccessful_load),n(".arcticmodal-close",b.body).click(function(){return d.arcticmodal("close"),!1}),b.errors.autoclose_delay&&setTimeout(function(){d.arcticmodal("close")},b.errors.autoclose_delay)):g(b,d)}},b.ajax);b.ajax_request=n.ajax(j),d.data("arcticmodal",b)}},init:function(b){if(b=n.extend(!0,{},a,b),!n.isFunction(this))return this.each(function(){q.init_el(n(this),n.extend(!0,{},b))});if(null==b)return void n.error("jquery.arcticmodal: Uncorrect parameters");if(""==b.type)return void n.error("jquery.arcticmodal: Don't set parameter \"type\"");switch(b.type){case"html":if(""==b.content)return void n.error("jquery.arcticmodal: Don't set parameter \"content\"");var e=b.content;return b.content="",q.init_el(n(e),b);case"ajax":return""==b.url?void n.error("jquery.arcticmodal: Don't set parameter \"url\""):q.init_el(n("
"),b);}}},e={show:function(){var a=q.getParentEl(this);if(!1===a)return void n.error("jquery.arcticmodal: Uncorrect call");var b=a.data("arcticmodal");if(b.overlay.block.hide(),b.container.block.hide(),n("BODY").append(b.overlay.block),n("BODY").append(b.container.block),b.beforeOpen(b,a),a.trigger("beforeOpen"),"hidden"!=b.wrap.css("overflow")){b.wrap.data("arcticmodalOverflow",b.wrap.css("overflow"));var c=b.wrap.outerWidth(!0);b.wrap.css("overflow","hidden");var d=b.wrap.outerWidth(!0);d!=c&&b.wrap.css("marginRight",d-c+"px")}return p.not(a).each(function(){var a=n(this).data("arcticmodal");a.overlay.block.hide()}),q.transition(b.overlay.block,"show",1*")),b.overlay.block.remove(),b.container.block.remove(),a.data("arcticmodal",null),n(".arcticmodal-container").length||(b.wrap.data("arcticmodalOverflow")&&b.wrap.css("overflow",b.wrap.data("arcticmodalOverflow")),b.wrap.css("marginRight",0))}),"ajax"==b.type&&b.ajax_request.abort(),p=p.not(a))})},setDefault:function(b){n.extend(!0,a,b)}};n(function(){a.wrap=n(document.all&&!document.querySelector?"html":"body")}),n(document).bind("keyup.arcticmodal",function(d){var a=p.last();if(a.length){var b=a.data("arcticmodal");b.closeOnEsc&&27===d.keyCode&&a.arcticmodal("close")}}),n.arcticmodal=n.fn.arcticmodal=function(a){return e[a]?e[a].apply(this,Array.prototype.slice.call(arguments,1)):"object"!=typeof a&&a?void n.error("jquery.arcticmodal: Method "+a+" does not exist"):q.init.apply(this,arguments)}}(jQuery)}var debugMode="undefined"!=typeof debugFlatPM&&debugFlatPM,duplicateMode="undefined"!=typeof duplicateFlatPM&&duplicateFlatPM,countMode="undefined"!=typeof countFlatPM&&countFlatPM;document["wri"+"te"]=function(a){let b=document.createElement("div");jQuery(document.currentScript).after(b),flatPM_setHTML(b,a),jQuery(b).contents().unwrap()};function flatPM_sticky(c,d,e=0){function f(){if(null==a){let b=getComputedStyle(g,""),c="";for(let a=0;a=b.top-h?b.top-h{const d=c.split("=");return d[0]===a?decodeURIComponent(d[1]):b},""),c=""==b?void 0:b;return c}function flatPM_testCookie(){let a="test_56445";try{return localStorage.setItem(a,a),localStorage.removeItem(a),!0}catch(a){return!1}}function flatPM_grep(a,b,c){return jQuery.grep(a,(a,d)=>c?d==b:0==(d+1)%b)}function flatPM_random(a,b){return Math.floor(Math.random()*(b-a+1))+a}