Сдвиговые регистры 75HC595 в ардуино

Сдвиговые регистры в Arduino (74hc595)

Сдвиговые регистры – очень нужная и популярная вещь во многих проектах. Они позволяют размножить выходы вашего контроллера, что очень полезно, когда в реальном проекте вы нагрузите mega328 экраном, клавиатурой и другой периферией. Немного изучим теорию работы этого элемента, соберём простой скетч, а потом по графикам будет понятен алгоритм работы. Взглянем на выводы нашей микросхемы.

Распиновка 74HC595 выводы

Микросхема работает по интерфейсу SPI, и разобраться в логике её работы совсем не сложно. Внутри есть три основных блока. Первый – это сдвиговый регистр. Данные приходят сюда через DS пин, и также могут уходить далее через Q7′ (последовательный выход данных). DSэто последовательный вход данных, данные мы можем посылать бесконечно, и они будут идти паровозиком до самого последнего регистра в цепочке (если их много). Правда есть один нюанс, подавая данные, на входе DS, мы должны обязательно обеспечивать наличие синхроимпульсов на входе (SH_CP – shift register clock input). Далее на схеме мы видим регистр хранения, вот он то как-раз и представляет наибольшую ценность, ведь он связан с параллельным 8-разрядным выходом. Как не трудно догадаться, заставляет эти данные появится на выходе пин ST_CP (storage register clock input) – вход для синхроимпульсов регистра хранения. Именно подавая сюда логическую 1, мы заставим данные отправиться на выходы Q0-Q7. Нужно уточнить, что предыдущие данные хранятся, пока не поступит очередная команда на ST_CP.

блок схема 74hc595 и принцип работы

Естественно микросхему нужно запитать, для этого используются два пина VCC – напряжение питания и GND – земля. Осталось два странных вывода, это OE (Output Enable) – сигнал разрешения выхода, для нас логично его включить, а для этого подадим на него отрицательное значение. Выход MR (master reset) используется для перезагрузки. Для нашей задачи перезагрузка не нужна, поэтому подтянем его к питанию.
На основе полученных данных, соберём простую схему из двух регистров 74HC595.

Смотрите также:  Интенсив Южный IT-парк
Соединение двух сдвиговых регистров 74HC595 схема

Можно воспользоваться стандартными средствами библиотеки Arduino, но мы напишем более простой код, который даст понимание работы. Нам потребуется три вывода с микроконтроллера (из которых получим целых 16!), обозначим их:

#define sh_cp 4  
#define st_cp 5 
#define ds 6 

И назначим их на выход:

void setup() {
pinMode(sh_cp, OUTPUT); 
pinMode(st_cp, OUTPUT); 
pinMode(ds, OUTPUT); 
}

Теперь нужно выполнить команды, которые отправят данные на вход, и затем выведут их в параллельный 8 разрядный выход . Нужно проверить пин ST_CP, что он находится в 0, потому что при 1, мы получим вывод данных, что нам пока ни к чему. 0 будем удерживать до тех пор, пока не запишем все данные в регистр

void loop() {
digitalWrite(st_cp, LOW);

Следующим этапом, нужно загрузить данные в сдвиговый регистр. Для этого нам нужно подать данные на DS (data pin) и подать синхроимпульс SH_CP (clock pin). Можно просто чередовать “0” и “1”.

digitalWrite(ds, HIGH);     // Подаём данные (1)
digitalWrite(sh_cp, LOW);   // Вывод синхроимпульса в 0
digitalWrite(sh_cp, HIGH);  // Вывод синхроимпульса в 1

Логическая 1 загружена! Предлагаю попробовать последовательность 11001100. Остальные 7 бит загрузить не составит труда

digitalWrite(ds, HIGH);    // 1
digitalWrite(sh_cp, LOW);
digitalWrite(sh_cp, HIGH);

digitalWrite(ds, LOW);    // 0
digitalWrite(sh_cp, LOW);
digitalWrite(sh_cp, HIGH);

digitalWrite(ds, LOW);    // 0
digitalWrite(sh_cp, LOW);
digitalWrite(sh_cp, HIGH);

digitalWrite(ds, HIGH);    // 1
digitalWrite(sh_cp, LOW);
digitalWrite(sh_cp, HIGH);

digitalWrite(ds, HIGH);    // 1
digitalWrite(sh_cp, LOW);
digitalWrite(sh_cp, HIGH);

digitalWrite(ds, LOW);    // 0
digitalWrite(sh_cp, LOW);
digitalWrite(sh_cp, HIGH);

digitalWrite(ds, LOW);    // 0
digitalWrite(sh_cp, LOW);
digitalWrite(sh_cp, HIGH);

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

digitalWrite(st_cp, HIGH);
delay(500);

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

Смотрите также:  Работаем с задержками без delay() на arduino.
Демонстрация работы сдвигового регистра в Arduino

Если посмотреть на осциллограмму, то принцип работы становится очень понятным. Каждый бит данных DS, подтверждается синхроимпульсом SH, а в конце загрузки последовательности, мы выводим данным на выводы Q0-Q7, с помощью подачи логической 1 на вывод ST.

Осциллограмма работы сдвигового регистра 74HC595

Чтобы не страдать с таким длинным кодом в arduino есть простая команда ShiftOut(). В этой команде помимо последовательного вывода данных на пин DS (data pin) , производится подача синхроимпульса на вывод SH_CP (clock Pin). Сам синтаксис команды выглядит так:

shiftOut(dataPin, clockPin, bitOrder, value)

Ещё есть порядок вывода данных – bitOrder: MSBFIRST или LSBFIRST. (Старший значащий бит будет загружен первым или наоборот – наименее значимый бит первым). Сначала рассмотрим MSBFIRST, как наиболее часто применимый. Выполняя данную команду два раза подряд (так как у нас два регистра) без подтверждения вывода на ST_CP, оба регистра заполняются полностью. Делаем мы это, для того, чтобы проверить как работают последовательно соединённые регистры.

digitalWrite(st_cp, LOW);
shiftOut(ds, sh_cp, MSBFIRST, 0b01100110); 
shiftOut(ds, sh_cp, MSBFIRST, 0b01100101);

А вот после заполнения данных можно сделать и вывод данных, переведя вывод ST_CP в высокий уровень, и в этот момент данные отправятся на выходы Q0-Q7 обеих регистров.

digitalWrite(st_cp, HIGH);

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

Смотрите также:  Ремонт монитора sa24a300
Пример работы сдвиговых регистров на arduino

Точно также наглядно видно работу сдвиговых регистров, соединённых уже последовательно. Данные через Q7″ после первых 8 бит, просто пошли на следующий сдвиговый регистр, а ST соединён параллельно, и активировал выход данных на обеих регистрах сразу.

Осциллограмма работы сдвигового регистра

Также можно попробовать другой порядок выводы данных – LSBFIRST (наименее значимый бит первым).

digitalWrite(st_cp, LOW);
shiftOut(ds, sh_cp, LSBFIRST, 0b01100110);
shiftOut(ds, sh_cp, LSBFIRST, 0b01100101);
digitalWrite(st_cp, HIGH);

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

Осциллограмма.

Осциллограмма работы сдвигового регистра Arduino

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

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *