проблема с 74HC595
- Войдите на сайт для отправки комментариев
Пнд, 25/02/2013 - 22:03
На основе туториала 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);
}
сразу оговорюсь что схема правильно собрана, скетчи из туториала работали на 100, но вот тут не пойму чего-то
подставил B10010 такая же хрень, мигает два раза и секунд 6-7 пауза
Сколько регистров вы подключаете?
Тоже вопросик. Все сделал по примеру 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); }ЗЫ. На момент ресета, часть диодов загорается в полную силу,
но не всегда.
имеет смысл попробовать на проводах data - 11, clock - 13, latch - любой кроме 12го.
Эффект тот-же к сожалению.
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); }Косяк в коде. А я весь моск сломал.
Единственное, что цикл начинается со второго регистра, но это меняется
И в 3-й строке тут, меняем 16 на 17, оначе последний диод гореть не будет.
Эффект тот-же к сожалению.
Вам предложили хардверный SPI использовать
Спасибо. Можно на ты, если не против.
ТОлько начинаю потихоньку изучать дуину.
возможно так: http://www.robocraft.ru/blog/arduino/519.html
лично мне был тот пример понятнее. у функции передачи меньше аргументов, меньше шанс ошибиться.