проблема с 74HC595

MasterOfPapets
Offline
Зарегистрирован: 25.02.2013

 

На основе туториала http://arduino.ru/Tutorial/registr_74HC595 решил потренироваться и позажигать последовательно все светодиоды и обратно, это последний вариант алгоритма, до этого делал через цикл варьируя bitOrder - один хрен результат тот же, в коде видно что потом уже решил выводить просто единицу, но светодиод мигает раз 5-6 и потом около 8 циклов молчит, и опять, отладка показала что numb высчитывается корректно, в чем проблема?
 
ЗЫ. только начинаю
 
//Пин подключен к ST_CP входу 74HC595
int latchPin = 8;
//Пин подключен к SH_CP входу 74HC595
int clockPin = 12;
//Пин подключен к DS входу 74HC595
int dataPin = 11;
boolean flag = true; 
int numb = 1; 
 
void setup() {
  //устанавливаем режим OUTPUT
  pinMode(latchPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
  Serial.begin(9600);
}
 
void loop() {
  
  
 
  if (numb==1) {
     flag=true;
     numb = numb * 2;
  }
  else if (numb==128) {
    flag=false;
    numb = numb / 2;
   }
    else {
      if (flag==true) {
      numb = numb * 2;  
      }
      else {
      numb = numb / 2;  
      } 
    }  
    
    
    Serial.println(numb);
    
 
    digitalWrite(latchPin, LOW);
    
    shiftOut(dataPin, clockPin, MSBFIRST, 1); 
 
    
    digitalWrite(latchPin, HIGH);
   
    delay(500);
    
}
MasterOfPapets
Offline
Зарегистрирован: 25.02.2013

сразу оговорюсь что схема правильно собрана, скетчи из туториала работали на 100, но вот тут не пойму чего-то

MasterOfPapets
Offline
Зарегистрирован: 25.02.2013

подставил B10010 такая же хрень, мигает два раза и секунд 6-7 пауза

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

Сколько регистров вы подключаете?

Sorny
Offline
Зарегистрирован: 20.02.2013

Тоже вопросик. Все сделал по примеру 2.2 (http://arduino.ru/Tutorial/registr_74HC595)

Соответственно 2 регистра стоит. Диоды загораются, но очень слабо, буквально на

короткий импульс в самый минимальный процент яркости. Ошибка в коде или в руках?

//Пин подключен к ST_CP входу 74HC595
int latchPin = 8;
//Пин подключен к SH_CP входу 74HC595
int clockPin = 12;
//Пин подключен к DS входу 74HC595
int dataPin = 11;
 
char inputString[2];
 
void setup() {
   //устанавливаем режим OUTPUT
  pinMode(latchPin, OUTPUT);
  pinMode(dataPin, OUTPUT); 
  pinMode(clockPin, OUTPUT);
}
 
void loop() {
  // проходим циклом по всем 16 выходам двух регистров
  for (int thisLed = 0; thisLed < 16; thisLed++) {
    // записываем сигнал в регистр для очередного светодиода
    registerWrite(thisLed, HIGH);
    // если это не первый светодиод, то отключаем предыдущий
    if (thisLed > 0) {
      registerWrite(thisLed - 1, LOW);
    }
    // если это первый светодиод, то отключаем последний
    else {
      registerWrite(15, LOW);
    }
    delay(100);
  }
}
// этот метод отсылает бит на сдвиговый регистр
void registerWrite(int whichPin, int whichState) {
  // для хранения 16 битов используем unsigned int
  unsigned int bitsToSend = 0;   
  // выключаем светодиоды на время передачи битов
  digitalWrite(latchPin, LOW);
  // устанавливаем HIGH в соответствующий бит
  bitWrite(bitsToSend, whichPin, whichState);
  // разбиваем наши 16 бит на два байта
  // для записи в первый и второй регистр
  byte registerOne = highByte(bitsToSend);
  byte registerTwo = lowByte(bitsToSend);
  // "проталкиваем" байты в регистры
  shiftOut(dataPin, clockPin, MSBFIRST, registerTwo);
  shiftOut(dataPin, clockPin, MSBFIRST, registerOne);
  // "защелкиваем" регистр, чтобы биты появились на выходах регистра
  digitalWrite(latchPin, HIGH);
}

ЗЫ. На момент ресета, часть диодов загорается в полную силу,

но не всегда.

std
Offline
Зарегистрирован: 05.01.2012

имеет смысл попробовать на проводах data - 11, clock - 13, latch - любой кроме 12го.

Sorny
Offline
Зарегистрирован: 20.02.2013

Эффект тот-же к сожалению.

Sorny
Offline
Зарегистрирован: 20.02.2013
void loop() {
  // проходим циклом по всем 16 выходам двух регистров
  for (int thisLed = 0; thisLed < 16; thisLed++) {
    // записываем сигнал в регистр для очередного светодиода
    registerWrite(thisLed, LOW);
    // если это не первый светодиод, то отключаем предыдущий
    if (thisLed > 0) {
      registerWrite(thisLed - 1, HIGH);
    }
    // если это первый светодиод, то отключаем последний
    else {
      registerWrite(15, LOW);
    }
    delay(100);
  }

Косяк в коде. А я весь моск сломал.

Единственное, что цикл начинается со второго регистра, но это меняется

  shiftOut(dataPin, clockPin, MSBFIRST, registerOne);
  shiftOut(dataPin, clockPin, MSBFIRST, registerTwo);

И в 3-й строке тут, меняем 16 на 17, оначе последний диод гореть не будет.

carduino.ru
Offline
Зарегистрирован: 06.12.2011

Sorny пишет:

Эффект тот-же к сожалению.

Вам предложили хардверный SPI использовать

Sorny
Offline
Зарегистрирован: 20.02.2013

Спасибо. Можно на ты, если не против.

ТОлько начинаю потихоньку изучать дуину.

std
Offline
Зарегистрирован: 05.01.2012

возможно так: http://www.robocraft.ru/blog/arduino/519.html

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