Вам понадобится
  • - Arduino;
  • - сдвиговый регистр 74HC595;
  • - соединительные провода.
Инструкция
1
Сдвиговый регистр 74HC595 и ему подобные используются в качестве устройств преобразования последовательных данных в параллельные, а также может использоваться как "защёлка" для данных, удерживая переданное на него состояние.
Схема выводов ("распиновка") приведена на рисунке слева. Их назначение такое.
Q0...Q7 - выходы параллельных данных;
GND - земля (0 В);
Q7' - выход последовательных данных;
^MR - сброс ведущего устройства (активный низкий);
SHcp - вход тактовых импульсов сдвигового регистра;
STcp - вход тактовых импульсов "защёлки";
^OE - разрешение вывода (активный низкий);
Ds - вход последовательных данных;
Vcc - питание +5 В.
Конструктивно микросхема выполняется в нескольких типах корпусов; я буду использовать тот, что приведён на рисунке справа - выводной - т.к. его проще использовать с макетной платой (бредбордом).
2
Коротко напомню о последовательном интерфейсе SPI, который мы будем использовать для передачи данных в сдвиговый регистр.
SPI - это четырёхпроводный двунаправленный последовательный интерфейс, в котором принимают участие ведущее и ведомое устройства. Ведущим в нашем случае будет являться Arduino, ведомым - регистр 74HC595.
Среда разработки для Arduino имеет встроенную библиотеку работы по интерфейсу SPI. При её применении используются выводы, которые отмечены на рисунке:
SCLK - вывод тактовых импульсов SPI;
MOSI - данные из ведущего - к ведомому;
MISO - данные от ведомого к ведущему;
SS - выбор ведомого.
3
Давайте соберём схему, как на рисунке.
Я также подключу ко всем ножкам микросхемы регистра сдвига логический анализатор. С помощью него мы увидим, что же происходит на физическом уровне, какие сигналы куда идут, и разберёмся, что они означают. Должно получиться примерно как на фотографии.
4
Напишем вот такой скетч и загрузим в память Arduino.
Переменная PIN_SPI_SS - это внутренняя стандартная константа, которая соответствует выводу "10" Ардуино при использовании его в качестве ведущего устройства интерфейса SPI, который мы тут используем. В принципе, мы могли бы с таким же успехом использовать любой другой цифровой вывод Arduino; тогда нам бы пришлось его объявить и задать его режим работы.
Подавая на этот вывод LOW, мы активизируем наш сдвиговый регистр на приём/передачу. После передачи мы снова поднимаем напряжение в HIGH, и обмен заканчивается.
5
Включим нашу схему в работу и посмотрим, что покажет нам логический анализатор. Общий вид временной диаграммы - на рисунке.
Голубой пунктирной линией показаны 4 линии SPI, красной пунктирной - 8 каналов параллельных данных регистра сдвига.
Точка A на шкале времени - это момент передачи в регистр сдвига числа "210", B - момент записи числа "0", C - повторение цикла с начала.
Как видно, от А до B - 10,03 миллисекунд, а от B до С - 90,12 миллисекунд, почти как мы и задали в скетче. Небольшая добавка в 0,03 и 0,12 мс - это время передачи последовательных данных от Arduino, поэтому мы тут имеем не ровно 10 и 90 мс.
6
Рассмотрим подробнее участок A.
В самом верху - длинный импульс, которым Arduino инициализирует передачу по линии SPI-ENABLE - выбор ведомого. В это время начинают генерироваться тактовые импульсы SPI-CLOCK (вторая строка сверху), 8 штук (для передачи 1 байта).
Следующая строка сверху - SPI-MOSI - данные, которые мы передаём от Arduino к сдвиговому регистру. Это наше число "210" в двоичном виде - "11010010".
После завершения передачи, в момент завершения импульса SPI-ENABLE, мы видим, что сдвиговый регистр выставил на своих 8-ми ножках такое же значение. Я выделил это в голубой пунктирной линией и подписал значения для наглядности.
7
Теперь обратим внимание на участок B.
Опять всё начинается с выбора ведомого и генерирования 8-ми тактовых импульсов.
Данные на линии SPI-MOSI теперь - "0". То есть мы записываем в этот момент в регистр число "0".
Но пока передача не закончена, в регистре хранится значение "11010010". Оно выводится на параллельные выводы Q0..Q7, и выдаётся при наличии тактовых импульсов в линии c параллельного выхода Q7' в линию SPI-MISO, что мы тут и видим.
8
Таким образом, мы детально изучили вопрос информационного обмена между ведущим устройством, в роли которого выступил Arduino, и сдвиговым регистром 74HC595. Научились подключать сдвиговый регистр, записывать в него данные и считывать из него данные.