использовать
Сериализация и распараллеливание битовых комбинаций
Регистры сдвига являются частью преобразователей между последовательными и параллельными данными. Сериализация или распараллеливание битовых комбинаций может быть реализовано с использованием регистров сдвига. В случае сериализации должна быть возможность загружать соответствующую битовую комбинацию в сдвиговый регистр параллельно; ЧАС. каждому триггеру нужен вход нагрузки. Иначе уже было бы серийное представление. В случае распараллеливания каждый триггер должен иметь читаемый выход, чтобы значения всего сдвигового регистра могли считываться параллельно в определенный момент времени. Интерфейс SPI, используемый большинством µ-контроллеров, представляет собой систему шин на основе регистра сдвига, с которой логические модули SR могут использоваться непосредственно в качестве параллельных выходов (портов).
Битовый сдвиг в машинных языках
В большинстве машинных языков есть команда сдвига для регистров. Благодаря этому вы можете часто даже быстрее умножать на машинном языке, сдвигая и складывая, чем с помощью общей команды умножения / алгоритма умножения. Например, вы можете быстрее умножить на 320, сначала скопировав регистр, затем сдвинув один регистр на 8 бит (умножение на 256) и сдвинув другой регистр на 6 бит (умножение на 64), а затем сложив два регистра. Кроме того, когда бит сдвигается, выпавший бит не пропускается, но обычно сохраняется во флаге в регистре флагов и затем может обрабатываться дальше. Различают логическое и арифметическое скольжение при скольжении. При арифметическом сдвиге положительные числа остаются положительными, а отрицательные — отрицательными. Старший бит для этого не меняется.
Умножение двоичных чисел
Умножение двух двоичных чисел выполняется путем сдвига и сложения (например, по алгоритму Бута ). В микропроцессорах это достигается с помощью регистров сдвига. Таким образом, сигнал данных включается. З. Если, например, сигнал находится в состоянии «высокий», он смещается к следующему биту.
Использовать как буфер
Для фильтрации оцифрованных сигналов процессор сигналов буферизует фиксированное количество значений. Это можно сделать в регистрах сдвига.
Циклический контроль избыточности
Циклический избыточный код ( английский циклический контроль избыточности, CRC ) с банкой по исключающему ИЛИ воротам выполнены в регистре аппаратного сдвига с обратной связью.
5Временная диаграмма работы микросхемы 74HC595
Общий вид временной диаграммы – на рисунке. Голубой пунктирной линией показаны 4 линии SPI, красной пунктирной – 8 каналов параллельных данных регистра сдвига. Точка A на шкале времени – это момент передачи в регистр сдвига числа «210», B – момент записи числа «0», C – завершение текущей итерации цикла и начало новой.
Временная диаграмма работы микросхемы 74HC595
Как видно, от А до B – 10,03 миллисекунд, а от B до С – 90,12 миллисекунд, почти как мы и задали в скетче. Небольшая добавка в 0,03 и 0,12 мс – время передачи последовательных данных от Arduino, поэтому мы тут имеем не ровно 10 и 90 мс.
Рассмотрим подробнее участок A.
Обратите внимание на временной масштаб. Теперь это микросекунды, а на предыдущем были миллисекунды
То есть это сильно укрупнённый по сравнению с первой диаграммой участок.
Диаграмма передачи числа «11010010» по SPI
В первом канале сверху – длинный импульс с нулевым уровнем, которым Arduino инициализирует передачу по линии SPI — ENABLE – выбор ведомого. В это время начинают генерироваться тактовые импульсы SPI — CLOCK (см. второй сверху канал). Для передачи одного байта генерируется 8 тактовых импульсов.
Третий канал сверху – SPI — MOSI – данные, которые мы передаём от Arduino к сдвиговому регистру. Это наше число «210» в двоичном виде – «1101 0010».
После завершения передачи линия SPI — ENABLE поднимается в высокое состояние, и мы видим, что сдвиговый регистр выставил на своих 8-ми ножках значение «1101 0010». Я выделил это голубой пунктирной линией и подписал значения для наглядности.
Теперь обратим внимание на участок B. Диаграмма передачи числа «00000000» по SPI
Диаграмма передачи числа «00000000» по SPI
Опять всё начинается с выбора ведомого и генерирования 8-ми тактовых импульсов (первый и второй каналы сверху). Данные на линии SPI — MOSI теперь – «0000 0000» (3-ий сверху канал). То есть мы записываем в этот момент в регистр число «0». Но пока передача не закончена, в регистре по прежнему хранится значение «1101 0010», которое мы выставили ранее. Оно выводится на параллельные выводы Q0..Q7 (8 нижних каналов на рисунке), а также, при наличии тактовых импульсов в линии SPI — CLOCK, выдаётся в линию SPI — MISO (см. 4-ый канал сверху) c последовательного выхода регистра Q7′, что мы тут и видим.
Последовательный вход и параллельный выход (SIPO)
Эта конфигурация позволяет преобразовать последовательный формат в параллельный. Ввод данных является последовательным, как описано в разделе SISO выше. После того, как данные были синхронизированы, они могут быть либо считаны на каждом выходе одновременно, либо их можно сдвинуть.
В этой конфигурации каждый триггер запускается по фронту . Все триггеры работают на заданной тактовой частоте. Каждый входной бит направляется к N-му выходу после N тактов, что приводит к параллельному выходу.
В случаях, когда параллельные выходы не должны изменяться в процессе последовательной загрузки, желательно использовать фиксированный или буферизованный выход. В регистре сдвига с защелкой (например, 74595 ) последовательные данные сначала загружаются во внутренний буферный регистр, а затем после приема сигнала загрузки состояние буферного регистра копируется в набор выходных регистров. В общем, практическое применение сдвигового регистра последовательного ввода / параллельного вывода состоит в преобразовании данных из последовательного формата на одном проводе в параллельный формат на нескольких проводах.
3Подключение сдвигового регистра74HC595 к Arduino
Давайте соберём схему, которая показана на рисунке.
Схема подключения сдвигового регистра 74HC595 к Arduino
Вот таблица подключений:
Вывод свдигового регистра 74HC595 | Вывод Arduino |
---|---|
VCC | 5V |
GND | GND |
DS | 11 (MOSI) |
STCP | 10 (CS) |
SHCP | 13 (SCK) |
Q7′ | 12 (MISO) |
OE# | GND |
MR# | 5V |
Вывод OE# подключим к земле, чтобы разрешение на вывод данных было всегда активно. А вывод MR# подключим к питанию, таким образом заблокируем случайный сброс устройства.
На монтажной плате 8-штырьковый разъём типа PLS – это выход, с которого будем снимать параллельные данные сдвигового регистра.
Я также подключу ко всем ножкам микросхемы регистра сдвига логический анализатор. С помощью него мы увидим, что же происходит на физическом уровне, какие сигналы куда идут, и разберёмся, что они означают. У меня получилось так, как показано на фотографии.
Подключение сдвигового регистра 74HC595 к Arduino
Преимущества использования сдвигового регистра 74HC595:
- не требует никакой обвязки кроме конденсатора по питанию;
- работает через широкораспостраненный интерфейс SPI;
- для самого простого включения достаточно двух выходов микроконтроллера;
- возможность практически неограниченного расширения количества выходов без увеличения занятых выходов микроконтроллера;
- частота работы до 100 МГц;
- напряжение питания от 2 В до 6 В;
- дешевый — стоит менее 5 центов;
- выпускается как в планарных корпусах (74HC595D удобен для производства), так и в DIP16 (74HC595N удобен для радиолюбителей и макетирования).
Для понимания работы регистра стоит взглянуть на функциональную схему. Она состоит из:
- 8-битного регистра сдвига,
- 8-битного регистра хранения,
- 8-битного выходного регистра.
Рассмотрим какие выводы есть у сдвигового регистра 74hc595.
Общего вывод и вывод питания объяснений не требуют.
- GND — земля
- VCC — питание 5 вольт
2Краткое описание интерфейса SPI
Коротко напомню о последовательном интерфейсе SPI, который мы будем использовать для передачи данных в сдвиговый регистр.
SPI – это четырёхпроводный двунаправленный последовательный интерфейс, в котором принимают участие ведущее и ведомое устройства. Ведущим в нашем случае будет являться Arduino, ведомым – регистр 74HC595.
Среда разработки для Arduino имеет встроенную библиотеку работы по интерфейсу SPI. При её применении используются цифровые выводы с 10 по 13 на платах Arduino Uno и Arduino Nano; также они продублированы и выведены на отдельный разъём ICSP:
Выводы Arduino, отведённые под SPI
Обозначение вывода | Назначение |
---|---|
SCLK | вывод тактовых импульсов SPI; |
MOSI | данные от ведущего – к ведомому; |
MISO | данные от ведомого к ведущему; |
SS | выбор ведомого. |
D-триггер
Кратко затронем самые основы. Глобально, электронику можно разделить на два раздела: аналоговый и цифровой. Принципиальная особенность второго заключается в том, что сигналы задаются дискретными уровнями напряжения. Притом дискретных уровня всего два. Таким образом, вместо того, чтобы записывать напряжение в вольтах, достаточно просто называть один из двух дискретных уровней. Так и появляются названия «ноль» и «единица». В действительности, они определяют некоторые уровни напряжения, которые могут быть какими угодно. Хотя, в большинстве случаев, «ноль» обозначает уровень 0 Вольт, а «единица» уровень 5 В, 3.3 В, 1.8 В, 1.5 В и т.д. Таким образом, фраза «на входе ноль, на выходе единица» обозначает: «на входе напряжение, соответствующее уровню ноль, на выходе напряжение, соответствующее уровню единица».
Двигаемся далее. Теперь у нас есть цифровой сигнал, что же интересного можно с ним сделать? Подать на D-триггер и посмотреть, что будет! Но сначала дадим пару определений.
На электрической схеме устройства D-триггер выглядит ровно так же, как на рисунке ниже. Такой вид триггера обязательно имеет три вывода: D (вход), C (вход синхронизации, вход тактирования, тактовый вход, clk, clock) и Q (выход). Помимо них могут иметься еще: инвертированный выход, входы сброса и установки значения на выходе, вход разрешения работы. Однако, суть работы заключается именно во взаимодействии трех обязательных выводов, поэтому именно их мы и рассмотрим.
рис. 1 — условное графическое обозначение D-триггера
Принцип работы D-триггера следующий: при подаче тактового сигнала на вход C, состояние на выходе становится равным состоянию на входе. Т. е. если в какой-то момент времени на входе был «ноль», а на выходе «единица», то в момент подачи тактового сигнала выход примет состояние входа и станет «нулём».
Начальное состояние |
Состояние после подачи тактового импульса |
||
Вход (D) |
Выход (Q) |
Вход (D) |
Выход (Q) |
1 |
|||
1 |
1 |
1 |
|
1 |
1 |
1 |
1 |
Отдельно стоит обсудить фразу «подача тактового сигнала». Дело в том, что срабатывание триггера (перенос значения от входа к выходу) может происходить по разным событиям. Например, когда на тактовом входе установлена логическая единица или логический ноль. Или по фронту импульса на тактовом входе, т.е. в момент перехода нуля в единицу или единицы в ноль. То, каким образом срабатывает триггер, зависит от его конструкции и обозначается на схеме специальными символами. На приведенном рисунке изображен триггер, срабатывающий по нарастающему фронту.
Заметим, что сигнал на выходе никак не меняется без подачи тактового сигнала. Это позволяет использовать D-триггер как буфер. Мы подаем тактовый сигнал, триггер считывает состояние на входе и передает его на выход. После этого мы можем хранить считанное значение в триггере, сколько нам нужно, даже когда значение на входе уже стало другим. На этом заканчивается краткий обзор принципов работы D-триггера, и мы переходим к регистрам сдвига.
Десятичный счетчик.
Десятичный счетчик состоит из декадных счетчиков, причем
число декадных счетчиков равно максимальному разряду десятичных чисел, которые
счетчик может считать. Каждый декадный счетчик является двоично-десятичным. Он
считает в двоично-десятичном коде от 0 до 10. При поступлении на вход декадного
счетчика десятого импульса все его выходы устанавливаются в нулевое состояние.
Схема декадного счетчика и временные диаграммы показаны на рис.2.
Рис. 2. Декадный счетчик.
Временные диаграммы. Структурная схема.
Благодаря обратной связи инвертирующего выхода третьего
триггера со входом первого триггера на входе первого триггера J = Q3
= 1, пока не пришел и не закончился восьмой импульс. После окончания восьмого
импульса Q3 = 0. В соответствии с таблицей состояний
JK-триггера выход первого триггера (на рис. 2 второй справа) Q1 = 0,
так как для него J = Q3 = 0; К = 1. Второй триггер (на рис.
13.3 а третий справа) является Т-триггером, так как у него J = К = 1 = const,
и управляется он срезом импульса Q1. В соответствии с временными диаграммами
(рис.2) его переключение произойдет лишь после 14-го импульса. Третий триггер
имеет J = J1 = J2 = 0; К = K1 = К2
= 1. По окончании десятого импульса он переключается в нулевое состояние срезом
импульса Q. Из временных диаграмм видно, что после десятого импульса
выходы всех триггеров находятся в нулевом состоянии. Если выход Q3
подать на вход С нулевого триггера следующего декадного счетчика, то на выходе
этого триггера Q становится равным 1 по окончании импульса Q3
первого декадного счетчика. Очевидно, что первый декадный счетчик считает
единицы, а второй — десятки.
Делитель частоты
Делитель
частоты — электронное устройство, уменьшающее в целое число раз частоту
подводимых к нему периодических колебаний. Их используют в синтезаторах
частоты, кварцевых часах, в телевизионных устройствах синхронизации генераторов
развёрток и др. Для деления частоты применяют: электронный счётчик (см. Триггер),
самовозбуждающийся генератор синусоидальных колебаний и т.д..
Делители частоты считают входные
импульсы до некоторого задаваемого коэффициентом счета состояния, а затем
формируют сигнал переключения триггеров в нулевое состояние, вновь начинают
счет входных импульсов до задаваемого коэффициента счета.
Регистры
Регистр — последовательное логическое устройство, используемое для
хранения n-разрядных двоичных чисел и выполнения преобразований над ними.
Регистр представляет собой
упорядоченную последовательность триггеров, число которых соответствует числу
разрядов в слове. С каждым регистром обычно связано комбинационное цифровое
устройство, с помощью которого обеспечивается выполнение некоторых операций над
словами. Фактически любое цифровое устройство можно представить в виде
совокупности регистров, соединенных друг с другом при помощи комбинационных
цифровых устройств.
Регистры классифицируются по
следующим видам:
1.Параллельные
или накопительные (регистры памяти, хранения);
2.Последовательные
или сдвигающие.
В свою очередь сдвигающие
регистры делятся:
·по способу ввода-вывода информация: параллельные;
последовательные; комбинированные;
·по направлению передачи информации:
однонаправленные; реверсивные.
Типичными являются следующие
операции:
·прием
слова в регистр;
·передача
слова из регистра;
·поразрядные
логические операции;
·сдвиг
слова влево или вправо на заданное число разрядов;
·преобразование
последовательного кода слова в параллельный и обратно;
·установка
регистра в начальное состояние (сброс)
Элементарной
ячейкой электронной памяти является триггер, способный сохранять 1 бит
записанной в нем информации. Регистром называется устройство из триггеров, предназначенное
для записи, хранения и выдачи информации. Каждый разряд двоичного числа
записывается в своем триггере, поэтому число триггеров в регистре определяет
разрядность записываемого числа. Наиболее распространенным видом регистров
являются регистры сдвига.
1Описание и назначение сдвигового регистра 74HC595
Сдвиговый регистр 74HC595 и ему подобные используются в качестве устройств преобразования последовательных данных в параллельные, а также может использоваться как «защёлка» для данных, удерживая заданное состояние.
Схема выводов («распиновка») приведена на рисунке слева.
Назначение выводов сдвигового регистра 74HC595 и внешний вид в выводном корпусе DIP-16
Назначение выводов микросхемы 74HC595 такое.
Обозначение вывода | Назначение |
---|---|
Q0…Q7 | выходы параллельных данных; |
GND | земля (0 В); |
Q7′ | выход последовательных данных; |
MR | сброс ведущего устройства (активный низкий); |
SHCP | вход тактовых импульсов сдвигового регистра; |
STCP | вход тактовых импульсов «защёлки»; |
OE | разрешение вывода (активный низкий); |
DS | вход последовательных данных; |
VCC | питание +5 В. |
Конструктивно микросхема выполняется в нескольких типах корпусов; я буду использовать микросхему в выводном корпусе DIP-16, т.к. его проще использовать с макетной платой (бредбордом).
Объяснение программы для Raspberry Pi
Полный код программы приведен в конце статьи, здесь же мы кратко рассмотрим его основные фрагменты.
После того, как все необходимые соединения в схеме сделаны, мы можем подать питание на Raspberry Pi и после загрузки ее операционной системы можно начать писать программу в ней на Python. Подробнее о том, как это можно сделать, можно прочитать в статье про мигание светодиода с помощью Raspberry Pi.
В программе нам первым делом необходимо подключить (импортировать) библиотеку для работы с контактами ввода/вывода. Также мы импортируем эту библиотеку RPi.GPIO под именем “IO” (то есть переименовываем ее для использования в программе), то есть далее в программе всегда, когда мы захотим обратиться к контактам ввода/вывода, мы будем использовать слово ‘IO’.
Python
import RPi.GPIO as IO
1 | importRPi.GPIO asIO |
Иногда контакты ввода/вывода (GPIO pins), которые мы собираемся использовать в программе, могут выполнять другие функции. В этом случае во время исполнения программы мы будем получать предупреждения (warnings). Следующей командой мы укажем плате Raspberry Pi на то, чтобы она игнорировала эти предупреждения и продолжала исполнение программы.
Python
IO.setwarnings(False)
1 | IO.setwarnings(False) |
Мы можем обращаться к контактам ввода/вывода (GPIO pins) платы Raspberry Pi используя либо номер контакта на плате, либо его функциональный номер. В представленной выше распиновке контактов ввода/вывода можно увидеть, к примеру, что обозначение GPIO5 соответствует контакту PIN 29. То есть в зависимости от того, какой способ обращения к контактам мы выбрали, мы можем обращаться к рассмотренному контакту либо по номеру ‘29’, либо по номеру ‘5’. В данном проекте мы выберем способ обращения к контактам по их функциональным номерам, поэтому используем следующую команду:
Python
IO.setmode (IO.BCM)
1 | IO.setmode(IO.BCM) |
Далее мы сконфигурируем контакты GPIO4, GPIO5 и GPIO6 в качестве цифровых выходов – с них будет осуществляться управление регистром сдвига.
Python
IO.setup(4,IO.OUT)
IO.setup(5,IO.OUT)
IO.setup(6,IO.OUT)
1 |
IO.setup(4,IO.OUT) IO.setup(5,IO.OUT) IO.setup(6,IO.OUT) |
Далее запишем команду цикла, который будет исполняться 8 раз.
Python
for y in range(8):
1 | foryinrange(8) |
Также в программе мы будем использовать команду «While 1:» – она будет формировать бесконечный цикл. Внутри этого цикла все команды будут исполняться непрерывно.
7Каскадное подключение регистров сдвига к Arduino
Давайте подключим три регистра сдвига 74HC595 к Arduino и попробуем управлять ими по SPI.
В разделе 3 этой статьи была дана схема подключения одного регистра 74HC595 к Arduino. Схема, когда к Arduino подключены несколько ведомых устройств в каскадном режиме, отличается не сильно. Основное отличие в том, что используется один пин выбора ведомого, который активирует одновременно все подключённые устройства (пин SS Arduino подключён ко всем входам STCP), а также данные из ведущего (выход MOSI Arduino) передаются первому в цепочке ведомому 74HC595 на вход последовательных данных DS, тот в свою очередь из последовательного порта Q7′ передаёт данные следующему ведомому на последовательный вход DS, и так далее. Последний ведомый из своего порта Q7′ передаёт данные ведущему в линию MISO, но в нашем случае это не обязательно. Остальные выводы сдвиговых регистров подключены так же, как на предыдущей схеме. У Arduino же используются те же 4 стандартных пина SPI, что и при подключении к единственному регистру сдвига.
Соберём в соответствии с этим нашу схему. У меня получилось как-то так:
Каскадное подключение трёх сдвиговых регистров к Arduino – вид со стороны параллельных выходов 74HC595 Каскадное подключение трёх сдвиговых регистров к Arduino – вид со стороны пинов управления 74HC595
Теперь напишем скетч для «бегущей волны», но теперь она будет немного длиннее. В моём случае – из 19-ти светодиодов, каждый из которых будет представлять один из разрядов параллельных выходов (на все 24 не хватило места на монтажке).
Скетч «бегущей волны» со сдвиговым регистром (разворачивается)
#include <SPI.h> void setup() { pinMode(PIN_SPI_SS, OUTPUT); SPI.begin(); Serial.begin(9600); } void loop() { for (int i=0; i<20; i++) { //вообще, тут нужно писать i<25, т.к. всего параллельных выходов у трёх регистров 24 unsigned long num = (long)1<<i; // "гоним" горящий огонёк по разрядам, сдвигая единицу на 1 разряд влево каждую итерацию /* * 19 (или 24) разрядов числа поместятся только в беззнаковый long * unsigned long может хранить до 32-х разрядов. * Т.к. у нас три сдвиговых регистра или 3*8=24 бит, то используем этот тип данных */ /* * Реализация SPI в Arduino такова, что можно передавать числа либо байтами, либо словами по 2 байта. * Поэтому делим наше число на байты, их получается 3, как и регистров сдвига: */ byte a = (byte)num; //младшие 8 бит числа byte b = (byte)(num>>8);//средние 8 бит числа byte c = (byte)(num>>16); //старшие 8 бит числа digitalWrite(PIN_SPI_SS, LOW); // начинаем передачу по SPI SPI.transfer(c); //передаём старший байт числа SPI.transfer(b); //передаём средний байт числа SPI.transfer(a); //передаём младший байт числа digitalWrite(PIN_SPI_SS, HIGH); // завершаем передачу по SPI // Контрольный вывод в COM-порт: Serial.print((String)i + ": "); Serial.print(num, HEX); Serial.print("="); Serial.print(c, HEX); Serial.print(","); Serial.print(b, HEX); Serial.print(","); Serial.println(a, HEX); delay(100); // задержимся немного } }
Обратите внимание, мы обращались к параллельным выходам 3-х сдвиговых регистров как к большому 24-разрядному числу. Но что делать, если вы подключили к Arduino большее количество 74HC595? Такими большими числами Arduino, конечно же, оперировать не умеет
В таком случае придётся работать с байтами. То есть передавать в каждый регистр своё 8-разрядное значение.
А вот так это выглядит в действии:
Каскадное подключение трёх сдвиговых регистров к Arduino в действии
На видео в конце статьи результат наглядно показан в динамике. К каждому из трёх сдвиговых регистров подключены светодиоды своего цвета – красные, зелёные и синие, и видно, как наше число «перескакивает» с регистра в регистр.
Таким образом, мы детально изучили вопрос информационного обмена между ведущим устройством, в роли которого выступил Arduino, и сдвиговым регистром 74HC595. Научились подключать сдвиговый регистр, записывать в него данные и считывать из него данные.
Пример 2: Использование нескольких сдвиговых регистров
В этом примере к цепи добавляется еще один сдвиговый регистр, удваивающий количество входных контактов. При этом количество контактов, используемых на Arduino (т.е. три), останется неизменным.
Если 8 дополнительных цифровых контактов для вашего проекта недостаточно, вы можете подключить к цепи еще один сдвиговый регистр. Впрочем, он будет передавать данные на Arduino не напрямую, а через первый сдвиговый регистр, т.е. в результате первый регистр будет передавать на Arduino 16-битный (8 бит от одного регистра и 8 бит от другого) поток данных. Если вы хотите использовать в своем проекте несколько сдвиговых регистров, обязательно проверьте, чтобы они поддерживали не только синхронный последовательный вывод данных (т.е. «synchronous serial output»), но и синхронный последовательный ввод данных (т.е. «synchronous serial input»). Синхронный последовательный ввод данных – это функция, которая позволяет первому сдвиговому регистру получать и отправлять выходные последовательные данные от второго регистра. То, как работает эта система, показано на графике ниже. Более того, эту «гирляндную» цепь можно расширить (но в разумных пределах), добавив еще сдвиговых регистров.
Ввод данных -> | | Ввод данных -> | C | Ввод данных -> | D | Ввод данных -> | 4 | -> Передача последовательных данных на Arduino Ввод данных -> | | Ввод данных -> | 2 | <- Передача тактовых данных от Arduino Ввод данных -> | 1 | <- Передача «защелкивающих» данных от Arduino Ввод данных -> |_____| <------ | | | _______ | Последовательные данные, передаваемые Ввод данных -> | | | первому сдвиговому регистру Ввод данных -> | C | | Ввод данных -> | D | | Ввод данных -> | 4 | ______| Ввод данных -> | | Ввод данных -> | 2 | <- Передача тактовых данных от Arduino Ввод данных -> | 1 | <- Передача «защелкивающих» данных от Arduino Ввод данных -> |_____|
Добавляем второй сдвиговый регистр.
Соединяем сдвиговые регистры друг с другом. Два «интерфейсных» контакта второго сдвигового регистра (для тактового сигнала и «защелкивания») можно подключить к тем же контактам Arduino, которые использует первый регистр (речь о clockPin и latchPin). Это желтый и зеленый провода. Дополнительный синий провод нужен для того, чтобы передать последовательные данные от второго регистра (они выходят из него через контакт Q8) первому (они поступают в него через контакт SERIAL-IN).
Подключаем еще 8 переключателей
Обратите внимание, что среди них 7 тумблеров и лишь 1 нажимная кнопка – это сделано для удобства пользователя. Дело в том, что переключатели на втором регистре будут работать чем-то вроде «файла настроек», а не триггерами, запускающими какие-либо события
То есть 7 тумблеров отвечают за различные настройки, а оставшаяся кнопка, добавленная для наглядности, предназначена для включения/выключения режима изменения этих настроек.
Так будет выглядеть вся схема:
Ниже – скетчи, которые можно использовать вместе с этой цепью:
- Привет, мир!
- Использование второго байта для настроек; печатаются все
- Использование второго байта для настроек; печатаются только «вкл» (используется подфункция)
2Краткое описание интерфейса SPI
Коротко напомню о последовательном интерфейсе SPI, который мы будем использовать для передачи данных в сдвиговый регистр.
SPI – это четырёхпроводный двунаправленный последовательный интерфейс, в котором принимают участие ведущее и ведомое устройства. Ведущим в нашем случае будет являться Arduino, ведомым – регистр 74HC595.
Среда разработки для Arduino имеет встроенную библиотеку работы по интерфейсу SPI. При её применении используются цифровые выводы с 10 по 13 на платах Arduino Uno и Arduino Nano; также они продублированы и выведены на отдельный разъём ICSP:
Выводы Arduino, отведённые под SPI
Обозначение вывода | Назначение |
---|---|
SCLK | вывод тактовых импульсов SPI; |
MOSI | данные от ведущего – к ведомому; |
MISO | данные от ведомого к ведущему; |
SS | выбор ведомого. |
6Подключение нескольких регистров сдвига к Arduino
Если подключить несколько сдвиговых регистров таким образом, чтобы линии CLOCK (SCLK на рисунке ниже), MOSI и MISO у них были общие, а ENABLE (SS на рисунке) каждой микросхемы подключались к разным цифровым выводам Arduino, то можно независимо обращаться к каждому из сдвиговых регистров, активизируя низким уровнем соответствующий из них, и записывать в регистры данные и считывать из них данные. Такое подключение называется независимым.
Независимый и каскадный типы подключений по интерфейсу SPI
Независимое подключение ведомых SPI устройств (например, регистров 74HC595) к ведущему (например, Arduino) изображено на левой части рисунка. Думаю, это уже достаточно просто для нас, так как оно почти ничем не отличается от подключения одного сдвигового регистра. Поэтому давайте рассмотрим другой тип подключения – каскадный.
Контакты
* Звёздочкой отмечены контакты, существующие только когда атрибут Параллельная загрузка включен.
- Западный край, верхний контакт (вход, разрядность равна 1)
- Сдвиг: когда на нём 1 или он не подключен, все ступени сдвигаются при срабатывании тактового входа; но если на нём 0, никакого сдвига не происходит. Этот вход игнорируется, если на входе Загрузка 1.
- Западный край, средний контакт (вход, разрядность соответствует атрибуту Биты данных)
- Данные: при продвижении ступеней значение с этого входа загружается в первую ступень.
- Западный край, нижний контакт, отмечен треугольником (вход, разрядность равна 1)
- Тактовый вход: в момент срабатывания этого входа, как указано в атрибуте Срабатывание, компонент может сдвинуть ступени или загрузить новые значения.
- *Северный край, левый контакт (вход, разрядность равна 1)
- Загрузка: когда на этом входе 1, значения с остальных контактов на северном крае загружаются во все ступени при следующем срабатывании тактового входа. Когда на нём 0 или он не подключен, никакой загрузки не происходит.
- *Северный край, остальные контакты (вход, разрядность соответствует атрибуту Биты данных)
- Данные: эти значения загружаются во все ступени при срабатывании тактового входа, пока на входе Загрузка 1. Крайний левый вход соответствует младшей ступени.
- Южный край, левый контакт (вход, разрядность равна 1)
- Очистка: когда значение равно 1, все ступени асинхронно сбрасываются на 0, и все другие входы игнорируются.
- *Южный край, остальные контакты (выход, разрядность соответствует атрибуту Биты данных)
- Выход: выдаёт значение, хранящееся в каждой ступени; младшая ступень отражена в крайнем левом контакте (рядом со входом Очистка).
- Восточный край (выход, разрядность соответствует атрибуту Биты данных)
- Выход: выдаёт значение, хранящееся в последней (старшей) ступени.
1Описание и назначение сдвигового регистра 74HC595
Сдвиговый регистр 74HC595 и ему подобные используются в качестве устройств преобразования последовательных данных в параллельные, а также может использоваться как «защёлка» для данных, удерживая заданное состояние.
Схема выводов («распиновка») приведена на рисунке слева.
Назначение выводов сдвигового регистра 74HC595 и внешний вид в выводном корпусе DIP-16
Назначение выводов микросхемы 74HC595 такое.
Обозначение вывода | Назначение |
---|---|
Q0…Q7 | выходы параллельных данных; |
GND | земля (0 В); |
Q7′ | выход последовательных данных; |
MR | сброс ведущего устройства (активный низкий); |
SHCP | вход тактовых импульсов сдвигового регистра; |
STCP | вход тактовых импульсов «защёлки»; |
OE | разрешение вывода (активный низкий); |
DS | вход последовательных данных; |
VCC | питание +5 В. |
Конструктивно микросхема выполняется в нескольких типах корпусов; я буду использовать микросхему в выводном корпусе DIP-16, т.к. его проще использовать с макетной платой (бредбордом).
1Описание и назначение сдвигового регистра 74HC595
Сдвиговый регистр 74HC595 и ему подобные используются в качестве устройств преобразования последовательных данных в параллельные, а также может использоваться как «защёлка» для данных, удерживая заданное состояние.
Схема выводов («распиновка») приведена на рисунке слева.
Назначение выводов сдвигового регистра 74HC595 и внешний вид в выводном корпусе DIP-16
Назначение выводов микросхемы 74HC595 такое.
Обозначение вывода | Назначение |
---|---|
Q0…Q7 | выходы параллельных данных; |
GND | земля (0 В); |
Q7′ | выход последовательных данных; |
MR | сброс ведущего устройства (активный низкий); |
SHCP | вход тактовых импульсов сдвигового регистра; |
STCP | вход тактовых импульсов «защёлки»; |
OE | разрешение вывода (активный низкий); |
DS | вход последовательных данных; |
VCC | питание +5 В. |
Конструктивно микросхема выполняется в нескольких типах корпусов; я буду использовать микросхему в выводном корпусе DIP-16, т.к. его проще использовать с макетной платой (бредбордом).
строительство
Простейшая форма регистра сдвига состоит из последовательного соединения четырех D-триггеров ведущий-ведомый.
Структура 4-битного регистра сдвига с последовательным и параллельным вводом и выводом; Выходной буфер на параллельном выходе
4-битный регистр сдвига, показанный на этом рисунке, по существу основан на фактическом регистре сдвига, состоящем из триггеров D00, D10, D20 и D30. Подключения определяются следующим образом:
- Значение может считываться параллельно через соединения d0 — d3.
- Значение, хранящееся в регистре сдвига, может считываться параллельно через соединения Q0 — Q3.
- Значение может считываться последовательно через соединение ввода данных (DI) и считываться последовательно через соединение вывода данных (DO).
- Для управления используются соединения Clock (CLK), Load (LD) и Enable (EN).
Входящие и исходящие данные
Соединения для ввода и вывода данных могут выполнять разные функции в зависимости от схемы подключения:
- Последовательное чтение при вводе данных и последовательный вывод данных при выводе данных.
- Построение кольцевого регистра путем соединения вывода данных с соединением ввода данных.
- Последовательное расширение регистра сдвига для включения дополнительных регистров сдвига для обработки слова большей ширины. Для этого соединение для вывода данных соединяется с соединением для ввода данных последующего регистра сдвига.
Часы
При положительном фронте на входе тактовой частоты бит, хранящийся в соответствующих триггерах, выводится на выходе, тем самым передается на следующий входной вентиль (D00 → D11; D10 → D21 и т. Д.) И удерживается до следующего положительного фронта. происходит на входе часов.
Нагрузка
Если вход нагрузки установлен на высокий уровень, считываются биты триггеров восходящего потока (или входа DI), подаваемые на входные вентили (D01, D11, D21 и D31). С другой стороны, если входная нагрузка низкая, бит восходящего триггера (или входа DI) игнорируется и вместо этого считывается бит на соответствующем параллельном входе. Считанный бит передается на следующий триггер (или вывод DO).
Если параллельное чтение не требуется, вентили D01, D11, D21 и D31, а также входы с d0 по d3 могут быть опущены, а выходы триггеров (или вывода данных) могут быть напрямую подключены к входам последующие триггеры (или вход данных) подключаются.
Давать возможность
Вход разрешения управляет выходным буфером, состоящим из вентилей D02, D12, D22 и D32. В случае положительного фронта битовая комбинация, хранящаяся в регистре сдвига, берется из выходного буфера и выводится на параллельный выход с подключениями Q0 к Q3. Значение сохраняется до тех пор, пока на разрешающем входе не появится еще один положительный фронт.
Если выходной буфер не требуется, разрешающий вход и вентили D02, D12, D22 и D32 могут быть опущены. В этом случае выходы с Q0 по Q3 подключаются непосредственно к выходу соответствующих триггеров регистра сдвига.
Структура двунаправленного регистра сдвига
Для реализации двунаправленного сдвигового регистра требуются либо два сдвиговых регистра, либо трехсторонние вентили, которые могут динамически переключать внутренние соединения регистра.
При использовании двух регистров сдвига параллельный вход одного регистра пересекается с параллельным входом другого регистра и наоборот. Это позволяет копировать значение из регистра сдвига влево в регистр сдвига вправо и наоборот.