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

Тема в разделе "Arduino & Shields", создана пользователем DKo, 24 июн 2014.

  1. DKo

    DKo Нерд

    Добрый День!
    Помогите, пожалуйста, разобраться со сдвиговым выходным регистром 74HC595.
    Как подключать, как посылать байты, я, вроде, понимаю. В случае с циферблатом мне все понятно, есть опеделенные байты, которые хранятся в массиве. Но как сделать так, чтобы данные из "двоичного" массива (допустим это массив длиной 8: {0,1,0,1,0,1,0,1}) загружались в регистр? Я так понимаю, что грубо говоря этот массив нужно преобразовать в байт?
    Пробовал сделать двумя способами:
    Код (Text):
    #include <SPI.h>
    int latchPin=8;
    uint8_t data[8]={0,0,0,0,0,0,0,0};
    void setup() {
      //устанавливаем режим OUTPUT
      SPI.begin();
      pinMode(latchPin, OUTPUT);
      writeShiftRegister(latchPin,0);

    }
    void writeShiftRegister(int ss, uint8_t val[8])
    {
      digitalWrite(ss,LOW);
      for (int i=0;i<8;i++)
      SPI.transfer(val[i]);
      digitalWrite(ss,HIGH);
    }
    void loop() {
      data[2]=1;
      data[1]=0;
      data[4]=1;
      data[6]=1;
    writeShiftRegister(latchPin,data);
    }
     
    И без SPI:
    Код (Text):

    //Пин подключен к ST_CP входу 74HC595
    int latchPin = 8;
    //Пин подключен к SH_CP входу 74HC595
    int clockPin = 9;
    //Пин подключен к DS входу 74HC595
    int dataPin = 7;

    int data[8]={0,0,0,0,0,0,0,0};
    void setup() {
      //устанавливаем режим OUTPUT
      pinMode(latchPin, OUTPUT);
      pinMode(dataPin, OUTPUT);
      pinMode(clockPin, OUTPUT);
    }
    void loop() {
      data[2]=1;
      data[1]=0;
      data[4]=1;
      data[6]=1;
      digitalWrite(latchPin,LOW);
      for (int i=0;i<8;i++)
      shiftOut(dataPin,clockPin,LSBFIRST,data[i]);
      digitalWrite(latchPin,HIGH);
      while(true);
    }
     
    Схема подключена корректно, т.к. при обычной передаче все работает.
    Я чувствую, что т.к. элементы массива являются целочисленными переменными, то, скорее всего, проблема в этом. Может стоит сделать его булевым и передавать туда true или false?

    Подскажите, что я неправильно делаю?
    Заранее спасибо!
     
  2. XCB

    XCB Гик

    двоичный массив длинной 8: {0,1,0,1,0,1,0,1} - это байт в вашем случае 1*64+1*16+1*4+1*1 =55h= 85
     
    DKo нравится это.
  3. DKo

    DKo Нерд

    Спасибо за ответ!
    Этот метод я понимаю, но мне хочется принципиально понять: возможно ли массив "использовать в качестве байта/нескольких байтов"? Мне это гораздо удобнее!
     
  4. ANV

    ANV Гуру

    Можно сделать битовую структуру: http://www.c-cpp.ru/books/bitovye-polya
    Битовых массивов не предусмотрено, только через преобразование.
     
    DKo нравится это.
  5. DKo

    DKo Нерд

    А если делать вот так? это не ошибочно?
    Код (Text):
    //Пин подключен к ST_CP входу 74HC595
    int latchPin = 8;
    //Пин подключен к SH_CP входу 74HC595
    int clockPin = 12;
    //Пин подключен к DS входу 74HC595
    int dataPin = 11;
    int MAS[8]={0,0,0,0,0,0,0,0};
    void setup() {
      //устанавливаем режим OUTPUT
      pinMode(latchPin, OUTPUT);
      pinMode(clockPin, OUTPUT);
      pinMode(dataPin, OUTPUT);
    }
    void loop() {
      MAS[0]=1;
      MAS[2]=1;
      MAS[6]=1;
        digitalWrite(latchPin, LOW);
        for (int i=7;i>=0;i--)  {
          digitalWrite(dataPin,MAS[i]);
          digitalWrite(clockPin,LOW);
          digitalWrite(clockPin,HIGH);
          MAS[i]=0;
      }
        digitalWrite(latchPin, HIGH);
        // пауза перед следующей итерацией
        delay(500);
    }
     
  6. ANV

    ANV Гуру

    Не, ну если повыпендриваться, то можно написать так:

    Код (Text):
    digitalWrite(dataPin,(MAS[i]==0)?LOW:HIGH);
    Но и без этого должно работать
     
  7. DKo

    DKo Нерд

    Не, вроде и без этого работает, 0 или 1 кушает)))
     
  8. DKo

    DKo Нерд

  9. acos

    acos Официальный гик Администратор

    Ethernet shield - да
    sd-card shield - нет.
     
    DKo нравится это.
  10. DKo

    DKo Нерд

    Отлично, спасибо!
     
  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]);
      digitalWrite (latchPin, HIGH);
    }
     
    Доброго времени суток!
    Освоил только один сдвиговый регистр, два и более не даются пониманию.
    Те примеры что есть в сети, дают понимание бегущего огонька...
    Не могли бы помочь в этом деле?