Работа со сдвиговым регистром 74HC595

Hleb13
Offline
Зарегистрирован: 16.04.2015

Здравствуйте!

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

#include <Shift595.h>

#define dataPin 8
#define latchPin 9
#define clockPin 10

#define numOfRegisters 1

Shift595 Shifter(dataPin, latchPin, clockPin, numOfRegisters);

void setup() {
  
  
  pinMode(12, OUTPUT);
  digitalWrite(12, LOW);

}

void loop() {
  // put your main code here, to run repeatedly:
   Shifter.setRegisterPin(0, LOW);
      Shifter.setRegisterPin(1, LOW);
         Shifter.setRegisterPin(2, LOW);
            Shifter.setRegisterPin(3, LOW);
               Shifter.setRegisterPin(4, LOW);
                  Shifter.setRegisterPin(5, LOW);
                     Shifter.setRegisterPin(6, LOW);
                        Shifter.setRegisterPin(7, LOW);
 

}

Проблема, с которой я столкнулся - при подаче питания на плату Arduino все светоиоды кратковременно моргают, потом сразу гаснут, то есть на вход оегистра прилетает импульс. Подскажите, пожалуйста, как избавиться от этого эффекта. Выход OE на регистре подключен к земле, то есть все входы всегда включены. Пробовал подключать к шине 5V, тогда ничего не работает, светодиоды никогда не загораются, даже если отправить через set.Register команду HIGH. Пробовал данный контакт подключать к Arduino и в setup написать digitalWrite(pinOE, LOW). Но все равно проблема осталась.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Подсоедините ОЕ регистра через резистор ~10К к напряжению питания и напрямую к выходу Arduino. В нужный момент подать LOW.

Hleb13
Offline
Зарегистрирован: 16.04.2015

Спасибо большое!

Подключил к 5V через резистор 10 кОм и к 12 выходу Arduino.

Написал такой скетч:

#include <Shift595.h>
 

#define dataPin 8
#define latchPin 9
#define clockPin 10 

#define numOfRegisters 1 

Shift595 Shifter(dataPin, latchPin, clockPin, numOfRegisters); 

void setup() {
   

  pinMode(12, OUTPUT);

  digitalWrite(12, LOW); 

} 

void loop() {

     Shifter.setRegisterPin(0, LOW);
      Shifter.setRegisterPin(1, LOW);
         Shifter.setRegisterPin(2, HIGH);
            Shifter.setRegisterPin(3, LOW);
               Shifter.setRegisterPin(4, LOW);
                  Shifter.setRegisterPin(5, LOW);
                     Shifter.setRegisterPin(6, LOW);
                        Shifter.setRegisterPin(7, LOW);
                      
             }

Все заработало! При включении нет промаргивания светодиодов.

Hleb13
Offline
Зарегистрирован: 16.04.2015

Вновь подниму тему: Сделал все как описал выше. Теперь при подаче питания на плату Arduino не прилетают импульсы на выходы регистра. Но стоит подать с Arduino значение LOW на пин, подключенный на вход регистра OE (в любом месте программы), как проблема возвращается: кратковременно мерцают все светодиоды на регистре.

Можно как-нибудь полность избавить от этого эффекта, не только при подаче питания?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Чтобы ПОЛНОСТЬЮ избавиться от эффекта есть два способа: щадящий и радикальный.

Щадящий заключается в том, чтобы отключить от питания светодиоды.

Радикальный - отключить от питания всю ардуину.

 

Вообще-то нужно сначала установить на выходах регистра желаемые значения, а только потом активировать его по OE. Собственно, ОЕ только затем и нужен, чтобы подключать выходы регистра, а чтобы там были нужные данные - Вы сами должны заблаговременно позаботиться.

И еще, какая-то у Вас некрасивая инициализация регистров. Обычно пишут примерно так:
 

int data[] = {LOW, LOW, HIGH, LOW, LOW, LOW, LOW, LOW};

void loop(){

  for (int i = 0; i < 8; i++)

    Shifter.setRegisterPin(i, data[i]);

}

либо вообще упрятать данные в один байт:

char data = 0x04;

void loop(){

  for (int i = 0; i < 8; i++)

    Shifter.setRegisterPin(i, (data >> i) & 1);

}
Hleb13
Offline
Зарегистрирован: 16.04.2015

А если мне нужно, чтобы при подаче питания (включении Arduino) один светодиод загорелся (на первом пине регистра), через какое-то время я на пульте кнопку нажал - второй светодиод загорелся (на втором пине регистра) и т.д. При этом, чтобы другие светодиоды при обращении к первым двум никак не реагировали, пока я их Shifter.setRegisterPin не вызову. 

Процедура включения светодиодов на регистре с пульта уже написана, нужно исключительно избавиться от эффекта кратковременного мерцания при подаче LOW на OE и при подаче питания на Arduino.

Такая схема может быть реализована на сдвиговом регистре?

Заранее благодарен!

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Из третьего поста я понял, что одна проблема решена, но осталась другая, правда, не понял, какая. Теперь уже вообще перестал что-либо понимать: что делаете, как делаете, что из этого получается, и чем это отличается от желаемого.

Есть подробная инструкция по работе со сдвиговым регистром: https://www.arduino.cc/en/Tutorial/ShiftOut

Начните с нее. Если этого окажется недостаточно, продробнее опишите, как подключаете и как программируете.

Hleb13
Offline
Зарегистрирован: 16.04.2015

#include <Shift595.h> 

#define dataPin 8 
#define latchPin 9 
#define clockPin 10 
#define numOfRegisters 1  

Shift595 Shifter(dataPin, latchPin, clockPin, numOfRegisters);  

 
void setup() { 

pinMode(12, OUTPUT); 

digitalWrite(12, LOW); 

Shifter.setRegisterPin(0, HIGH); 
 
}  

 
void loop() {  } 

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

Как мне поправить скетч, чтобы избавиться от промаргивания, а при подаче питания просто загорался только нужный светодиод, как это было бы, если светодиоды были подключены напрямую к Arduino?

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

У регистра есть ещё такой " волшебный" вход:

PIN 13 OE Output enable, active low

Надеюсь понятно что с ним надо сделать в первых строках сэтапа.

Hleb13
Offline
Зарегистрирован: 16.04.2015

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

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

Ну  так вы в сэтапе первым делом сделайте его ХАЙ чтобы отключить моргание!
Не забыв сначала сделать его оутпутом, а то получится включение резистора подтяжки.

А ещё дучше резистор 4к7 - 10 К на питание подвесить.

Hleb13
Offline
Зарегистрирован: 16.04.2015

Если первым делом сделать HIGH на 12 выход, то выходы регистра не включаются даже после принудительного включения пина, например, Shifter.setRegisterPin(0,HIGH);

Получается, что в этом случае ничего не работает. Кстати, 10К резистор к питанию у меня используется.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Нужно сначала сделать HIGH на OE,

Затем занести нужныен данные в сдвиговый регистр,

И только потом делать на OE LOW.

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

Да.  И это должно быть очевидно.

Скажу больше- если туда подавть сигнал ШИМ с  AnalogWrite то получится управление яркостью светодиодов.

Hleb13
Offline
Зарегистрирован: 16.04.2015
#include <Shift595.h>

#define dataPin    7    
#define latchPin   8        
#define clockPin   9       
#define OE      10        
#define numOfRegisters   1   

Shift595 Shifter(dataPin, latchPin, clockPin, numOfRegisters); 

              void setup() {   

              pinMode(dataPin, OUTPUT);
              pinMode(latchPin, OUTPUT);
              pinMode(clockPin, OUTPUT);
              pinMode(OE, OUTPUT);

              digitalWrite(OE, HIGH);

              Shifter.setRegisterPin(0, LOW); 
              Shifter.setRegisterPin(1, LOW); 
              Shifter.setRegisterPin(2, LOW); 
              Shifter.setRegisterPin(3, LOW); 
              Shifter.setRegisterPin(4, LOW); 
              Shifter.setRegisterPin(5, LOW); 
              Shifter.setRegisterPin(6, LOW); 
              Shifter.setRegisterPin(7, LOW); 

              digitalWrite(OE, LOW);

                                     }

              void loop() { }

Итак! Сейчас у меня во такой скетч. В самом начале подаю HIGH на OE, записываю данные в регистр (все светодиоды выключены), затем подаю LOW на OE. По идее, при запуске программы ничего гореть не должно, так и просходит. Но все равно пролетает промаргивание! Уже не знаю что делать, может это все же аппаратная особенность регистра? Или что-то поправить мне надо скетче?

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

А так моргает?

    
#define OE      10        

     void setup() {
   
 digitalWrite(OE, HIGH);
 pinMode(OE, OUTPUT);

 }

    void loop() { }

 

Hleb13
Offline
Зарегистрирован: 16.04.2015

Нет, с таким скетчем не моргает. А что это означает?

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

А это значит :
С выключением выходов регистра всё в порядке, как и должно было быть.
Теперь добавляйте всё то что вы хотите с ним делать.
 

Hleb13
Offline
Зарегистрирован: 16.04.2015

Спасибо большое!

Вот с таким скетчем все заработало как надо! 

#include <Shift595.h>

#define dataPin    7         // DATA вход сдвигового регистра
#define latchPin   8         // LATCH вход сдвигового регистра
#define clockPin   9         // CLOCK вход сдвигового регистра
#define OE         10        // OE вход сдвигового регистра
#define numOfRegisters   1   // Количество сдвиговых регистров

Shift595 Shifter(dataPin, latchPin, clockPin, numOfRegisters);

     void setup() {    

 digitalWrite(OE, HIGH);
 
 pinMode(OE, OUTPUT);

 Shifter.setRegisterPin(0, HIGH);
 Shifter.setRegisterPin(1, LOW);
 Shifter.setRegisterPin(2, LOW);
 Shifter.setRegisterPin(3, LOW);
 Shifter.setRegisterPin(4, LOW);
 Shifter.setRegisterPin(5, LOW);
 Shifter.setRegisterPin(6, LOW);
 Shifter.setRegisterPin(7, LOW);
 
 digitalWrite(OE, LOW);

 } 

    void loop() { }

 

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

1. Одна команда для очистки всех регистров :     clearRegisters();
2. И вроде включать в сэтапе выход очищенного регистра нет смысла- просто лишняя команда, и так всё выключено по OE.
3. А если это светодиоды- то как раз использовать AnalodWrite (OE, 0) для гашения и всёчто больше "0" для яркости.

Hleb13
Offline
Зарегистрирован: 16.04.2015

Спасибо!

Еще вопрос есть, не совсем по теме, но есть общее.

К 13 пину у меня подключен светодиод, соответственно, при подаче питания на Arduino этот светодиод промаргивает, а потом гаснет, так как в setup у меня прописано pinMode (13, LOW). Все это происходит из-за того, что параллельно ему подключен светодиод на плате Arduino.

Как отключить промаргивание на 13 пине?

Заранее благодарен!

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

Можете в сетапе ничего не делать.
Диодом моргает загрузчик.
Он сам потухнет после окончания работы загрузчика- станет обычным входом.
Отключить загрузчик можно.
Это лечится фьюзом, но тогда вы не сможете программировать без программатора.
Зато получите мнОООООООго памяти  ;)

З. Ы. А может  есть и неморгающие загрузчики.....
Кстати  13 - это сигнал CLCK на хардварном SPI...

Гриша
Offline
Зарегистрирован: 27.04.2014

Hleb13 пишет:

Как отключить промаргивание на 13 пине?

подумать, что можно "посадить " на 13 пин, чему промаргиваение не дудет мешать и выпаять LED, или смотрите пост 21 выше...

Клапауций 999
Offline
Зарегистрирован: 06.06.2015

Hleb13 пишет:

Как отключить промаргивание на 13 пине?

сотри или модифицируй загрузчик.

Гриша
Offline
Зарегистрирован: 27.04.2014

Клапауций 999 пишет:

сотри или модифицируй загрузчик.

шеф, похоже ТС не в состоянии это сделать, куда проще ничего на ногу не вешать... а вообще в природе существует много разных готовых загрузчиков, но для экспериментов нужен программатор (сразу высоковольтный) или много МК - жертвы эксперимента

a.skalkin
Offline
Зарегистрирован: 12.01.2016

Доброго времени суток. Подскажите уважаемые знатоки, а можно ли, и как, при использовании сдвигового ригистра, байт (0b00000000) отправляемый на него формировать с переменных, значение которых изменяется в результате нажатия кнопки, т.е. 1 или 0.

Гриша
Offline
Зарегистрирован: 27.04.2014

a.skalkin пишет:

Доброго времени суток. Подскажите уважаемые знатоки, а можно ли, и как, при использовании сдвигового ригистра, байт (0b00000000) отправляемый на него формировать с переменных, значение которых изменяется в результате нажатия кнопки, т.е. 1 или 0.

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

Смущает выражение, «в результате нажатия кнопки» в единственном числе.

UPD, конечно можно :)

a.skalkin
Offline
Зарегистрирован: 12.01.2016

Всем доброго времени суток. Знатоки, подскажите, а как при использовании этой библиотеки shift595.h обращаться к пинам 2-го или 3-го регистра, если их подключать два или три соответственно? Или где найти описание библиотеки, второй день не могу найти.

Заранее благодарен.

sergkr1983
Offline
Зарегистрирован: 09.12.2015

У меня вот какая еть проблемка. На 7 пине регистра стоит пищалка. Вот даю команду:

      Shifter.setRegisterPin(7, HIGH);
      delay(500);
      Shifter.setRegisterPin(7, LOW);

Иногда срабатывает. А иногда виснет (и пищит постоянно). Из-за чего - не пойму.

И ещё вылезла ОООЧЕНЬ БОЛЬШАЯ проблемма. После того как команда выполнена у меня в порт (для компа) отправляеться OK. Сейчас тоже отправляеться, но перед этим сначала отправляться стали несколько пустых строк. В чём может быть проблемма?

MYFRIEND
MYFRIEND аватар
Offline
Зарегистрирован: 31.01.2017

Здравствуйте! возник вопрос, делал код такой как у автора, одна и та же библиотека, вот подскажите, как задействовать еще+3 выхода ардуино для еще одного регистра, не собирая последовательно, а именно еще 3 выхода. Возможно ли так? Вопрос возник из необходимости подключить 150 светодиодов как минимум, лучше 300, которыми нужно командой   Shifter.setRegisterPin(1, HIGH); управлять, пробовал управлять   Shifter.setRegisterPin(15, HIGH); подключив 2 регистра, библиотека увы не умеет добавлять сама номера   Shifter.setRegisterPin(1-300, HIGH); например. Может возможно библиотеку как то доработать что бы просто вписать туда если количество регистров=2  при выборе в #define   numOfRegisters    2 или #define   numOfRegisters    10 то и появлялись бы пины 1-300. Какие еще есть способы поштучно включить 300 диодов, обошёл весь поиск и искать пришлось днями и сутками, набрёл на ваш форум, знает ли кто? Спасибо за ответы если кто знает.

MYFRIEND
MYFRIEND аватар
Offline
Зарегистрирован: 31.01.2017

друзья, придумал сам как сделать разветвление регистров каждый на 3 провода, что дало возможность управлять ими !!! каждым светодиодом отдельно каждой ножкой, теперь это возможно для примерно 120 светодиодов на MEGA2560, когда там предел для цифровых выходов был бы 54 выхода, если удалось бы еще 6 аналоговых сделать цифровыми то вышло бы из 60 цифровых выходов 160 выходов на диоды либо 160 цифровых выходов. но и 120 диодов при 8 битах ниже код покажу, сэкономит многим многие дни поиска решения, но так и не решил вопрос на 64 бит сделать на данном примере или даже на 16 бит на данном примере ничего не удаётся, код если кому нужен - очень простой, дальше из кода разберется каждый как добавить следующий регистр там всё написал

#include <Shift595.h>

#define   dataPin          11      // SINII (расцветка пинов регистра на картинке) все понятно data
#define   latchPin          4      // ZELENY  latch
#define   clockPin          6      // ORANJEVY   clock и помните GND обязательно 8+13 и 5в обязательно 10+16 // пины иначе регистр не работает и многие коды только в 1.6.0 компилируются, а в 1.6.10 тот же код ошибочный что еще много дней сэкономит решения вопроса

#define   numOfRegisters    1      // number of shift registers present так и оставил пока 1 шт. проще вышло
//их каждый по 3м проводам управлять чем пытатья 64 бит на каждую ножку управлять 4 регистрами

Shift595 Shifter(dataPin, latchPin, clockPin, numOfRegisters);
//************************************************************************************
#define   dataPindva          12      // SINII
#define   latchPindva          5      // ZELENY
#define   clockPindva          7     // ORANJEVY

#define   numOfRegistersdva    1      // number of shift registers present

Shift595 Shifterdva(dataPindva, latchPindva, clockPindva, numOfRegistersdva);

void setup(){}

void loop()
{
  Shifter.setRegisterPin(0, HIGH);
  Shifter.setRegisterPin(1, HIGH);
  Shifter.setRegisterPin(2, HIGH);
  Shifter.setRegisterPin(3, HIGH);
  Shifter.setRegisterPin(4, HIGH);
  Shifter.setRegisterPin(5, HIGH);
  Shifter.setRegisterPin(6, HIGH);
  Shifter.setRegisterPin(7, HIGH);

   delay(1000);
 
   Shifter.setRegisterPin(0, LOW);
  
Shifter.setRegisterPin(1, LOW);
  Shifter.setRegisterPin(2, LOW);
Shifter.setRegisterPin(3, LOW);
   Shifter.setRegisterPin(4, LOW);
   Shifter.setRegisterPin(5, LOW);
Shifter.setRegisterPin(6, LOW);
  Shifter.setRegisterPin(7, LOW);

   delay(1000);
//************************************************************************************
  Shifterdva.setRegisterPin(0, HIGH);
  Shifterdva.setRegisterPin(1, HIGH);
  Shifterdva.setRegisterPin(2, HIGH);
  Shifterdva.setRegisterPin(3, HIGH);
  Shifterdva.setRegisterPin(4, HIGH);
  Shifterdva.setRegisterPin(5, HIGH);
  Shifterdva.setRegisterPin(6, HIGH);
  Shifterdva.setRegisterPin(7, HIGH);

   delay(1000);
 
Shifterdva.setRegisterPin(0, LOW);
Shifterdva.setRegisterPin(1, LOW);
Shifterdva.setRegisterPin(2, LOW);
Shifterdva.setRegisterPin(3, LOW);
Shifterdva.setRegisterPin(4, LOW);
Shifterdva.setRegisterPin(5, LOW);
Shifterdva.setRegisterPin(6, LOW);
Shifterdva.setRegisterPin(7, LOW);
   delay(1000); 
}

самый главный вопрос, как добавить 2й сдвиговый регистр паровозом? как их прицепить отдельно теперь я сделал код, а как сделать их в каждом по 2 регистра 16 бит управляя отдельными ножками, если сделаю расскажу сам, может есть знатоки?

MYFRIEND
MYFRIEND аватар
Offline
Зарегистрирован: 31.01.2017

друзья дополню тему сдвиговых регистров! успешно подключил и удалось управлять 16 ножками - 16 бит  паровозиком на 16 бит

код тем, кто сэкономит долгие трудные часы и дни решения вопроса, разобрался изучив библиотеку, и удалось получить способ управления любой ножкой диода в паровозиках и в линиях по 3 провода паровозики расставив линиями, для mega2560 выйдет примерно 17 линий по 3 провода для 51 цифрового выхода, на каждую удастся паровозик либо 1 регистр ставить и управлять любым светодиодом 1 регистр - 136 выводов, 2 регистра - 272, 3 регистра - 408, 4 регистра - 544, 5 регистров - 680, 6 регистров - 816, 7 регистров - 952, 8 регистров - 1088, 9 регистров - 1224, 10 регистров - 1360, если паровозик потащит 11 регистров и выше то пинов еще добавится, если кому мало то еще +3 провода добавить возможно и сделав аналоговые выводы цифровыми.

у кого нет MEGA2560 могут добавтиь 2$ при покупке с небольшой памятью ардуин и получить 256кб памяти за 7$

на 17 линий по 3 провода возможно установить примерно 1224 светодиодов, используя лишь свдиговые регистры. Это означает 1224 цифровых выводов у MEGA2560 если она потянет по 10 регистров на линию, нужны тесты. 2 регистра на линию тянет, это не менее 272 вывода, уже протестировано на 1й линии и 2й линии которые управляют диодами.

код

#include <Shift595.h>

#define   dataPin          11     

 // SINII 
#define   latchPin          4     

 // ZELENY 
#define   clockPin          6     

 // ORANJEVY

#define   numOfRegisters    2     

 // number of shift registers 

present

Shift595 Shifter(dataPin, 

latchPin, clockPin, 

numOfRegisters);



//*******************************

*********************************

********************
#define   dataPindva          12  

    // SINII 
#define   latchPindva          5  

    // ZELENY 
#define   clockPindva          7  

   // ORANJEVY

#define   numOfRegistersdva    2  

    // number of shift registers 

present

Shift595 Shifterdva(dataPindva, 

latchPindva, clockPindva, 

numOfRegistersdva);





void setup(){}

void loop()
{
  Shifter.setRegisterPin(0, 

HIGH);
  Shifter.setRegisterPin(1, 

HIGH);
  Shifter.setRegisterPin(2, 

HIGH);
  Shifter.setRegisterPin(3, 

HIGH); 
  Shifter.setRegisterPin(4, 

HIGH);
  Shifter.setRegisterPin(5, 

HIGH);
  Shifter.setRegisterPin(6, 

HIGH);
  Shifter.setRegisterPin(7, 

HIGH);

   delay(1000);
  
   Shifter.setRegisterPin(0, 

LOW);
   
 Shifter.setRegisterPin(1, LOW);
  Shifter.setRegisterPin(2, LOW);
 Shifter.setRegisterPin(3, LOW); 
   Shifter.setRegisterPin(4, 

LOW);
   Shifter.setRegisterPin(5, 

LOW);
 Shifter.setRegisterPin(6, LOW);
  Shifter.setRegisterPin(7, LOW);

   delay(1000);
//*******************************

*********************************

********************
 Shifterdva.setRegisterPin(0, 

HIGH);
 Shifterdva.setRegisterPin(1, 

HIGH);
Shifterdva.setRegisterPin(2, 

HIGH);
Shifterdva.setRegisterPin(3, 

HIGH); 
Shifterdva.setRegisterPin(4, 

HIGH);
Shifterdva.setRegisterPin(5, 

HIGH);
Shifterdva.setRegisterPin(6, 

HIGH);
Shifterdva.setRegisterPin(7, 

HIGH);

   delay(1000);
  
Shifterdva.setRegisterPin(0, 

LOW);
Shifterdva.setRegisterPin(1, 

LOW);
Shifterdva.setRegisterPin(2, 

LOW);
Shifterdva.setRegisterPin(3, 

LOW); 
Shifterdva.setRegisterPin(4, 

LOW);
Shifterdva.setRegisterPin(5, 

LOW);
Shifterdva.setRegisterPin(6, 

LOW);
Shifterdva.setRegisterPin(7, 

LOW);

   delay(1000);
Shifterdva.setRegisterPin(8, 

HIGH);
Shifterdva.setRegisterPin(9, 

HIGH);
Shifterdva.setRegisterPin(10, 

HIGH);
Shifterdva.setRegisterPin(11, 

HIGH); 
Shifterdva.setRegisterPin(12, 

HIGH);
Shifterdva.setRegisterPin(13, 

HIGH);
Shifterdva.setRegisterPin(14, 

HIGH);
Shifterdva.setRegisterPin(15, 

HIGH);

   delay(1000);
  
Shifterdva.setRegisterPin(8, 

LOW);
Shifterdva.setRegisterPin(9, 

LOW);
Shifterdva.setRegisterPin(10, 

LOW);
Shifterdva.setRegisterPin(11, 

LOW); 
Shifterdva.setRegisterPin(12, 

LOW);
Shifterdva.setRegisterPin(13, 

LOW);
Shifterdva.setRegisterPin(14, 

LOW);
Shifterdva.setRegisterPin(15, 

LOW);

   delay(1000);



  
}

для добавления новых ножек добавив новые регистры

Shifterdva.setRegisterPin(16, LOW); Shifterdva.setRegisterPin(17 //и так далее ножки регистров будут прибавляться хоть 100 шт. 

// это будет как 1 микросхема на 80 ножек например для ситуаций где не понадобится супер скорость этого будет достаточно, а MEGA2560 получит до 1360 ножек, возможно больше если кто добавит больше  ножек напишите, выше описаны все способы управления отдельной ножкой - на линии по 3 провода и в паровозике, не забывайте о правильной схеме подключения регистра, 2 земли 2х5в. вагончики сцепляются общим для всех CLOCK общим для всех LATH и друг за друга цепляются Q7' земля на ножках 8+13, 5в на ножках 10+16 всем спасибо кто изучает данный вопрос. 

 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

1. Непонятно, зачем здесь вообще нужна библиотека. Библиотеки, как правило, пишутся для того, чтобы упростить работу с каким-либо устройством. Управление же сдвиговым регистром настолько просто само по себе, что наличия дополнительной библиотеки не нужно.

2. Каскадное включение сдвиговых регистров - стандартная практика, прекрасно описанная в литературе, что к этому еще можно добавить - непонятно.

3. MYFRIEND, Вам бы следовело ознакомиться с таким понятием как циклы. Без них код получается просто неприличным.

4. Наиболее простой, радикальный и БЫСТРЫЙ (!) способ подключения большого количества сдвиговых регистров - повесить их все каскадом на аппаратный SPI. Скорость получается примерно в 100 раз выше, чем при использовании shiftOut(). Да и лишние ноги не тратятся, тот же SPI можно использовать и для других устройств.

 

PS. Да, на всякий случай: один вызов shiftOut() занимает примерно 180-190 мкс. Для каскада из 10 регистров - соответственно под 2 мс, что, скажем, для программного диммирования уже критично. Так что еще раз хотел бы подчеркнуть, что при большом количестве регистров наилучший способ подключения - аппаратный SPI.

Doc
Offline
Зарегистрирован: 01.10.2016

Добрый день. Воспользовался библиотекой примером и библиотекой из первого поста Схема подключения:

Только пины на ардуине другие. Если это важно то 11,12,13.

// pin 11 on the 74HC595
int latchPin = 12;
// pin 12 on the 74HC595
int clockPin = 11;
// pin 14 on the 74HC595
int dataPin = 13;
// number of shift registers present
#define   numOfRegisters    1

Shift595 Shifter(dataPin, latchPin, clockPin, numOfRegisters);
	//подключение 74HC595
	pinMode(latchPin, OUTPUT);
	pinMode(clockPin, OUTPUT);
	pinMode(dataPin, OUTPUT);
	digitalWrite(latchPin, HIGH);

 

Так вот при подаче питания на конктерную ногу

void SetPowerOnCanal(bool isPWM, byte canal, bool isOn) {
	if (!isPWM) {
		if (isOn)
			Shifter.setRegisterPin(canal, HIGH);
		else
			Shifter.setRegisterPin(canal, LOW);


		Serial.println();
	}
}

На ножка 74hc595 абсолютно рандомные значения, иногда сразу все включены, иногда чать выключена, часть включена, менял 74hc595 не помогло. Где-тоя  что-то упускаю. Единственное что показания я снимаю через мультиметр, т.е. к 74hc595 ничего не подключено!!! Возможно стоит подключить какую-то нагрузку? Светодиоды? 

MYFRIEND
MYFRIEND аватар
Offline
Зарегистрирован: 31.01.2017

andriano Большое спасибо вам за советы! Точнее не посоветовать! Подскажите на ваш взгляд удачный пример SPI подключения сдвиговых регистров, нужно нацепить их не много не мало 172 выхода через них пропустить, справится SPI ? и быстрее выйдет ?

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

SPI справится. Задачу опишите детально, иогда можно будет обсуждать конкретно.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

MYFRIEND, сдвиговые регистры - достаточно быстрые устройства - гораздо быстрее, чем Ардуина. Здесь условно можно ориентироваться на скорость обмена 4 МГц. Т.е. для Ваших 172 выходов максимальная частота обновления будет 4000/172=23 кГц. Разумеется, при условии, что не будет проблем с других сторон: не будет длинных соединительных проводов, и будет обеспечено стабильное питание для всех микросхем и т.п.

Duet
Offline
Зарегистрирован: 17.01.2015

Как менять к примеру по нажатию кнопки изменить только один бит в переменной? Несколько кнопок, чтоб каждая кнопка менял только один бит, а остальные оставляла не изменными.  Индикация кнопок, кнопки титанового велосипеда, при использовании For не чего не работает.

int fff = B00000000;

shiftOut(dataPin, clockPin, MSBFIRST, fff);

if (BUTTON_01.event_click_Dn()) 
{
  fff = B00000100; }
andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Duet пишет:

... при использовании For не чего не работает.

int fff = B00000000;

shiftOut(dataPin, clockPin, MSBFIRST, fff);

if (BUTTON_01.event_click_Dn()) 
{
  fff = B00000100; }

Во-первых, я не вижу здесь никакого for.

А во-вторых, все работает - в переменной fff теперь установлен в единицу 2-й разряд. Чего ж Вам еще нужно?

Duet
Offline
Зарегистрирован: 17.01.2015

andriano пишет:

Во-первых, я не вижу здесь никакого for.

А во-вторых, все работает - в переменной fff теперь установлен в единицу 2-й разряд. Чего ж Вам еще нужно?

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

Пример с For не стал приводить, он блокирует все кнопки и двигателя.

 

Duet
Offline
Зарегистрирован: 17.01.2015

К примеру чтоб каждая кнопка меняла только один бит, каждая кнопка меняет только один свой бит из восьми. Не все восемь переписывала, а только один. Другие биты меняются другими кнопками.

Duet
Offline
Зарегистрирован: 17.01.2015

Понял, можно так менять отдельно биты:

int fff = B10000000;
int ddd = B00010000;
int hhh = B00000010;
shiftOut(dataPin, clockPin, MSBFIRST, ddd+fff+hhh); 
На выходе будет B10010010;
rkit
Offline
Зарегистрирован: 23.11.2016

Только |, а не +. И вообще, открой перечень операторов и изучи - куча вопросов исчезнет.

Гриша
Offline
Зарегистрирован: 27.04.2014

rkit пишет:

Только |, а не +. И вообще, открой перечень операторов и изучи - куча вопросов исчезнет.

поддерживаю, битовые операторы штука полезная 

тут вроде нормально написано, по простому https://learnc.info/c/bitwise_operators.html

и маленький вопросик, я его выделил 

Duet пишет:

Как менять к примеру по нажатию кнопки изменить только один бит в переменной? Несколько кнопок, чтоб каждая кнопка менял только один бит, а остальные оставляла не изменными.  Индикация кнопок, кнопки титанового велосипеда, при использовании For не чего не работает.

int fff = B00000000;

shiftOut(dataPin, clockPin, MSBFIRST, fff);

if (BUTTON_01.event_click_Dn()) 
{
  fff = B00000100; }

что у вас за переменная? 1 или 2 байта - вы как-нибудь определитесь int или byte 

Duet
Offline
Зарегистрирован: 17.01.2015

При подключении светодиодов на прямую к кнопкам для индикации нажатой кнопки. Как сделать правильно, вот так?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Я обычно использую цепочку: +5В-резистор-светодиод-контакты-земля. Сигнал на входной пин подается из точки соединения светодиода и контактов. В принципе, если включить встроенную подтяжку, схема будет почти как на рисунке выше, только обратной полярности (замкнутая кнопка, как и положено, дает логический ноль).