Некорректная работа каскада сдвиговых регистров.
- Войдите на сайт для отправки комментариев
Вс, 24/02/2013 - 16:56
Подключил три регистра 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);
}
Сохранение картинок на форуме
Регистры работают корректно, просто вы ими так управляете, а точнее вы пытаетесь управлять тремя регистрами как одним.
//Пин подключен к 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); }Вы были правы-теперь все ОК) Спасибо за совет и потраченное время.
ситх, опубликуйте пожалуйста исправленный скетч.
Где у Вас была ошибка?
В сообщении #1 разверните код.
Аналогичный вопрос, только у меня будет 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); }