74hc595 управление одним выходом

Grigory
Offline
Зарегистрирован: 29.03.2014

Доброго дня. Сталкнулся с такой проблемкой. использую 2 микрухи 74hc595. соединял их по вот этой схеме http://robocraft.ru/files/spi/2_shregs_schematics_preview.jpg . Код:

http://robocraft.ru/templates/skin/new/images/code.gif) rgb(248, 248, 248);">
#include <SPI.h>

enum { REG1 = 8, REG2 = 7 };


/* Копипаста не для нас, писать в регистр теперь будем так */
void writeShiftRegister(int ss_pin, uint8_t value)
{
  digitalWrite(ss_pin, LOW);
  SPI.transfer(value);
  digitalWrite(ss_pin, HIGH);
}


void setup()
{
  SPI.begin();

  /* Всё то же, что и в первом примере, только для двух регистров */
  pinMode(REG1, OUTPUT);
  pinMode(REG2, OUTPUT);

  writeShiftRegister(REG1, 0);
  writeShiftRegister(REG2, 0);
}


void rotateLeft(uint8_t &bits)
{
  uint8_t high_bit = bits & (1 << 7) ? 1 : 0;
  bits = (bits << 1) | high_bit;
}


void rotateRight(uint8_t &bits)
{
  uint8_t low_bit = bits & 1 ? (1 << 7) : 0;
  bits = (bits >> 1) | low_bit;
}


void loop()
{
  static uint8_t nomad1 = 1, nomad2 = 0x80;

  writeShiftRegister(REG1, nomad1);
  rotateLeft(nomad1);

  writeShiftRegister(REG2, nomad2);
  /* Для разнообразия погоняем биты во втором регистре в обратную сторону */
  rotateRight(nomad2);

  delay(1000 / 8);
}

 

Подскажите как допустим на первой микрухе поставить на выход № 4 режим HIGH , а на второй на ноге №6 тоже HIGH

Grigory
Offline
Зарегистрирован: 29.03.2014

Насколько я понял порты микрухи сначала заполняются значениями, далее через "защелку" происходит подтверждение

Штирлиц
Штирлиц аватар
Offline
Зарегистрирован: 13.06.2015

Глянь тута  .

Grigory
Offline
Зарегистрирован: 29.03.2014

все решилось куда более простым способом, поиграв с калькулятором в режиме программиста получил следующую вещь

 

 writeShiftRegister(REG1, 2);

writeShiftRegister(REG1, 4);

writeShiftRegister(REG1, 8);

writeShiftRegister(REG1, 16);

а для двух микрух

writeShiftRegister(REG1, 2);

writeShiftRegister(REG2, 0);

writeShiftRegister(REG1, 8);

writeShiftRegister(REG2,0);

writeShiftRegister(REG1, 16);

writeShiftRegister(REG2, 0);

 и тд. исходя из этого уже состряпал скеч который удовлетворяет всем моим потребностям. 

Grigory
Offline
Зарегистрирован: 29.03.2014

заморачался далее

[code]
#include <SPI.h>
#include <string.h>
enum { REG1 = 9, REG2 = 8 };
 
char Mas[2];
String inString;
uint8_t Stroka[6] = {2, 4, 8, 16, 32, 64};
uint8_t Kolonka[6] = {2, 4, 8, 16, 32, 64};
 
void setup() {
 
 
  SPI.begin();
  Serial.begin(9600);
  /* Всё то же, что и в первом примере, только для двух регистров */
  pinMode(REG1, OUTPUT);
  pinMode(REG2, OUTPUT);
  writeShiftRegister(REG1, 0);
  writeShiftRegister(REG2, 0);
}
 
void loop() {
  while (Serial.available())
  {
    char inChar = Serial.read();
    inString += inChar;
    if (inChar == '\n' || inChar == '\0')
    {
      writeShiftRegister(REG1, 0);
      writeShiftRegister(REG2, 0);
      for (int i = 0; i < 3; i++)
      {
        Mas[i] = inString[i];
      }
 
      if (String(Mas[0]) = "Q") 
      {
        writeShiftRegister(REG1,uint8_t(2));
       
      }
      if (String(Mas[1]) = "Q") 
      {
        writeShiftRegister(REG2, uint8_t(2));
      }
      if (String(Mas[0]) = "W")
      {
        writeShiftRegister(REG1,Stroka[1]);
       
      }
      if (String(Mas[1]) = "W") 
      {
        writeShiftRegister(REG2, Kolonka[1]);
      }
      if (String(Mas[0]) = "E") 
      {
        writeShiftRegister(REG1,Stroka[2]);
     
      }
      if (String(Mas[1]) = "E") 
      {
        writeShiftRegister(REG2,Kolonka[2]);
      }
      if (String(Mas[0]) = "R")
      {
        writeShiftRegister(REG1, Stroka[3]);
    
      }
      if (String(Mas[1]) = "R") 
      {
        writeShiftRegister(REG2, Kolonka[3]);
      }
      if (String(Mas[0]) = "T") 
      {
        writeShiftRegister(REG1, Stroka[4]);
     
      }
      if (String(Mas[1]) = "T") 
      {
        writeShiftRegister(REG2, Kolonka[4]);
      }
      if (String(Mas[0]) = "Y")
      {
        writeShiftRegister(REG1, Stroka[5]);
      
      }
      if (String(Mas[1]) = "Y") 
      {
        writeShiftRegister(REG2, Kolonka[5]);
      }
      delay(2000);
      writeShiftRegister(REG1, 0);
      writeShiftRegister(REG2, 0);
 
    }
  }
}
 
/* Копипаста не для нас, писать в регистр теперь будем так */
void writeShiftRegister(int ss_pin, uint8_t value)
{
  digitalWrite(ss_pin, LOW);
  SPI.transfer(value);
  digitalWrite(ss_pin, HIGH);
}
 
 
[/code]
 
 
но получаю не однозначную реакцию со стороны второй микрухи. Согласно http://robocraft.ru/blog/arduino/519.html  управление 2 микрухами должно быть независимым, но исходя из результата чтото вызывает сомнение. 
arduinec
Offline
Зарегистрирован: 01.09.2015