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

Тема в разделе "Arduino & Shields", создана пользователем JustasWolf, 2 сен 2015.

  1. JustasWolf

    JustasWolf Нерд

    Доброго времени суток, форумчане.
    Обращаюсь с просьбой растолковать методику и помочь решить проблему.
    Суть такова. Есть двухкаскадный регистр сдвига на 74HC595, соответственно, на 16 бит. К его выходам подсоединены четыре четырехбитных двоично-десятичных дешифратора(по два на каждый регистр).
    На вход дешифратора нужно подавать числа от 0 до 9 в виде 4 бит - разрядности для этого более, чем достаточно.
    Вопрос: как правильно программно сделать так, чтобы, представленное число, например, 1985, подавалось в регистр сдвига как последовательность: 0001(1) 1001(9) 1000(8) 0101(5) , а не как 0000011111000001
    Буду крайне благодарен.
    Заранее спасибо.
     
  2. acos

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

    Код (C++):

    #include <SPI.h>
    // 10 пин будет чипселектом 595-й
    const int slaveSelectPin = 10;

    void setup() {
      // он - выход
      pinMode (slaveSelectPin, OUTPUT);
      // инит SPI:
      SPI.begin();
    }
    void loop() {
      // посылка байтиков на 595
      digitalWrite(slaveSelectPin,LOW);
      SPI.transfer(modifyThis(1985));
      digitalWrite(slaveSelectPin,HIGH);
    }

    // функция для преобразования числа
    uint16_t modifyThis(uint16_t needSend)
    {
      uint16_t send_buffer=0;

      for (int i=0; i<4; ++i) {
        // получаем последнюю циферку числа отдельно
        uint16_t nextDigit = needSend % 10;
        // мотаем ее в нужное нам место
        nextDigit <<= i*4;
        // вставляем полученную перемотку в буффер
        send_buffer |= nextDigit;
        // на следующем шаге мы получим новую последнюю циферку
        needSend /= 10;
      }
      return send_buffer;
    }
     
    JustasWolf нравится это.
  3. acos

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

    Оговорик - используем пины SPI arduino. Можно запросто переделать на
    shiftOut()
     
  4. JustasWolf

    JustasWolf Нерд

    Спасибо за наводку!
    Вгрузил код, однако на выходе получил одинаковые результаты на первом и на втором регистрах. То есть, дешифраторы на выходах выдали дважды 8 и 5. Где искать ошибку?
     
  5. JustasWolf

    JustasWolf Нерд

    Все решилось вот таким способом:
    Код (C++):
    #include <SPI.h>
    // 10 пин будет чипселектом 595-й
    const int slaveSelectPin = 10;

    void setup() {
      // он - выход
      pinMode (slaveSelectPin, OUTPUT);
      // инит SPI:
      SPI.begin();
    }

    void writeShiftRegister16 (int slaveSelectPin, uint16_t needSend){
      digitalWrite (slaveSelectPin,LOW);
      //старший байт
      SPI.transfer (highByte (needSend));
      //младший байт
      SPI.transfer (lowByte (needSend));

      digitalWrite(slaveSelectPin,HIGH);
    }

    void loop() {
      // посылка байтиков на 595

        writeShiftRegister16 (slaveSelectPin, modifyThis(n));
    }

    // функция для преобразования числа
    uint16_t modifyThis(uint16_t needSend)
    {
      uint16_t send_buffer=0;

      for (int i=0; i<4; ++i) {
        // получаем последнюю циферку числа отдельно
        uint16_t nextDigit = needSend % 10;
        // мотаем ее в нужное нам место
        nextDigit <<= i*4;
        // вставляем полученную перемотку в буффер
        send_buffer |= nextDigit;
        // на следующем шаге мы получим новую последнюю циферку
        needSend /= 10;
      }
      return send_buffer;
    }
    Всем спасибо!!
     
    Последнее редактирование модератором: 2 сен 2015