Знакомство с микросхемой регистра сдвига 74HC595 — управление 16 светодиодами — 74HC595

Операции в регистрах

Типичными являются следующие операции:

  • приём слова в регистр (установка состояния);
  • передача слова из регистра;
  • сдвиг слова влево или вправо на заданное число разрядов в сдвиговых регистрах;
  • преобразование последовательного кода слова в параллельный и обратно;
  • установка регистра в начальное состояние (сброс).

Как работает регистр сдвига?

Прежде чем мы начнем подключать чип, давайте рассмотрим, как этот процесс работает.

Первое, что нужно прояснить, — это понятие «биты» для тех из вас, кто не знаком с двоичным кодом. Когда мы говорим о «битах», мы имеем в виду одно из чисел, составляющих двоичное значение. В отличие от обычных чисел, мы обычно считаем, что первый бит является самым большим. Итак, если мы берем двоичное значение 10100010, первый бит на самом деле равен 0, а восьмой бит равен 1. Следует также отметить, если это не подразумевалось, каждый бит может быть только 0 или 1.

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

Чтобы записать эти выходы через Arduino, мы должны отправить двоичное значение в регистр сдвига, и из этого числа сдвиговый регистр может определить, какие выходы использовать. Например, если мы отправили двоичное значение 10100010, контакты, выделенные зеленым цветом на изображении выше, будут активными, а выделенные красным цветом будут неактивными.

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

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

Преимущества использования сдвигового регистра 74HC595:

  • не требует никакой обвязки кроме конденсатора по питанию;
  • работает через широкораспостраненный интерфейс SPI;
  • для самого простого включения достаточно двух выходов микроконтроллера;
  • возможность практически неограниченного расширения количества выходов без увеличения занятых выходов микроконтроллера;
  • частота работы до 100 МГц;
  • напряжение питания от 2 В до 6 В;
  • дешевый — стоит менее 5 центов;
  • выпускается как в планарных корпусах (74HC595D удобен для производства), так и в DIP16 (74HC595N удобен для радиолюбителей и макетирования).

Для понимания работы регистра стоит взглянуть на функциональную схему. Она состоит из:

  • 8-битного регистра сдвига,
  • 8-битного регистра хранения,
  • 8-битного выходного регистра.

74hc595_functional

Рассмотрим какие выводы есть у сдвигового регистра 74hc595.

Общего вывод и вывод питания объяснений не требуют.

  • GND — земля
  • VCC — питание 5 вольт

Технические параметры

Серия 74HC
Тип логичекого элемента сдвиговый регистр
Тип выхода 3-state
Кол-во элементов 1
Кол-во бит на элемент 8
Функция serial to parallel, serial
Напряжение питания, В 2…6
Рабочая температура, °C -40…+125
Корпус soic-16(3.9мм)
Вес, г 0.3

Входы 74HC595:

OE

Вход переводящий выходы из высокоимпедансного состояние в рабочее состояние. При логической единице на этом входе выходы 74HC595 будут отключены от остальной части схемы. Это нужно например для того чтобы другая микросхема могла управлять этими сигналами.
Если нужно включить в рабочее состояние микросхеме подайте логический ноль на этот вход. А если в принципе не нужно переводить выходы в высокоимпедансное состояние – смело заземляйте этот вывод.

Смотрите также:   Как выбрать батарейку для устройства - основные виды и размеры батареек

MR — сброс регистра

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

DS – вход данных

Последовательно подаваемые сюда данные будут появляются на 8-ми выходах регистра в параллельной форме.

STCP – вход «защёлкивающий» данные

Что бы данные появились на выходах Q0…Q7 нужно подать логическую единицу на вход STCP. Данные поступают в параллельный регистр который сохряняет их до следующего импульса STCP.

SHCP – вход для тактовых импульсов

Когда на тактовом входе SHCP появляется логическая единица, бит находящийся на входе данных DS считывается и записывается в самый младший разряд сдвигового регистра. При поступлении на тактовый вход следующего импульса высокого уровня, в сдвиговый регистр записывается следующий бит со входа данных. Тот бит который был записан ранее сдвигается на один разряд (из Q0 в Q1) , а его место занимает вновь пришедший бит. И так далее по цепочке.

Подключение сдвигового регистра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 – это выход, с которого будем снимать параллельные данные сдвигового регистра.

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

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

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

Скетч записи данных в сдвиговый регистр (разворачивается)#include // подключаем библиотеку 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-(версия)hardwarearduinoavrvariants Также там определены константы PIN_SPI_MOSI (пин 11), PIN_SPI_MISO (пин 12), PIN_SPI_SCK (пин 13). В ранних версиях Arduino IDE (например, 1.6.хх) этих констант не было.

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

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

Начинаем с 8 светодиодов

Для первой части урока нам понадобятся следующие комплектующие:

  • Arduino Uno
  • Макетная плата
  • Ардуино сдвиговый регистр 74HC595
  • 8 светодиодов
  • 8 резисторов – 220 ом должно хватить
  • Провода/перемычки
Смотрите также:   Электрическое напряжение-определение, объяснение простыми словами, единица измерения, формула

Собираем схему

Для начала подключим контакты 16 (VCC) и 10 (SRCLR) к выходу 5v на Arduino и соединяем выводы 8 (GND) и 13 (OE) с выводом Gnd на Arduino. Pin 13 (OE) используется для включения выходов, так как это активный низкий контакт, который мы можем подключить непосредственно к земле.

Затем нам нужно соединить три контакта, которыми мы будем управлять сдвиговым регистром:

  • Pin 11 (SRCLK) сдвигового регистра 74HC595 на пин 11 на Arduino — это будет называться «синхронизирующим пином»,
  • Pin 12 (RCLK) сдвигового регистра на пин 12 на Arduino — это будет обозначаться как «пин защелка»,
  • Pin 14 (SER) сдвигового регистра на пин 13 на Arduino — это будет называться «пином данных»,

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

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

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

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

Как управлять 8 светодиодами в данной схеме?

Прежде чем приступить к практике, необходимо будет проверить подключение всех элементов и загрузить в микроконтроллер скетч следующего содержания:

Сдвиговый регистр и ArduinoArduino <текстареа wrap=»soft» class=»crayon-plain print-no» data-settings=»dblclick» readonly=»» style=»-moz-tab-size:4; -o-tab-size:4; -webkit-tab-size:4; tab-size:4; font-size: 14px !important; line-height: 16px !important;»>
//Контакт SH_CP
int SH_CP = 10;
//Контакт ST_CP
int ST_CP = 9;
//Контакт DS
int DS = 8;

void setup() {
// Настроим выходы SH_CP, ST_CP, DS
pinMode(SH_CP, OUTPUT);
pinMode(ST_CP, OUTPUT);
pinMode(DS, OUTPUT);
}

void loop() {
for (int i = 0; i < 256; i++) {
// Вызовем начало приема данных
digitalWrite(ST_CP, LOW);
// Последовательная передача данных на Контакт DS
shiftOut(DS, SH_CP, MSBFIRST, i);
// Вызовем окончание передачи данных.
// Теперь сдвиговый регистр подаст напряжение на указанные выходы
digitalWrite(ST_CP, HIGH);
// Задержка в 1 секунду
delay(1000);
}
}

123456789101112131415161718192021222324252627 //Контакт SH_CPintSH_CP=10;//Контакт ST_CPintST_CP=9;//Контакт DSintDS=8; voidsetup(){   // Настроим выходы SH_CP, ST_CP, DS   pinMode(SH_CP,OUTPUT);   pinMode(ST_CP,OUTPUT);   pinMode(DS,OUTPUT);} voidloop(){   for(inti=0;i<256;i++){      // Вызовем начало приема данных      digitalWrite(ST_CP,LOW);      // Последовательная передача данных на Контакт DS      shiftOut(DS,SH_CP,MSBFIRST,i);      // Вызовем окончание передачи данных.      // Теперь сдвиговый регистр подаст напряжение на указанные выходы      digitalWrite(ST_CP,HIGH);      // Задержка в 1 секунду      delay(1000);   }}

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

Половина из них принадлежит пинам, подключенным ко входам DS и SH_CP, по которым передаются данные и тактовые импульсы. Следующий параметр несет ответственность за передачу прямого (MSBFIRST) и обратного (MSBLAST) порядка битов в регистр. Заключительный параметр является непосредственным значением от 0 до 252, который передается в сдвиговый регистр.

Примером активирования конкретных выходов может послужить применение на практике чисел в битовом представлении:

Сдвиговый регистр и ArduinoArduino <текстареа wrap=»soft» class=»crayon-plain print-no» data-settings=»dblclick» readonly=»» style=»-moz-tab-size:4; -o-tab-size:4; -webkit-tab-size:4; tab-size:4; font-size: 14px !important; line-height: 16px !important;»>
// Загорится первый светодиод
shiftOut(DS, SH_CP, MSBFIRST, 0b10000000);
// Загорятся 1, 3, 5, 7 светодиоды
shiftOut(DS, SH_CP, MSBFIRST, 0b10101010);
// Загорится первый светодиод — порядок передачи битов обратный
shiftOut(DS, SH_CP, MSBLAST, 0b00000001);

Смотрите также:   Как читать электрические схемы: для начинающих новичков, учимся правильно разбираться, принципиальные проекты чертежей для чайников
123456 // Загорится первый светодиодshiftOut(DS,SH_CP,MSBFIRST,0b10000000);// Загорятся 1, 3, 5, 7 светодиодыshiftOut(DS,SH_CP,MSBFIRST,0b10101010);// Загорится первый светодиод — порядок передачи битов обратныйshiftOut(DS,SH_CP,MSBLAST,0b00000001);

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

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

На приведенной схеме видно, что оранжевый провод соединяет 9-й пин первой микросхемы с 14-м пином второй микросхемы. Остается загрузить скетч для подключения всех 16 светодиодов:

Сдвиговый регистр и ArduinoArduino <текстареа wrap=»soft» class=»crayon-plain print-no» data-settings=»dblclick» readonly=»» style=»-moz-tab-size:4; -o-tab-size:4; -webkit-tab-size:4; tab-size:4; font-size: 14px !important; line-height: 16px !important;»>
//Пин SH_CP
int SH_CP = 10;
//Пин ST_CP
int ST_CP = 9;
//Пин DS
int DS = 8;

void setup() {
// Настраиваем выходы SH_CP, ST_CP, DS
pinMode(SH_CP, OUTPUT);
pinMode(ST_CP, OUTPUT);
pinMode(DS, OUTPUT);
}

void loop() {
// Цикл обхода 16 светодиодов
for (int i = 0; i < 16; i++) { // Запись в регистр registerWrite(i, HIGH); // Задержка 0.5 с. delay(500); // Отключение предыдущего светодиода if (i > 0) {
registerWrite(i — 1, LOW);
}
// Отключение последнего светодиода
// («предыдущий» для первого»
else {
registerWrite(15, LOW);
}
}
}

// Метод для отсылки данных в регистры
void registerWrite(int num, int state) {
// Для хранения 16 битов используется unsigned int
unsigned int bitsToSend = 0;
// 0b000000000000000
// Инициализируем начало приема данных
digitalWrite(ST_CP, LOW);

// Устанавливаем 1 в соответствующий бит
bitWrite(bitsToSend, num, state);

// 16 бит необходимо разделить на два байта:
// И записать каждый байт в соответствующий регистр
byte register1 = highByte(bitsToSend);
byte register2 = lowByte(bitsToSend);

// Последовательная передача данных на пин DS
shiftOut(DS, SH_CP, MSBFIRST, register2);
shiftOut(DS, SH_CP, MSBFIRST, register1);

// Инициализируем окончание передачи данных.
// Регистры подадут напряжение на указанные выходы
digitalWrite(ST_CP, HIGH);
}

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051 //Пин SH_CPintSH_CP=10;//Пин ST_CPintST_CP=9;//Пин DSintDS=8; voidsetup(){   // Настраиваем выходы SH_CP, ST_CP, DS   pinMode(SH_CP,OUTPUT);   pinMode(ST_CP,OUTPUT);   pinMode(DS,OUTPUT);} voidloop(){  // Цикл обхода 16 светодиодов  for(inti=0;i<16;i++){// Запись в регистр registerWrite(i, HIGH); // Задержка 0.5 с. delay(500); // Отключение предыдущего светодиода if (i > 0) {       registerWrite(i-1,LOW);    }    // Отключение последнего светодиода    // («предыдущий» для первого»    else{       registerWrite(15,LOW);    }  }} // Метод для отсылки данных в регистрыvoidregisterWrite(intnum,intstate){// Для хранения 16 битов используется unsigned intunsignedintbitsToSend=0;// 0b000000000000000// Инициализируем начало приема данныхdigitalWrite(ST_CP,LOW); // Устанавливаем 1 в соответствующий битbitWrite(bitsToSend,num,state); // 16 бит необходимо разделить на два байта:// И записать каждый байт в соответствующий регистрbyteregister1=highByte(bitsToSend);byteregister2=lowByte(bitsToSend); // Последовательная передача данных на пин DSshiftOut(DS,SH_CP,MSBFIRST,register2);shiftOut(DS,SH_CP,MSBFIRST,register1); // Инициализируем окончание передачи данных.// Регистры подадут напряжение на указанные выходыdigitalWrite(ST_CP,HIGH);}

Из него видно, что существуют функции, существенно облегчающие работу с регистрами. Это функции, отвечающая за размещение конкретного бита в заданную позицию числа – bitWrite, а так же функции lowByte и highByte, извлекающие младшие и старшие 8 бит из переданного числа.

На этом подключение восьми (а на практике 16) светодиодов можно считать законченным. При этом задействованными остались всего три пина микроконтроллера Arduino.

</текстареа></текстареа></текстареа>

Выводы

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

Должен напомнить, мы рассмотрели самые популярные и, вероятно, простые микросхемы из этого семейства. Существуют более сложные решения, в которых назначения пинов универсальны и изменяются программно прямо на ходу, могут самостоятельно генерировать ШИМ, обрабатывать аналоговые сигналы и многое другое. Они используют разные интерфейсы и протоколы связи, что сложнее в понимании и использовании, но изучить их, имея опыт работы со старыми добрыми 74HC595 и 75РС165, будет уже намного проще.

Источники
  • https://ru.wikipedia.org/wiki/%D0%A0%D0%B5%D0%B3%D0%B8%D1%81%D1%82%D1%80_(%D1%86%D0%B8%D1%84%D1%80%D0%BE%D0%B2%D0%B0%D1%8F_%D1%82%D0%B5%D1%85%D0%BD%D0%B8%D0%BA%D0%B0)
  • https://ArduinoPlus.ru/74hc595-arduino/
  • http://HardElectronics.ru/74hc595.html
  • https://www.chipdip.ru/product/74hc595d
  • https://www.rlocman.ru/datasheet/data.html?di=50509&/SN74HC595N
  • https://kakrabotaet.ru/kak-eto-rabotaet/sdvigovyj-registr-princzip-raboty/
  • https://soltau.ru/index.php/arduino/item/458-kak-podklyuchit-sdvigovyj-registr-74hc595-k-arduino
  • https://Voltiq.ru/shift-register-and-arduino/
  • https://3d-diy.ru/wiki/components/sdvigovye-registry/

Помогла ли вам статья?

Рейтинг
( Пока оценок нет )
Библиотека радиолюбителя
Adblock
detector