74HC595, 74HC165, ULN2003 + nano
- Войдите на сайт для отправки комментариев
Вс, 06/03/2016 - 18:35
Доброго дня, пытаюсь совместить 595 и uln2003 , 74HC165 по следующим схемам, но в мониторе ком порта получаю постоянно разные значения, хотя на нулевой порт 74HC165 приходит постоянно HIGH, подскажите что не так сделал.


int indataPin = 2; // Вывод чтения данных из 74HC165 (9).
int LOCKPin = 4; // Вывод CLK для 74HC165 (2).
int inloadPin = 3; // Вывод выбора Параллельный ввод/последовательный вывод. Для 74HC165 (1).
int temp = 0; // Переменная хранения приятых данных из 74HC165.
int latchPin = 12;
int clockPin = 11;
int dataPin = 13;
int Sbros = 10;
void setup()
{
Serial.begin(9600);
pinMode(latchPin, OUTPUT);
pinMode(dataPin, OUTPUT);
pinMode(clockPin, OUTPUT);
//Serial.begin(9600); // Выбираем скорость обмена по UART.
pinMode(indataPin, INPUT); // Настраиваем на Ввод для приёма данных из 74HC165.
pinMode(LOCKPin, OUTPUT); // Настраиваем на Вывод CLK на 74HC165.
pinMode(inloadPin, OUTPUT); // Настраиваем на Вывод load на 74HC165.
}
void loop()
{
digitalWrite(inloadPin, 0); // считываем все данные со входов 74HC165 в регистр.
digitalWrite(inloadPin, 1); // выводим данные на последовательный вывод "Q7" 74HC165.
for (int i = 0; i <= 7; i++) { // В цикле считываем каждый из 8 входов (D0-D7) 74HC165.
digitalWrite(LOCKPin, 0); // Устанавливаем CLK в лог "0".
temp = digitalRead(indataPin); // Читаем текущее состояние выхода данных "Q7" 74HC165.
digitalWrite(LOCKPin, 1); // Устанавливаем CLK в лог "1" и этем завершаем вывод данных.
Serial.print (temp); // Отправляем данные из TEMP по UART
}
Serial.println ("");
Serial.println ("--------");
delay(2000);
////////Пишем значение на sn74 595
byte c = B10000000; // формируем байт информации из 8 бит для 8 светодиодов
//digitalWrite(Sbros, HIGH);
digitalWrite(latchPin, LOW);// открываем защелку для ввода информации
shiftOut(dataPin, clockPin, LSBFIRST, c );// побитово закружаем байт информации
digitalWrite(latchPin, HIGH);// закрываем защелку
delay(5000);
c = B00000000;
//digitalWrite(Sbros, LOW);
digitalWrite(latchPin, LOW);// открываем защелку для ввода информации
shiftOut(dataPin, clockPin, LSBFIRST, c );// побитово закружаем байт информации
digitalWrite(latchPin, HIGH);// закрываем защелку
delay(5000);
}
все микрухи цепляю на arduino nano
Считать по одному пину невозможно, считывается весь байт разом в буфер, а потом переносится в регистр сдвига.
Изначально у вас inloadPin находится в LOW, надо в setup прописать его начальное состояние
Далее по даташиту CE в HIGH, PE puls LOW-HIGH (считываем данные с Q0-Q7 в буффер), CE переводится с небольшой задержкой в LOW (переносим в регистр сдвигв), CP(инверсный тактовый вход) puls HIGH-LOW 8 тактов (выводим в последовательном виде).
Вот теперь происходит вывод в последовательный порт 74hc165. В теле обработки чтения по последовательному порту вы каждый раз записываете в позицию bit0 значения принятого бита, а где сдвиг temp? Может так
for (int i = 0; i < 8; i++) { // В цикле считываем каждый из 8 входов (D0-D7) 74HC165. digitalWrite(LOCKPin, HIGH); // Устанавливаем CLK в лог "0". temp |= digitalRead(indataPin); // Читаем текущее состояние выхода данных "Q7" 74HC165 логическое или с temp. temp=temp<<1; // Сдвигаем байт на одну позицию влево подгоьавливаем место для приема следующего бита digitalWrite(LOCKPin, LOW); // Устанавливаем CLK в лог "1" и этем завершаем вывод данных. } Serial.print (temp); // Отправляем данные из TEMP по UARTЕще раз внимательно изучите эпюры сигналов управления данной микросхемы.
P.S. можно управляя этими двумя микросхемами считать иформацию в 74hc165 и минуя обработку в adrduine записать прямо в 74hc595 и вывести на индикаторы. Это конечно если нет необходимости выполнять еще какие то операции с полученной информацией.