Регистр сдвига 74HC164 и ваш Arduino: 9 шагов
Регистр сдвига 74HC164 и ваш Arduino: 9 шагов
Anonim

Регистры сдвига - очень важная часть цифровой логики, они служат связующим звеном между параллельным и последовательным мирами. Они сокращают количество проводов, использование выводов и даже помогают снизить нагрузку на ваш процессор за счет возможности хранить свои данные. Они бывают разных размеров, с разными моделями для разных целей и с разными функциями. Сегодня я буду обсуждать 8-битный регистр 74HC164 с последовательным параллельным выходом, без фиксации, сдвиговый регистр. Почему? Ну, во-первых, это один из самых простых регистров сдвига, который упрощает изучение этого вопроса, но так получилось, что он единственный, который у меня был (смеется!) В этом руководстве рассказывается, как работает этот чип, как его подключить., и сопрягать его с Arduino, включая несколько образцов эскизов и светодиодных схем. Надеюсь, вам всем понравится!

Шаг 1. Итак, что такое регистры сдвига?

Как упоминалось ранее, они бывают разных видов, и я также упомянул, что я использую 8-битный 74HC164, последовательный параллельный выход, без фиксации, сдвиговый регистр, так что все это означает?!? Во-первых, имя 74 - означает его часть логического семейства 74xx, и поскольку его логика не может напрямую управлять очень большим током (обычно 16-20 мА для всего чипа), он только передает сигналы, но это не означает этот сигнал не поступает на транзистор, который может переключать более высокую токовую нагрузку. HC означает, что это высокоскоростное устройство cmos, вы можете прочитать об этом по ссылке ниже, но что вам в основном нужно знать об этом, так это то, что это низкое устройство питания и будет работать от 2 до 5 вольт (так что, если вы используете Arduino на 3,3 вольта, все в порядке). Также он может нормально работать на высоких скоростях, этот конкретный чип имеет типичную скорость 78 МГц, но вы можете работать как медленно, так и быстро (пока он не начнет тупить) как хотите www.kpsec.freeuk.com/components/74series.htm164 - номер модели для этого чипа, их большая таблица на wikipediaen.wikipedia.org/wiki/List_of_7400_series_integrated_circuits Далее, 8 бит Сдвиговый регистр состоит из триггерных схем, триггер - это 1 бит памяти, на этот раз. s 8 (или 1 байт памяти). Поскольку это память, если вам не нужно обновлять регистр, вы можете просто перестать «разговаривать» с ним, и он останется в том состоянии, в котором вы его оставили, пока вы снова не «поговорите» с ним или не сбросите питание. другие регистры сдвига с логической последовательностью 7400 могут выходить параллельно до 16 битов. Это означает, что ваш Arduino отправляет ему данные последовательно (один за другим включаются импульсы), а регистр сдвига помещает каждый бит на правильный выходной вывод. Для этой модели требуется только 2 провода для управления, поэтому вы можете использовать 2 цифровых контакта на Arduino и разбить эти 2 на еще 8 цифровых выходов. Некоторые другие модели имеют параллельный последовательный выход, они делают то же самое, но в качестве входов для Arduino. (например, геймпад NES) без фиксации. Это может быть недостатком этого чипа, если он вам нужен. Когда данные поступают в сдвиговый регистр через последовательный порт, они появляются на первом выходном выводе, когда поступает тактовый импульс, первый бит смещается на 1 место, создавая эффект прокрутки на выходах, например, 00000001 будет отображаться на выходах. как 101001000100001000001000000100000001 Если вы разговариваете с другими логическими устройствами, которые используют одни и те же часы и не ожидают этого, это может вызвать проблемы. Регистры сдвига с защелкой имеют дополнительный набор памяти, поэтому, как только данные введены в регистр, вы можете щелкнуть переключателем и показать выходы, но при этом добавляется еще один провод, программное обеспечение и другие вещи, за которыми нужно следить. мы управляем светодиодными дисплеями, эффект прокрутки происходит так быстро, что вы его не видите (кроме случаев, когда вы в первый раз включаете чип), и как только байт находится в регистре сдвига, прокрутка больше не будет. Мы будем управлять типом гистограммы, 7 сегментов., и матрица точек 16LED 4x4 с этим чипом и программным обеспечением на Arduino, используя только 2 цифровых контакта (+ питание и земля)

Шаг 2: Основное подключение и работа

Электромонтаж 74HC164 представляет собой 14-контактный чип, он имеет 4 входных контакта, 8 выходных контактов, питание и землю, поэтому давайте начнем сверху. Контакты 1 и 2 являются последовательными входами, они настроены как логический элемент И, что означает, что они оба должны иметь высокий логический уровень (т. е. 5 вольт), чтобы бит воспринимался как 1, низкое состояние (0 вольт) на любом из них будет считаться нулем. Нам это на самом деле не нужно, и с ним проще работать в программном обеспечении, поэтому выберите один и привяжите его к V +, чтобы он всегда считался высоким. Я предпочитаю использовать перемычку между контактом 1 и контактом 14 (V +), поскольку вы можете просто установить перемычку на макетной плате над микросхемой. Один оставшийся последовательный вход (контакт 2 на моей схеме) будет переходить к цифровому контакту 2 Arduino. Контакты 3, 4, 5 и 6 74HC164 - это первые 4 байта выхода. Контакт 7 подключается к земле, прыгая вправо, контакт 8. это тактовый вывод, так сдвиговый регистр знает, что следующий последовательный бит готов к чтению, он должен быть подключен к цифровому выводу 3 на Arduino. Вывод 9 должен очистить весь регистр сразу, если он становится низким, у вас есть возможность использовать его, но в этом непостижимом ничего не сказано, поэтому привяжите его к V +, выводы 10, 11, 12 и 13 - последние 4 байта вывода. Вывод 14 - это питание микросхемы. регистра (цифровой вывод 2 на Arduino) высокий или низкий, затем вам нужно перевернуть вывод часов (цифровой вывод 3) с низкого на высокий, регистр сдвига будет читать данные на последовательном входе и сдвигать выходные контакты на 1, повторите 8 раз, и вы установили все 8 выходов. Это можно сделать вручную с помощью циклов for и цифровой записи в среде Arduino IDE, но поскольку t Это очень распространенная связь на аппаратном уровне (SPI), у них есть одна функция, которая делает это за вас. shiftOut (dataPin, clockPin, bitOrder, value) Просто скажите ему, где выводы данных и часов подключены к Arduino, каким образом отправлять данные и что отправлять, и об этом позаботятся для вас (удобно)

Шаг 3: проекты

Хорошо, хватит лекций и теории, давайте займемся этим чипом! Есть 3 проекта, которые можно попробовать в этом руководстве, первые 2 просты и могут быть реализованы в считанные секунды. Третий, светодиодная матрица 4x4, требует больше времени и усилий для создания из-за проводки светодиодов. Список деталей Проект 1: Контроллер светодиодного дисплея с гистограммой «2 провода» 1 * 74HC164 Регистр сдвига1 * беспаечная макетная плата1 * arduino или arduino совместимый (5 В) 1 * 330 Ом, резистор 1/4 Вт 8 * красный светодиод с нормальным выходом 12 * перемычки Проект 2: '2-проводный' 7-сегментный контроллер дисплея 1 * 74HC164 Регистр сдвига1 * беспаечный макет1 * Arduino или совместимый с Arduino (5 В) 1 * резистор 330 Ом 1/4 Вт 1 * семисегментный дисплей с общим катодом 9 * перемычки Проект 3: '2-проводный' 4х4 светодиодный матричный дисплей 1 * 74HC164 Регистр сдвига1 * Arduino или совместимый с Arduino (5 В) 4 * 150 Ом 1 Резистор 1/4 Вт 8 * 1 кОм Резистор 1/8 Вт (или больше) 8 * Транзистор NpN (2n3904 или лучше) 16 * красных светодиодов с нормальным выходом для его создания и регулируемой мощности 5 В, которая может выдерживать 160 + мА (вы можете включить сразу все светодиоды как стоп-сигнал)

Шаг 4: Проект 1 [пункт 1]: Аппаратное обеспечение контроллера светодиодного дисплея двухпроводной гистограммы

Подключите arduino и сдвиговый регистр в соответствии со схемой, у меня уже есть 10-сегментный дисплей с гистограммой, готовый для использования на макетной плате, и это то, что вы увидите на изображении, но вы можете сделать то же самое с отдельными светодиодами на второй странице Я заявил, что это не драйверы, а логические устройства, через которые может проходить крошечный ток. Чтобы запустить 8 светодиодов, сохраняя простую схему и не готовя сдвиговый регистр, необходимо немного ограничить ток. Светодиоды подключены параллельно и имеют общую землю (общий катод), прежде чем подключаться к источнику питания. заземление, которое они должны пройти через резистор 330 Ом, ограничивая общий ток, который могут использовать все светодиоды, до 10 мА (при 5 В). Это оставляет светодиоды в болезненном состоянии, но они загораются и, таким образом, служат для В этом примере, чтобы управлять светодиодами с их правильным током, вам необходимо вставить транзистор, в котором регистр сдвига может включать / выключать источник более высокого тока (см. проект 3). Для вывода данных регистра сдвига (вывод 2) требуется Для подключения к цифровому выводу Arduino # 2 Вывод Clock сдвигового регистра (вывод 8) необходимо подключить к цифровому выводу Arduino # 3.

Шаг 5: Проект 1 [pt 2]: Программное обеспечение контроллера светодиодного дисплея с двухпроводной гистограммой

Пример 1: Откройте файл «_164_bas_ex.pde» внутри Arduino IDE. Это простой набросок, который просто позволяет вам определять включение или выключение светодиодов на гистограмме. Первые две строки определяют номера контактов, которые мы будем использовать для данных и часов, I используйте #define over const integer, мне легче запомнить, и нет никаких преимуществ для одного или другого после компиляции #define data 2 # define clock 3 Далее - функция настройки void, она запускается только один раз, поэтому arduino поворачивается on, устанавливает регистр сдвига и больше не имеет ничего общего. Внутри функции настройки void мы устанавливаем выводы часов и данных как выводы OUTPUT, затем, используя функцию shiftOut, мы отправляем данные в регистр сдвига void setup () {pinMode (clock, OUTPUT); // сделать тактовый вывод выходом pinMode (data, OUTPUT); // сделать вывод данных выходом shiftOut (data, clock, LSBFIRST, B10101010); // отправляем это двоичное значение в сдвиговый регистр} В функции shiftOut вы можете видеть ее аргументы: данные - это вывод данных, часы - это вывод часов. LSBFIRST указывает, в каком порядке оно находится, при записи в двоичной системе счисления (Bxxxxxxxx) 7-й элемент за B - это младший бит, сначала он подается первым, поэтому он заканчивается на последнем выходе, когда все 8 битов введены в B10101010 - это двоичное значение, отправляемое в регистр сдвига, и оно будет включать каждый нечетный свет, попробуйте поиграть с разными значениями, чтобы включить или выключить разные шаблоны и, наконец, пустой цикл void (потому что он вам нужен, даже если вы его не используете) void loop () {} // сейчас пустой цикл Пример 2: первые 8 строк то же, что и первые 8 строк в первом примере, фактически они не изменятся ни в одном из других проектов, поэтому #define data 2 # define clock 3void setup () {pinMode (clock, OUTPUT); // сделать тактовый вывод выходом pinMode (data, OUTPUT); // Делаем вывод данных выходом Но теперь в настройке void есть цикл для 8 count, он принимает пустой байт и сдвигает 1 бит за раз, начиная с самого левого бита и двигаясь вправо. Это назад по сравнению с первым примером, в котором мы начали с крайнего правого бита и работали слева, но при использовании MSBFIRST функция сдвига отправляет данные правильным образом. Кроме того, мы добавляем задержку в цикл for, чтобы он замедлялся настолько, чтобы быть видимым. for (int i = 0; i <8; ++ i) // для 0-7 do {shiftOut (data, clock, MSBFIRST, 1 << i); // битовый сдвиг высокого логического (1) значения на i delay (100); // задержка 100 мс, иначе вы не сможете его увидеть}} void loop () {} // пустой цикл сейчас загрузите скрипт, и теперь вы должны увидеть, как гистограмма загорается каждым светом по очереди

Шаг 6: Проект 2: 7-сегментный контроллер дисплея 2 Wire

Посмотрите на распиновку вашего 7-сегментного дисплея (у меня был только двойной, но использовал только половину) и используйте рисунок ниже, чтобы подключить каждый сегмент к правильному биту на бите регистра сдвига 1 = контакт 3 бит 2 = контакт 4 бит 3 = контакт 5 бит 4 = контакт 6 бит 5 = контакт 10 бит 6 = контакт 11 бит 7 = контакт 12 бит 8 = контакт 13 (если вы хотите использовать десятичную точку) И катод дисплея через резистор 330 Ом и заземление источника питания теперь откройте файл seven_seg_demo.pde в Arduino IDE Сначала вы видите, где мы определяем выводы данных и часов #define data 2 # define clock 3 Затем мы устанавливаем все шаблоны символов в двоичном формате, это довольно просто, посмотрите на рисунок ниже, если вам нужен средний сегмент введите один, затем вам нужен верхний сегмент, если да, введите другой, продолжайте делать это, пока не покроете все 8 сегментов, обратите внимание, что мой крайний правый бит (бит 8) всегда равен 0, поэтому я никогда не включаю десятичный точка. нулевой байт = B01111110; первый байт = B00000110; второй байт = B11011010; третий байт = B11010110; четвертый байт = B10100110; пятый байт = B11110100; шестой байт = B11111100; седьмой байт = B01000110; восьмой байт = B11111110; девять байт = 10 затем в настройке void мы устанавливаем наши выводы данных и часов на выходы void setup () {pinMode (clock, OUTPUT); // сделать тактовый вывод выходом pinMode (data, OUTPUT); // делаем вывод данных выходом3} затем в цикле void мы используем shiftOut для отображения каждого шаблона (числа), ждем 1/2 секунды и отображаем следующий, от 0 до 9, так как это выполняется в функции цикла void, он будет подсчитывать 0-9 и повторять до бесконечности. void loop () {shiftOut (данные, часы, LSBFIRST, ноль); задержка (500); shiftOut (данные, часы, LSBFIRST, один); задержка (500); shiftOut (данные, часы, LSBFIRST, два); задержка (500); shiftOut (данные, часы, LSBFIRST, три); задержка (500); shiftOut (данные, часы, LSBFIRST, четыре); задержка (500); shiftOut (данные, часы, LSBFIRST, пять); задержка (500); shiftOut (данные, часы, LSBFIRST, шесть); задержка (500); shiftOut (данные, часы, LSBFIRST, семь); задержка (500); shiftOut (данные, часы, LSBFIRST, восемь); задержка (500); shiftOut (данные, часы, LSBFIRST, девять); задержка (500);}

Шаг 7. Проект 3 [pt 1]: «2-проводной» светодиодный матричный дисплей 4x4

Проект светодиодной матрицы 4x4 немного сложнее, но он почти полностью строится, я решил сделать свою припаянную на монтажной плате, но ее можно будет воспроизвести на макетной плате, только с большим разнесением. отличается тем, что регистр сдвига не напрямую управляет светодиодами, вместо этого выходы сдвигового регистра отправляются через резистор 1 кОм на базу транзистора NpN, когда на выходе бита высокий уровень, он пропускает достаточный ток и напряжение в транзистор для переключения соединения между коллектором и эмиттером, коллекторы привязаны к «крепкому» регулируемому напряжению 5 В. Эмиттеры транзисторов подключены к резисторам 150 Ом, а резисторы подключены к анодам 4 светодиодов подряд и ограничивает строку до 20 мА, хотя при отрисовке изображений на дисплее горит только 1 светодиод, и, следовательно, почти полная яркость (почти потому, что они включаются и выключаются очень быстро, чтобы создать все изображение). Есть 4 строки и 4 столбцы, каждый В ряду устанавливаются резистор и транзистор, в каждом столбце катоды светодиода связаны вместе, упираются в коллектор транзистора, база которого также управляется регистром сдвига, и, наконец, на землю. Большая версия схемы www.instructables.com/files/orig/F7J/52X0/G1ZGOSRQ/F7J52X0G1ZGOSRQ.jpg

Шаг 8: Проект 3 [часть 2]: «2-проводной» светодиодный матричный дисплей 4x4

Регистр сдвига управляет как анодом, так и катодом светодиодов в формате YX, посмотрите на следующий бит 1 = столбец 1 (крайний правый) бит 2 = столбец 2 бит 3 = столбец 3 бит 4 = столбец 4 бит 5 = бит строки 1 (самый верхний) 6 = строка 2 бит 7 = строка 3 бит 8 = строка 4 Чтобы нарисовать изображение на миллиметровой бумаге квадрат 4x4 и заполнить те из них, которые вы хотите отобразить, затем создайте таблицу YX. Ниже вы увидите сопоставление для сравнения, лучшее, что можно сделать на 4x4 "пикселях". Для каждого заполненного раздела я записываю, в каком столбце (Y) он находится, а затем в какой строке (X). Теперь откройте в файле _4x4.pde в среде разработки arduino вы увидите двух наших старых друзей #define data 2 # define clock 3, затем массив целых чисел int img = {1, 1, 4, 1, 1, 3, 4, 3, 2, 4, 3, 4}; Если вы посмотрите на него просто список моих записанных координат YX, преобразовать эти значения вручную было бы большой проблемой, а у нас есть компьютер … пусть он это сделает! наши выводы часов и данных ВЫХОДЫ void setup () {pinMode (clock, OUTPUT); // сделать тактовый вывод выходом pinMode (data, OUTPUT); // сделать вывод данных выходом3} И сбивающий с толку цикл void, для начала нам нужно объявить некоторые локальные переменные void loop () {int Y; int X; выход байта; Затем цикл for, длина этого цикла должна соответствовать количеству записей в массиве img, для этого изображения я использовал только 6 пикселей, так что получается 12 координат YX. Я заставляю пропускать любое другое число, используя i + = 2, потому что мы читаем 2 координаты за цикл for (int i = 0; i <12; i + = 2) // количество точек в массиве img, в данном случае 12 {Теперь мы читаем ввод Y в в массиве и вычитаем единицу из его значения, потому что байты не начинаются с единицы, они начинаются с нуля, но мы отсчитываем от 1 // получаем первую пару шнуров YX Y = (img - 1); // вычитаем единицу, так как счетчик битов начинается с 0 Затем мы читаем ввод X в [i + 1] в массиве и вычитаем единицу из его значения по той же причине X = (img [i + 1] - 1); После того, как у нас есть значения YX пикселя, мы выполняем некоторые побитовые или математические операции и смещаемся влево. Сначала нам нужно прочитать значение X, и независимо от его значения сдвинуть его на столько мест + 4 влево, поэтому, если X равно 4 и добавьте 4, это бит 8 (MSB), снова посмотрев на диаграмму … бит 1 = столбец 1 (крайний правый) бит 2 = столбец 2 бит 3 = столбец 3 бит 4 = столбец 4 бит 5 = строка 1 (самый верхний) бит 6 = строка 2 бит 7 = строка 3 бит 8 = строка 4 Бит 8 - последняя строка Далее значение Y также сдвигается влево, на этот раз только само по себе, ничего не добавляется. Наконец, два или 'объединяются в 1 байт вместо 2 полубайтов (полубайты) с использованием побитового или (символ |) берет два байта и в основном складывает их вместе, допустим, X = 10000000Y = 00000001 -------------------- OR = 10000001row 4 столбец 1 out = 1 << (X + 4) | 1 << Y; И, наконец, shiftOut, чтобы отобразить текущее изображение, и продолжайте делать это, пока у нас не будет больше данных в массиве … задержите момент и цикл навсегда, так как мы смещали данные влево, и нам нужно, чтобы MSB был на последнем выходном выводе регистра сдвига отправьте его первым. shiftOut (данные, часы, MSBFIRST, выход); // сдвигаем байт в наш регистр delay (1); // отложите его на некоторое время, чтобы оставалось пятно света в ваших глазах. Не стесняйтесь создавать свои собственные изображения и эффекты. Есть 3 файла с примерами, смайлик и шахматная доска (которая больше похожа на полосы), и, наконец, случайный создатель блеска

Шаг 9: Заключение

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