shiftOut() и последовательное соединение регистров 74HC595

Тема в разделе "Arduino & Shields", создана пользователем Recoshet, 6 янв 2014.

  1. mcureenab

    mcureenab Гуру

    На 20+ светодиодов нужен стабилизированный блок питания +5 Вольт. Стабилизатор Ардуино такую нагрузку не потянет. На 220 светодиодов нужен БП 5 Вольт, 5 Ампер с USB выходом для подключения Ардуино. Довольно мощная штука.
     
  2. myfriend

    myfriend Нуб

    с БП просто, нам только выходы сделать, регистр перепроверим, подключен как и первый, по другим схемам не работали GND обязательно 8+13 и 5в обязательно 10+16, так заработал 1й и 2й, соединяли одинаково clock и lath и Q7' на data 2го регистра, важно выяснить как каждой ножкой управлять на 2м регистре в паравозе, 1й способ выяснили на 3х проводах для каждого регистра удалось управлять.
    Как этот массив разобрать, понятно что есть 16 бит, пока 32 не берем, так как не понятно с 16 почему отдельно 8-15 ножки не нажимаются и не понятно почему нет команды в библиотеке стандартной например Shifter.setRegisterPin(8-15, HIGH/LOW); это было бы лучше всего с позиции разработчиков библиотеки. Получается если в библиотеке нет и не планируется такого способа, нужно искать другой способ либо доработать библиотеку, но как, что бы 1+x регистров автоматически всего лишь досылали этот Shifter.setRegisterPin(8-15, HIGH/LOW); что бы библиотека сама определяла на основе количества регистров указанного в начале кода, сколько максимум Shifter.setRegisterPin(МАКСИМАЛЬНО, HIGH/LOW);
    уместится. Кажется нужно влезать в эту библиотеку, вот её текст, там 3 строчки кода почти
    Код (C++):
    #ifndef Shift595_h
    #define Shift595_h
    #include "Arduino.h"

    // The constant max595s defines the maximum number of 74HC595's this library supports;
    // change it if you need more, or less. The default settings allow eight daisy-chained 595's,
    // creating an additional 64 Digital Output pins from just three of your Aurdino's native pins.

    #define max595s 8

    class Shift595
    {
      public:
      Shift595(int, int, int, int);
      void clearRegisters(void);
       void setRegisterPin(int, boolean);

      private:  
      int _dataPin;  // pin 14 on the 74HC595
       int _latchPin;  // pin 12 on the 74HC595
       int _clockPin;  // pin 11 on the 74HC595
     
       int _numOfPins;
     
       void writeRegisters(void);
     
       boolean _registers[max595s*8];
    };

    #endif
    не знаем что может здесь изменить и код cpp

    #include "Arduino.h"
    #include "Shift595.h"

    // constructor

    Shift595::Shift595(int dataPin, int latchPin, int clockPin, int numOfRegisters)
    {
      // initialize instance variables
      _dataPin = dataPin;
      _latchPin = latchPin;
      _clockPin = clockPin;
       _numOfPins = numOfRegisters*8;

      // initialize the rest of library
      pinMode(_dataPin, OUTPUT);
      pinMode(_latchPin, OUTPUT);
      pinMode(_clockPin, OUTPUT);
       clearRegisters();
    }

    // public functions

    void Shift595::clearRegisters(void)
    {
       for(int i = _numOfPins-1; i>=0; i--)
       {
         _registers = LOW;
       }
       Serial.println();
    }

    void Shift595::setRegisterPin(int index, boolean data)
    {
       _registers[index] = data;
       writeRegisters();

    }

    // private functions

    void Shift595::writeRegisters(void)
    {
       digitalWrite(_latchPin, LOW);     // unlatch from the 595 to update registers
       for(int i = _numOfPins-1; i>=0; i--)
       {
         digitalWrite(_clockPin, LOW);     //  bring the clock pin LOW, allowing us to shift new
                           //  data onto the register
       
         boolean data = _registers;     //  shift the new data onto the register
         digitalWrite(_dataPin, data);
       
         digitalWrite(_clockPin, HIGH);     // bring the clock pin HIGH to complete shift
       }
       digitalWrite(_latchPin, HIGH);     // re-latch to the 595 to output changes
     
       Serial.println();
    }

    все, здесь есть код boolean подскажите может в библиотеку добавить что что бы появилось определение автоматически сколько всего пинов доступно 0-15 вместо 0-8 например
     
    Последнее редактирование: 2 фев 2017
  3. mcureenab

    mcureenab Гуру

    В этом коде ошибки, потому не работает.

    Код (C++):
         _registers = LOW;

         boolean data = _registers;    //  shift the new data onto the register

    Странно, что он вообще скомпилировался.
     
  4. mcureenab

    mcureenab Гуру

    А это наверное квадратные скобки потерялись. Используйте кнопку "Код" для оформления исходников.
     
  5. mcureenab

    mcureenab Гуру

    Удалите из библиотеки все строки со словом
    Serial.
     
    myfriend нравится это.
  6. mcureenab

    mcureenab Гуру

    Количество пинов тут вычисляется:

    Код (C++):
    _numOfPins = numOfRegisters*8;
    Ваша забота указать в вызове Shift595 правильное количество регистров ( от 1 до 8).
     
  7. mcureenab

    mcureenab Гуру

  8. myfriend

    myfriend Нуб

    это файл cpp библиотеки ссылка на него https://yadi.sk/i/W2513xUv3CHiK9
    компилируется и правда он только в 1.6.0 , в 1.6.10 не компилируется ничего с этой библиотекой, библиоетка взята кажется с той же ссылки что и вы давали и файл h https://yadi.sk/i/LGt868CU3CHm94 библиотеки, появятся ли в команде Shifter.setRegisterPin(7, HIGH); при 16 битах например Shifter.setRegisterPin(8-15, HIGH); и если добавить еще регистры до 64 бит все ли появится? подскажите пожалуйста может заработает у вас, у вас должно заработать включение ножек отдельно каждой при 16 бит и 128 бит, мануал на ссылке изучали много часов ушло и дней прежде чем стали искать кого нибудь кто знает если знает ответ.
     
    Последнее редактирование: 1 фев 2017
  9. myfriend

    myfriend Нуб

    подскажите а 8 это ограничение?
    ещё вопрос, а как будет работать переменная numOfRegistesdva ? автоматически найдет? по записанному здесь

    Код (C++):
    #define   numOfRegistersdva    1      // number of shift registers present

    Shift595 Shifterdva(dataPindva, latchPindva, clockPindva, numOfRegistersdva);
    верно, указываем тут 2 регистра #define numOfRegisters 2 // number of shift registers present
    получается на то число которое указываем умножается вот это
    _numOfPins = numOfRegisters*8; а именно если указали 2 то выйдет _numOfPins = 2*8; или просто 16
     
    Последнее редактирование: 2 фев 2017
  10. myfriend

    myfriend Нуб

    спасибо вам большое!
    все заработало, удалять не пришлось serial, разобравшись в коде с вашей помощью от а до я и вы прибавили уверенности, что всё точно делаем, решили снова написать код как вы и подсказывали, и заработало 16 бит!!! (Карл 16 бит! сказал бы пользователь, который 7 дней и ночей ежеминутно пытался сделать это и удалось)
    вот рабочий код всем, кто сэкономит время многие дни делая код

    Код (C++):
    #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);

     
    }
    код управляет отдельными ножками !!! подключали к 2й линии 2 регистра паровозиком, #define numOfRegistersdva 2
    это казалось невозможным так как даже представления не было как это работает, библиотека заработала без исправлений, но уверенно шли зная что все что можно проверили, стали проверять способы подключения 2го регистра к 1му паровозиком, их оказалось несколько различных схем, важным было подключить 2 пина питания, что делали, но либо провод был некачественный, после разборки и сборки заново с нуля схемы, и нового кода,ножки стали управляться, 16 бит нажимаются любые ножки, если удастся так подключить 24 бита 32 бита добавим код, тем кто затратил бы дни, недели, месяцы выяснить как это работает.
    Большая благодарность первому ответившему и давшему самую большую поддержку пользователю
    mcureenab
     
  11. REm

    REm Гик

    может быть, автору темы подойдёт следующий пример, который общими усилиями написали на форуме
    по коду - два регистра выводят необходимую информацию.

    Код (C++):
    const byte latchPin = 6;
    const byte clockPin = 7;
    const byte dataPin = 5;


    byte number[] = {0b10000010, 0b10011111, 0b1000110, 0b01100010, 0b00110011, 0b00101010, 0b00001010, 0b11100011, 0b00000010, 0b00100010};


    void setup() {

    pinmode(latchPin, OUTPUT);
    pinmode(clockPin, OUTPUT);
    pinmode(dataPin, OUTPUT);

    }
    void loop() {

      digitalWrite (latchPin, LOW);

      shiftOut(dataPin, clockPin, MSBFIRST, number[1]);// 1й регистр
       shiftOut(dataPin, clockPin, MSBFIRST, number[5]);//2й регистр

      digitalWrite (latchPin, HIGH);
    }