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

ситх
Offline
Зарегистрирован: 26.10.2012

Подключил три регистра 74HC595 по этой схеме http://arduino.ru/Tutorial/registr_74HC595 (не допетрил как вставить отдельную картинку...) Зажигаю поочередно светодиоды, но загораются сразу три-по одному в каждов ряду. Вот код (на всякий...);

//Пин подключен к ST_CP входу 74HC595
int latchPin = 8;
//Пин подключен к SH_CP входу 74HC595
int clockPin = 12;
//Пин подключен к DS входу 74HC595
int dataPin = 11;
int reg=0;
int led_1=1;
 
void setup() {
  //устанавливаем режим OUTPUT
  pinMode(latchPin, OUTPUT);
  pinMode(dataPin, OUTPUT);  
  pinMode(clockPin, OUTPUT);
  pinMode(led_1, OUTPUT);
  
}
 
void loop() {
  int x=0;
  int del=50;
    delpin=random(50, 500);
    registerWrite(2, HIGH);
    delay(del); 
    //registerWrite(0, LOW);
    delay(del);
   
    }
    
  // Этот метот записывает байт в регистр
void registerWrite(int whichPin, int whichState) {
// инициализируем и обнуляем байт
  byte bitsToSend = 0;
 
  //Отключаем вывод на регистре
  digitalWrite(latchPin, LOW);
 
  // устанавливаем HIGH в соответствующем бите
  bitWrite(bitsToSend, whichPin, whichState);
 
  // проталкиваем байт в регистр
  shiftOut(dataPin, clockPin, MSBFIRST, bitsToSend);
 
    // "защелкиваем" регистр, чтобы байт появился на его выходах
  digitalWrite(latchPin, HIGH);
  
}

 

 

maksim
Offline
Зарегистрирован: 12.02.2012

Сохранение картинок на форуме

Регистры работают корректно, просто вы ими так управляете, а точнее вы пытаетесь управлять тремя регистрами как одним.

//Пин подключен к ST_CP входу 74HC595
int latchPin = 8;
//Пин подключен к SH_CP входу 74HC595
int clockPin = 12;
//Пин подключен к DS входу 74HC595
int dataPin = 11;
int reg=0;
int led_1=1;
 
void setup() {
  //устанавливаем режим OUTPUT
  pinMode(latchPin, OUTPUT);
  pinMode(dataPin, OUTPUT);  
  pinMode(clockPin, OUTPUT);
  pinMode(led_1, OUTPUT);
}
 
void loop() {
  int x=0;
  int del=500;
  //delpin=random(50, 500);
  registerWrite(2, HIGH);
  delay(del); 
  registerWrite(2, LOW);
  delay(del);
  registerWrite(20, HIGH);
  delay(del); 
  registerWrite(20, LOW);
  delay(del);
}
    
  // Этот метот записывает байт в регистр
void registerWrite(int whichPin, int whichState) {
// инициализируем и обнуляем байт
  byte bitsToSend[3] = {0, 0, 0};
  digitalWrite(latchPin, LOW);
  // устанавливаем HIGH в соответствующем бите
  bitWrite(bitsToSend[whichPin/8], whichPin%8, whichState); 
  // проталкиваем байт в регистр
  for(int i = 0; i < 3; i++) shiftOut(dataPin, clockPin, MSBFIRST, bitsToSend[i]); 
    // "защелкиваем" регистр, чтобы байт появился на его выходах
  digitalWrite(latchPin, HIGH); 
}

 

ситх
Offline
Зарегистрирован: 26.10.2012

Вы были правы-теперь все ОК) Спасибо за совет и потраченное время.

Gayrat
Offline
Зарегистрирован: 05.03.2013

ситх, опубликуйте пожалуйста исправленный скетч.

Где у Вас была ошибка?

maksim
Offline
Зарегистрирован: 12.02.2012

В сообщении #1 разверните код.

Viktor161
Offline
Зарегистрирован: 24.01.2014

Аналогичный вопрос, только у меня будет 8шт выходных регистров и работать по SPI, надыбал текст для двух регистров, а как сделать для 8ми не пойму. Косяк в правильной последовательности отправки байтов  я думаю...  перечитал кучу инфы пока эфекта ноль. Уважаемые знатоки помогите начинающему!

#include <SPI.h>

enum { REG = 53 };

void writeShiftRegister16(int ss_pin, uint16_t value)
{
  digitalWrite(ss_pin, LOW);
  SPI.transfer(highByte(value));
  SPI.transfer(lowByte(value));
  digitalWrite(ss_pin, HIGH);
}

void setup()
{
  SPI.begin();

  pinMode(REG, OUTPUT);
  writeShiftRegister16(REG, 0);
}



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


void loop()
{
  static uint16_t nomad = 1;

  writeShiftRegister16(REG, nomad);
  rotateLeft(nomad);

  delay(1000 / 8);
}