Raspberry Pi:Библиотеки/WiringPi/Расширения/Подключение сдвигового регистра 74x595

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску

Перевод: Максим Кузьмин
Проверка/Оформление/Редактирование: Мякишев Е.А.


Черновик


Подключение сдвигового регистра 74x595[1]

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

Каждый экземпляр класса, созданный в программе, может поддерживать до четырех 74x595, соединенных друг с другом гирляндной цепью. Это позволяет оснастить Raspberry Pi 32-битным портом для вывода данных ценой всего трех GPIO-контактов платы (или другого GPIO-расширителя, подключенного к ней). В одной программе можно создать неограниченное количество экземпляров, но каждому из них нужно три отдельных GPIO-контактов.

Подключение

#include <wiringPi.h>
#include <sr595.h>

Инициализация

sr595Setup (pinBase, numPins, dataPin, clockPin, latchPin) ;

Параметр pinBase – это виртуальный номер для базового контакта. То есть он служит «базой» для нумерации других контактов, появившихся при подключении сдвигового регистра. В результате получается нумерация контактов, используемая лишь для этой программы. В примере ниже используется значение «100». Параметр numPins – это количество контактов. В нем может быть значение от «1» до «32» – по 8 контактов на каждый 74x595.

Контакт, указанный в параметре dataPin – это контакт Pi, подключенный к контакту DS на сдвиговом регистре (контакт 14). Контакт в параметре clockPin – это контакт Pi, подключенный к контакту SHCP на регистре (контакт 11). Контакт в параметре latchPin – это контакт подключенный к контакту STCP на регистре (контакт 12).

Если вы подключаете к Pi больше одного 74x595, то контакты SHCP и STCP нужно соединить друг с другом, а выходной контакт Q7S (контакт 9) на регистре нужно подключить к контакту DS на следующем регистре в цепи. Для подключения к компонентам вывода данных (например, к светодиодам) используются контакты Q0-Q7.

Контакт MR на сдвиговом регистре (контакт 10) должен быть подключен к Vcc, а OE (контакт 13) – к 0v (т.е. к «земле»). Кроме того, контакт 16 должен быть подключен к Vcc, а контакт 8 – к 0 вольтам (к «земле»).

Картинка ниже демонстрирует, как подключить два сдвиговых регистра 74x595 к 10 светодиодам.

Ниже – фотография того, как это подключение выглядит вживую.

Программа ниже выводит на светодиоды серию импульсов двоичного кода.

/*
 * sr.c:
 * Программа для теста сдвиговых регистров
 *
 * Копирайт (c) 2012-2013 Гордон Хендерсон. <projects@drogon.net>
 ***********************************************************************
 */

#include <stdio.h>
#include <wiringPi.h>
#include <sr595.h>

int main (void)
{
  int i, bit ;

  wiringPiSetup () ;

// базовым контактом для 10 контактов сдвигового регистра будет «100»;
// контакты 0, 1 и 2 – для данных, тактового сигнала и защелки:
  sr595Setup (100, 10, 0, 1, 2) ;

  printf ("Raspberry Pi - Shift Register Test\n") ;
  //  "Тест Raspberry Pi и сдвигового регистра" 

  for (;;)
  {
    for (i = 0 ; i < 1024 ; ++i)
    {
      for (bit = 0 ; bit < 10 ; ++bit)
        digitalWrite (100 + bit, i & (1 << bit)) ;
      delay (5) ;
    }
  }
  return 0 ;
}

Примечания

  • Когда вы в первый раз запустите 74x595, его контакты будут иметь случайные значения. Поэтому будет разумно сразу выставить их все на «0» или на какой-то другой паттерн, соответствующий целям вашего проекта.
  • Всей работой по сдвигу битов и запоминанию, какие биты уже заданы, а какие нужно стереть, занимается модуль sr595.h. Просто пользуйтесь, как и раньше, функцией digitalWrite(). Вызов функций вроде pinMode() никакого эффекта иметь не будет.
  • Функция sr595Setup(), по сути, вызывает функции pinMode() и digitalWrite() на 3 контактах, указанных в ее параметрах. Это могут быть любые 3 контакта – например, GPIO-контакты на Pi или на GPIO-расширителе. Однако это должны быть контакты, способные выполнять вывод данных. Вы можете даже использовать уже созданный экземпляр sr595 для управления дополнительными «гирляндами» регистров, но мы это делать не рекомендуем!
  • Каждый вызов digitalWrite() выполняет сдвиг сразу всех битов, тем самым передавая данные через сдвиговый регистр к компонентам вывода (в данном случае – к светодиодам). Если 74x595 подключен к GPIO-контактам Pi напрямую, то запись каждого бита потребует 2 мкс (микросекунды) плюс дополнительные 2 мкс на срабатывание контакта-защелки. На первый взгляд, это быстро, но при передаче длинных строк могут возникнуть проблемы – 4 сдвиговых регистра, подключенных друг к другу, образуют 32-битный канал, поэтому в итоге одно обновление выполняется за 32 х 2 + 2 = 66 мкс. Более того, если данные будут идти через дополнительный GPIO-расширитель, эта задержка может увеличиться.
  • Если потребуется, то 74x595 можно питать не от 3,3 вольт, а от 5 вольт. В данном случае к Pi входных контактов не подключено, поэтому с повышением питающего напряжения не должно быть никаких проблем.

См.также

Внешние ссылки