Рейтинг@Mail.ru
Сдвиговый регистр 74HC595
Сдвиговый регистр 74HC595

Как подключить сдвиговый регистр 74HC595 к Arduino

aave автор: aave
1 comment Arduino
Print Friendly, PDF & Email

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

Нам понадобится:

1Описание и назначение сдвигового регистра 74HC595

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

Схема выводов («распиновка») приведена на рисунке слева.

Назначение выводов сдвигового регистра 74HC595 и внешний вид в выводном корпусе DIP-16
Назначение выводов сдвигового регистра 74HC595 и внешний вид в выводном корпусе DIP-16

Назначение выводов микросхемы 74HC595 такое.

Обозначение выводаНазначение
Q0…Q7 выходы параллельных данных;
GND земля (0 В);
Q7' выход последовательных данных;
MR сброс ведущего устройства (активный низкий);
SHCP вход тактовых импульсов сдвигового регистра;
STCP вход тактовых импульсов «защёлки»;
OE разрешение вывода (активный низкий);
DS вход последовательных данных;
VCC питание +5 В.

Конструктивно микросхема выполняется в нескольких типах корпусов; я буду использовать микросхему в выводном корпусе DIP-16, т.к. его проще использовать с макетной платой (бредбордом).

2Краткое описание интерфейса SPI

Коротко напомню о последовательном интерфейсе SPI, который мы будем использовать для передачи данных в сдвиговый регистр. SPI – это четырёхпроводный двунаправленный последовательный интерфейс, в котором принимают участие ведущее и ведомое устройства. Ведущим в нашем случае будет являться Arduino, ведомым – регистр 74HC595.

Среда разработки для Arduino имеет встроенную библиотеку работы по интерфейсу SPI. При её применении используются цифровые выводы с 10 по 13 на платах Arduino Uno и Arduino Nano; также они продублированы и выведены на отдельный разъём ICSP:

Выводы Arduino, отведённые под SPI
Выводы Arduino, отведённые под SPI
Обозначение выводаНазначение
SCLK вывод тактовых импульсов SPI;
MOSI данные от ведущего – к ведомому;
MISO данные от ведомого к ведущему;
SS выбор ведомого.

3Подключение сдвигового регистра74HC595 к Arduino

Давайте соберём схему, которая показана на рисунке.

Схема подключения сдвигового регистра 74HC595 к Arduino
Схема подключения сдвигового регистра 74HC595 к Arduino

Вот таблица подключений:

Вывод свдигового регистра 74HC595Вывод Arduino
VCC5V
GNDGND
DS11 (MOSI)
STCP10 (CS)
SHCP13 (SCK)
Q7'12 (MISO)
OE#GND
MR#5V

Вывод OE# подключим к земле, чтобы разрешение на вывод данных было всегда активно. А вывод MR# подключим к питанию, таким образом заблокируем случайный сброс устройства.

На монтажной плате 8-штырьковый разъём типа PLS – это выход, с которого будем снимать параллельные данные сдвигового регистра.

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

Подключение сдвигового регистра 74HC595 к Arduino
Подключение сдвигового регистра 74HC595 к Arduino

4Тестовый скетч для изучения работы регистра сдвига

Напишем вот такой скетч и загрузим в память Arduino. Здесь мы по циклу будем записывать два числа – 210 и 0 – в сдвиговый регистр с небольшими временными интервалами между ними. Да, только и всего.

Скетч записи данных в сдвиговый регистр (разворачивается)
#include <SPI.h> // подключаем библиотеку SPI

void setup() {
  SPI.begin();  // инициализируем SPI
  pinMode(PIN_SPI_SS, OUTPUT); 
}

void loop() {
    digitalWrite(PIN_SPI_SS, LOW); // выбор регистра сдвига
    SPI.transfer(210); // передаём число "210" в сдвиговый регистр
    digitalWrite(PIN_SPI_SS, HIGH); // конец передачи
    delay(10); // задержка 10 мсек

    digitalWrite(PIN_SPI_SS, LOW);  
    SPI.transfer(0);                
    digitalWrite(PIN_SPI_SS, HIGH); 
    delay(90);
}

PIN_SPI_SS – это внутренняя стандартная константа, которая соответствует выводу "10" Ардуино в режиме SPI. Данная константа определена в файле pins_arduino.h, который находится по пути %programfiles%\arduino-(версия)\hardware\arduino\avr\variants\ Также там определены константы PIN_SPI_MOSI (пин 11), PIN_SPI_MISO (пин 12), PIN_SPI_SCK (пин 13). В ранних версиях Arduino IDE (например, 1.6.хх) этих констант не было.

В принципе, мы могли бы с таким же успехом использовать любой другой цифровой вывод Arduino; тогда пришлось бы в программе объявить его и не забыть задать режим работы – OUTPUT.

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

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

Опять всё начинается с выбора ведомого и генерирования 8-ми тактовых импульсов (первый и второй каналы сверху). Данные на линии SPI - MOSI теперь – "0000 0000" (3-ий сверху канал). То есть мы записываем в этот момент в регистр число "0". Но пока передача не закончена, в регистре по прежнему хранится значение "1101 0010", которое мы выставили ранее. Оно выводится на параллельные выводы Q0..Q7 (8 нижних каналов на рисунке), а также, при наличии тактовых импульсов в линии SPI - CLOCK, выдаётся в линию SPI - MISO (см. 4-ый канал сверху) c последовательного выхода регистра Q7', что мы тут и видим.

6Подключение нескольких регистров сдвига к Arduino

Если подключить несколько сдвиговых регистров таким образом, чтобы линии CLOCK (SCLK на рисунке ниже), MOSI и MISO у них были общие, а ENABLE (SS на рисунке) каждой микросхемы подключались к разным цифровым выводам Arduino, то можно независимо обращаться к каждому из сдвиговых регистров, активизируя низким уровнем соответствующий из них, и записывать в регистры данные и считывать из них данные. Такое подключение называется независимым.

Независимый и каскадный типы подключений по интерфейсу SPI

Независимое подключение ведомых SPI устройств (например, регистров 74HC595) к ведущему (например, Arduino) изображено на левой части рисунка. Думаю, это уже достаточно просто для нас, так как оно почти ничем не отличается от подключения одного сдвигового регистра. Поэтому давайте рассмотрим другой тип подключения – каскадный.

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
Каскадное подключение трёх сдвиговых регистров к 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 в действии

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

Таким образом, мы детально изучили вопрос информационного обмена между ведущим устройством, в роли которого выступил Arduino, и сдвиговым регистром 74HC595. Научились подключать сдвиговый регистр, записывать в него данные и считывать из него данные.

Демонстрация каскадного подключения регистров сдвига 74HC595 к Arduino
Last modified onПонедельник, 10 Апрель 2023 20:36 Read 38353 times
Ключевые слова: :

Поблагодарить автора:

Поделиться

Print Friendly, PDF & Email

1 comment

  • Александр
    Александр Воскреснье, 26 Апрель 2020 05:41 Ссылка на комментарий

    Спасибо огромное за подробный разбор алгоритма работы SPI , разбирались весь вечер со сдвиговым регистром 74HC595 с ребенком.

Leave a comment