0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Стенд для изучения сдвиговых регистров на низком уровне

Стенд для изучения сдвиговых регистров на низком уровне

Вслед за стендом для изучения HD44780 на низком уровне, завоевавшим на одном из конкурсов первый приз, автор Instructables под ником indoorgeek решил сделать ещё один аналогичный стенд. На этот раз пользователю, желающему почувствовать себя в шкуре «живого Arduino», предоставляется возможность поуправлять сдвиговым регистром — важным компонентом матричных светодиодных дисплеев и не только.

Такой стенд indoorgeek собрал в двух вариантах: на обычной макетной плате и на плате типа breadboard, вот так:

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

Повторяйте за indoorgeek’ом:

Вот и у вас тоже получилось:

Теперь как всем этим пользоваться. Чтобы поместить в трубку светящийся шарик, нажимаем кнопку, соединённую с выводом 14, после чего, удерживая её, нажимаем кнопку, соединённую с выводом 11, и тут же отпускаем. Следом отпускаем кнопку, соединённую с выводом 14. Чтобы проделать то же самое с несветящимся шариком, с кнопкой, соединённой с выводом 14, ничего не делаем, а кнопку, соединённую с выводом 11, нажимаем и отпускаем. Так можно записать в регистр сдвига и несколько бит. В обоих случаях при отпущенной кнопке, соединённой с выводом 12, состояние светодиодов не изменится, а при нажатой — будет отражать состояние регистра сдвига в реальном времени. Если же вы решили не держать эту кнопку нажатой во время записи, кратковременно нажмите её сейчас, и регистр хранения как бы сфотографирует текущее состояние регистра сдвига.

Поскольку трубка и шарики виртуальные, а микросхема и светодиоды — реальные, для зрителя каждый выпавший с противоположной стороны трубки шарик исчезает. Был бы ещё один регистр, он переехал бы туда. Вы можете усовершенствовать эту конструкцию, добавив этот регистр, и даже несколько таковых, и ещё по восемь светодиодов с резисторами на каждый из них. Как указано выше, вывод 9 каждого предыдущего регистра надо соединить с выводом 14 следующего. А питание и входы 10, 11, 12 и 13 всех регистров — запараллелить.

Вот вы и получили представление о том, какие операции проделывает Arduino, управляя сдвиговыми регистрами.
Источник

Программирование Arduino урок 13 — сдвиговый регистр 74HC595

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

74HC595 — восьмиразрядный сдвиговый регистр с последовательным вводом, последовательным/параллельным выводом информации, с триггером-защелкой и тремя состояниями на выходах регистра.

Регистр контролирует 8 выходов, занимая всего 3 выхода микроконтроллера. Кроме этого можно собрать каскад из нескольких таких регистров.

Регистр использует принцип синхронизированной последовательной передачи сигнала. Значения сигнала (биты 1 или 0) передаются в регистр один за другим, при этом регистр получает синхронизирующий сигнал, который заставляет его считать сигнал с входа. Когда байт полностью вычитан, значения всех 8 бит распределяются по выходам регистра. То есть передаем в регистр сигналы последовательно, а на выходах регистра имеем 8-м параллельных сигналов.

Регистр может выдавать полученные сигналы параллельно или последовательно. Последовательная передача бит необходимо при каскадировании нескольких регистров. Первые 8 бит сигнала передаются на следующий регистр для дальнейшего параллельного вывода информации.

Выходы регистра могут быть в одном из трёх состояний:

  • логический ноль;
  • логическая единица;
  • высокоомное (высокоимпедансное) состояние.

В высокоомном состоянии выходы отключены от схемы. Отключить можно только все выхода регистра вместе (по одному нельзя).

В исходном состоянии выводы регистра находятся в высокоомном состоянии. Это значит, что другие элементы могут изменять напряжение на них, не влияя на работоспособность и логику микросхемы. Это может быть полезно, если одними и теми же элементами планируется управлять при помощи разных регистров — когда активен один (сигнал LOW на входе OE), следует перевести второй в высокоомное состояние (сигнал HIGH на входе OE). Если регистр всего один, можно смело подключать OE к земле. Также к земле подключается выход GND. Для нормального функционирования регистра также следует подключить вход MR к рельсе питания. Туда же подключаем Vcc.

К минусам использования сдвигового регистра стоит отнести невозможность использования широтно-импульсной модуляции (ШИМ), потому что выходы регистра могут иметь только логические значения HIGH (1) и LOW (0).

Распиновка входов/выходов регистра

Регистр работает на интерфейсе SPI: выводы DS, ST_CP, SH_CP — это шины управления.

  • Выводы 1-7, 15 ———— Q0-Q7 ———— Параллельные выходы (разряды);
  • Вывод 8 ———————- GND ————— земля;
  • Вывод 9 ———————- Q7″ —————- Выход для последовательного соединения регистров;
  • Вывод 10 ——————— MR —————- Сброс значений регистра. Сброс происходит при получение LOW. Если заведём питание +5В, то сброс будет неактивным;
  • Вывод 11 ——————— SH_CP ———— Вход для тактовых импульсов — «тактовая линия (SCK)»;
  • Вывод 12 ——————— ST_CP ———— Синхронизация выходов — «защёлка (SS)»;
  • Вывод 13 ——————— OE ———— Вход для переключения состояния выходов из высокоомного в рабочее (подключаем на землю);
  • Вывод 14 ——————— DS —————- Вход для последовательных данных — «шина данных (MOSI)»;
  • Вывод 16 ——————— Vcc —————- Питание.
Читать еще:  Подключение нескольких двигателей к адруино

Соберём стенд с одним сдвиговым регистром.

  • GND (пин 8) на землю;
  • Vcc (пин 16) к питанию 5В;
  • OE (пин 13) на землю;
  • MR (пин 10) к питанию 5В;

Подадим питание на регистр и сделаем выходы активными. При таком подключении в момент подачи питания на схему на выходах будут случайные значения. Можно контролировать выводы MR и OE непосредственно с Arduino (обнуляя входы и/или подключая выходы в нужный момент). Но не стоит из-за этого нервничать, так как значения регистра и выводов будут перезаписаны, как только программа начнёт работать.

  • DS (dataPin) 14-й вывод регистра с 11-ым выходом Arduino;
  • SH_CP (clockPin) 11-й вывод регистра с 12-ым выходом Arduino;
  • ST_CP (latchPin) 12-й вывод регистра c 8-ым выходом Arduino;

Конденсатор ёмкостью 0.1 микрофарада необходимо подключит на «защёлку» для минимизации шума в схеме при подаче «защелкивающего» импульса. Подключаем светодиоды к выходам регистра через токоограничивающие резисторы.

Для начала следует отметить, что библиотека SPI в данном примере использоваться не будет.

В место неё будет использовать функцию shiftOut() — выводит байт информации на порт вход/выхода последовательно (побитно).

У функции всего четыре параметра:

  • Номер вывода, по которому передаются данные (подключенный к DS);
  • Номер вывода, по которому передаются тактовые импульсы (подключенный к SH_CP).
  • Параметр передачи битов в регистр: MSBFIRST — прямой порядок, начиная со старшего (первого) бита; LSBFIRST — обратный порядок, начиная с младшего (последнего бита).
  • Значение, которое должно быть передано в регистр. В данном случае передаем значение от 0 до 255 (2 в степени 8, регистр 8-ми битный).

Объявим переменные и присвоим им соответствующие значения.

Конфигурируем выводы на выход и ставим «защёлку», чтобы сдвиговый регистр не принимал сигналов:

После этого отправим на регистр байт. Для этого снимем защёлку (ставим LOW) — начинаём передачу данных (регистр принимает сигналы с Arduino).

Отправляем данные (отправляем байт в цифровом или двоичном виде) = 0b00000001.

В конце ставим защёлку (ставим HIGH) — заканчиваем передачу.

В итоге весь наш код имеет следующий вид:

Заливаем прошивку в контроллер. Смотрим на результат.

Непосредственно управление регистром осуществляется с помощью входов DS, SH_CP и ST_CP. Когда происходит переключение SH_CP (clockPin) с LOW на HIGH, в регистр считывается значение с DS (1 бит). При переключении ST_CP (latchPin) с LOW на HIGH заканчивается прием информации и выводы переходят в назначенное состояние.

Напишем функцию (вместо 3-х строк) для оптимизации кода:

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

Для удобства работы создадим массив типа «boolean» для хранения состояния разряда (HIGH или LOW).

Напишем под него функцию, что будет принимать 2 параметра: номер разряда и уровень, который нужно этому разряду присвоить: HIGH или LOW.

Микроконтроллер начинает отсчёт с нуля. Чтобы не было путаницы будем отнимать единицу от номера текущего разряда. Другими словами — пользователь работает с 1 — 8 разрядами, а контроллер воспринимает это, как работу с 0 — 7.

Перезаписываем изменения в массиве:

Формируем байт (из 8 битов) и отправляем его на регистр. Объявляем переменные: value — формируемый байт (по умолчанию с нулевым значением); add — хранить байт текущего разряда.

Проверяем очередной разряд в массиве. Если он должен иметь высокий уровень, то прибавляем к переменной value переменную add и переходим на следующий разряд.

Посылаем значение переменной «value» в регистр:

Включаем 1, 4, 5 и 8 разряды по-отдельности.

Для очистки регистра напишем функцию и вызовем её в setup (в программах представленных в статье — эта функция не использовалась):

Другой вариант управления разрядами. Программа считывает значения введенные пользователем в «мониторе порта» от 0 до 7 и включает соответствующий светодиод. Введя «reset» мы сбрасываем значение на светодиодах.

Регистру можно отправлять только полный байт (8 бит — 0b00000000). Чтобы изменить состояние одного разряда регистра (включить или выключить) нужно послать ранее отправленный байт с изменением одного нужного бита.

Программа-счётчик выводит значения байта от 0 до 255 в двоичной системе счислений.

Микроконтроллеры Процессоры, проекты, программирование

Nav view search

Навигация

Искать

Устройства индикации

Использование сдвиговых регистров в устройствах индикации.

Одной из проблем, возникающих при разработке микроконтроллерных устройств часто становится необходимость экономии линий портов ввода/вывода. Многие периферийные устройства, которые могут работать в связке с процессором, требуют для передачи информации большого количества соединительных проводников. Актуальность этой задачи не снизилась даже с появлением процессоров с большим количеством выводов, так как одновременно усложнились и периферийные устройства. Для устройств индикации, одним из вариантов снижения количества требуемых линий может стать использование регистров сдвига (Shift register).

Читать еще:  Сверлильный станок из двигателя 775 на 12В

Регистр сдвига представляет собой цепочку из нескольких, последовательно соединенных D-триггеров. На первый триггер подключается информационный выход микроконтроллера. С каждым импульсом тактового сигнала, передаваемого по отдельной линии, уровень на входе каждого из триггеров записывается на выход. В итоге происходит сдвиг сигнала от начала к концу цепочки. Если использовать подключить выходные линии после каждого из триггеров, то сдвиговый регистр будет представлять собой последовательно-параллельный преобразователь. Это значит, что для организации каких-либо индикаторов, будет минимально необходимо использовать только два вывода микроконтроллера.

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

Использование регистра 74164

Одной из наиболее простых и распространенных микросхем, реализующих функцию регистра сдвига, считается модель 74164 (555ИР8) и ее технологические варианты. Данная микросхема представляет собой 8-ми разрядный регистр с последовательной загрузкой и параллельным выходом. Используя 74164 можно сравнительно просто получить линейный индикатор из 8-ми светодиодов или односимвольный семисегментный индикатор. При необходимости, допускается последовательное соединение нескольких микросхем, что увеличит количество выходных линий, и подключенных к ним индикаторов.

Выходной ток каждой линии современных вариантов 74ACT164 и 74HCT164 составляет 25мА, что позволяет напрямую подключать маломощные одиночные светодиоды или семисегментные индикаторы. Время цикла этих микросхем может находиться на уровне 15нС, что соответствует возможности работы на частоте 66МГц. Учитывая, что подобная или более высокая частота работы процессоров встречается редко, для формирования тактовых импульсов достаточно просто включить и выключить выход контроллера, без какой-либо задержки.Для загрузки данного регистра сдвига достаточно двух линий: DATA и CLK. Это позволяет задействовать только две линии микроконтроллера, для управления устройством индикации. При этом во многих случаях может оказаться не важно, сколько микросхем будет соединено последовательно, и соответственно сколькими индикаторами управляет контроллер.

Вариантов использования 74164 существует множество. Можно выделить несколько из них. Первый, вышеназванный индикатор на основе нескольких светодиодов. Второй – одиночный семисегментный индикатор или линейка из них. Пример линейки индикаторов показан в статье – Термометр на микроконтроллере PIC12F629.

Программирование индикации с использование регистра сдвига также не отличается высокой сложностью. Особенно если в микроконтроллере реализована такая операция, как сдвиг байта через бит переноса. Проверкой данного бита можно определить уровень, который требуется установить на линии данных. Циклически повторяя такой сдвиг и формируя тактовые импульсы можно полностью загрузить регистр сдвига.Следующим вариантом использования может стать схема динамической индикации, когда для снижения количества используемых линий микропроцессора, параллельный вывод на отдельные сегменты, заменяется на последовательный, с использованием последовательно-параллельного преобразователя. Этот же преобразователь может использоваться в схеме включения ЖК-индикатора на базе HD44780.

Использование регистров 74595 и 4094

Применение регистров сдвига позволяет строить большие схемы с использованием светодиодных индикаторов. Но в случае, если индикаторы потребляют большой ток (состоят из множества отдельных светодиодов), выходного сигнала регистра становится недостаточно. Для усиления сигнала можно применять различные схемы, состоящие из отдельных транзисторов, или сборок. Наиболее просто и выгодно в этом случае использовать микросхему ULN2803, содержащую 8 транзисторных ключей. Каждый ключ способен коммутировать ток до 500мА при напряжении до 50В, что позволяет подключать к нему до нескольких десятков отдельных светодиодов, маломощных ламп накаливания, либо сегменты крупногабаритных матричных индикаторов. Единственным отличием от вышеприведенных схем, будет использование светодиодных индикаторов с общим анодом, так как ULN2803, по сути, представляет собой ключ нижнего плеча.При всех своих достоинствах, микросхема 74164 имеет некоторые недостатки. В первую очередь к ним следует отнести непосредственное подключение выходов схемы к выходным линиям триггеров. В медленных системах светодиодной индикации, при загрузке регистра, можно наблюдать движение информации от входа к выходу в виде посторонней засветки сегментов. В случае частого обновления информации, подобная засветка вызывает несколько неприятные ощущения. Для ее устранения следует применять регистры, оснащенные выходной защелкой. Примером таких элементов служат микросхемы 74595 и 4094. Каждая из них имеет дополнительный вход стробирования SCLK. При неизменном принципе загрузки, информация на выходе этих устройств сможет появиться только после прохождения импульса по данному входу. Такое решение требует использования дополнительного вывода микроконтроллера, но позволяет строить индикаторы с большим количеством сегментов, без появления различных неприятных эффектов. Особенно полезно использование регистров, оснащенных защелками совместно с микроконтроллерами, работающими на пониженных частотах или от внутренних генераторов.

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

Сдвиговый регистр 74HC595

Сдвиговый регистр — это набор последовательно соединённых триггеров (обычно их 8 штук). В отличии от стандартных регистров, сдвиговые поддерживают функцию сдвига вправо и влево. (т. е. переписывание данных с каждого предыдущего триггера на следующий по счёту).

Читать еще:  Стендовый электродвигатель

Функционал и назначение у сдвиговых регистров довольно велик. Сегодня мы познакомим одного из них с Arduino (Отличный способ множить выходы у Arduino: занимаем 3, получаем 8).

Наверное самая популярная микросхема, представляющая собой такой регистр — это 74HC595.

— Работает на интерфейсе SPI: ноги DS, ST_CP, SH_CP — это шины управления. Соответственно: шина данных(MOSI), защёлка(SS) и тактовая линия(SCK). Подключаем на любые 3 контакта Arduino (библиотека SPI в коде не будет задействована). У меня это 12, 10, 13 выходы Arduino (стандарт).

— Ноги Q0, Q1, . Q7 — это выходы регистра (разряды). Для того, чтобы следить за состоянием каждого из них, повесим на каждый вывод по светодиоду (с последовательно соединённым резистором. Номинал от 150 до 330 Ом)

— VCC и GND — это питание. Подключаем к +5v и GND.

— выход Q7` не трогаем (предназначен для последовательного соединения таких регистров)

— MR — это сброс. Подключаем к +5v (сброс не активен).

— ну и OE притягиваем к земле (подключаем к контакту GND).

Получается вот, такая схема:

На BreadBoard можно разместить вот, так:

Теперь к коду:

— как говорилось ранее, библиотека SPI использоваться не будет. Есть удобная функция shiftOut().

для начала именуем наши пины (тактовая линия — clock, данные — data, защёлка — latch):

потом в void setup() обозначаем их как выходы и сразу ставим защёлке высокий уровень, чтобы регистр не принимал сигналов:

теперь давайте попробуем что-нибудь отправить на регистр:

— для начала ставим LOW на защёлку (начинаем передачу данных. Теперь регистр принимает сигналы с Arduino).

— потом отправляем данные (т. е. отправляем байт в цифровом или двоичном виде. В двоичном проще, т. к. каждый из 8 битов отвечает за свой разряд в регистре. Проще сориентироваться глазами):

Для начала отправим байт 0b10000000; (должен будет загореться первый светодиод):

— и в конце выставляем HIGH на защёлку (заканчиваем передавать данные).

В итоге весь наш код:

Теперь вгружаем в ардуину. Результат должен быть таким (зажёгся первый светодиод):

(если у вас зажёгся не первый, а последний светодиод, то в функции shiftOut поменяйте LSBFIRST на MSBFIRST и всё станет на свои места).

Итак, получилось! Предлагаю создать функцию для того, чтобы каждый раз не писать эти 3 СТРОЧКИ:

Я назову её: sendbyte;

Эта функция отправляет регистру состояние всех разрядов сразу. Это пригодится для управления семисегментом (например). Но, чтобы использовать регистр как расширитель портов, нужно управлять каждым разрядом по-отдельности (аналогично функции digitalWrite()):

— Мы можем отправлять регистру только полный байты (8 бит — 0b00000000). Если отправить не 8, а 5 бит (например: 0b00000000), то регистр будет ждать недостающие 3 бита. Значит, что когда мы хотим изменить состояние одного разряда регистра (включить его, или выключить) мы должны, по сути, послать ранее отправленный байт, с изменением на один бит.

(P. S.: Сейчас долгое и нудное объяснение (новичкам), кому не интересно, спуститесь чуть ниже :);

— Итак, сначала создаём, так называемую (мною), базу данных, в которой будет храниться состояние каждого разряда (включен(HIGH) или выключен(LOW)). тип: boolean:

Только что у нас появился массив переменных;

Каждая переменная в данном массиве обозначает свой разряд (в нулевой (по счёту) будет храниться состояние 1 разряда, второй — 3-го, и т. д.)

— Теперь напишем функцию (я назову её: sendpin). Она будет принимать 2 значения: номер разряда, и уровень, который нам надо этому разряду приписать: высокий(HIGH) или низкий(LOW).

— из-за того, что счёт начинается с нуля, нам придётся называть первый пин нулевым. Чтобы это исправить (мы будем писать как есть(первый, значит первый), а Arduino будет сама отбавлять один), Я написал:

— Затем отмечаем изменения в базе данных:

Теперь надо сформировать из 8 битов байт и отправить его на регистр.

— для начала создаём переменные:

value — тот байт, который будем отправлять. (по умолчанию его нужно сделать нулём):

add — это переменная, которая будет хранить в себе байт текущего разряда. для первого разряда это байт 1 (0b10000000);

теперь нам нужно прокрутить в базе данных все 8 переменных и сформировать байт (делать это будем с помощью цикла for():

Итак, каждый раз мы проверяем очередной разряд в базе данных. Если он должен иметь высокий уровень, то мы прибавляем к value add и переходим на следующий разряд в цепочке (как бы сдвигаемся на разряд выше (левее). Т. е., в двоичном коде всё просто: было так: 0b01000000; сдвинули единичку влево и получилось так: 0b10000000. А вот в цифровом виде всё по-другому. Сдвиг влево аналогичен умножению на 2 (а вправо, кстати, — делению на 2)). Получается примерно так:

Теперь остаётся только послать value на регистр:

В принципе, если понять, то всё очень просто.

Итак, давайте попробуем включить 2, 4, 6, и 8 разряды отдельно (4 раза напишем в цикле нашу функцию):

И кстати, в setup-e нужно очистить регистр (послать 0).

Ссылка на основную публикацию
Статьи c упоминанием слов:
Adblock
detector