74hc165 не выдаёт данные.

Gino
Offline
Зарегистрирован: 01.11.2017

Добрый день! Знаю что очередная тема про 165, но я не нашел решение проблемы и решил написать.

Не могу заставить работать 165 микруху. Подключил и все порты не рабоатют. только при подаче напряжения на порт D7 выдает что все еденицы. В чём может быть проблема? или что я не заметил?

datasheet: http://www.ti.com/lit/ds/symlink/sn74hc165.pdf

Порты подвел к земле через резистор 1кОм.

Код :

const int data_pin = 11; // Connect Pin 11 to SER_OUT (serial data out)
const int shld_pin = 8; // Connect Pin 8 to SH/!LD (shift or active low load)
const int clk_pin = 12; // Connect Pin 12 to CLK (the clock that times the shifting)
const int ce_pin = 9;
void setup() {
  pinMode(shld_pin, OUTPUT);
  pinMode(ce_pin, OUTPUT);
  pinMode(clk_pin, OUTPUT);
  pinMode(data_pin, INPUT);
  digitalWrite(ce_pin, HIGH);
  digitalWrite(data_pin, LOW);
  digitalWrite(clk_pin, LOW);
  digitalWrite(shld_pin, HIGH);
Serial.begin(9600);
}

void loop() {
  
digitalWrite(shld_pin, HIGH);
delay (10); 
digitalWrite(shld_pin, LOW);
delay (10);
digitalWrite(ce_pin, LOW);
delay (10);
for (uint8_t i=0; i<8; i++)
  { 
  digitalWrite(clk_pin , LOW);
  //digitalWrite(clk_pin , LOW);
  delay (10);
  Serial.print(digitalRead (data_pin));
  delay (10);
  digitalWrite(clk_pin , HIGH);
  delay (10);
  }
 digitalWrite(ce_pin, HIGH);
Serial.print("\n");
delay (1000);
}

 

Gino
Offline
Зарегистрирован: 01.11.2017

Извините, код неправильный. Пробовал по разному все поменять и посмотреть как работает.

Вот правльный код:

const int data_pin = 11; // Connect Pin 11 to SER_OUT (serial data out)
const int shld_pin = 8; // Connect Pin 8 to SH/!LD (shift or active low load)
const int clk_pin = 12; // Connect Pin 12 to CLK (the clock that times the shifting)
const int ce_pin = 9;
void setup() {
  pinMode(shld_pin, OUTPUT);
  pinMode(ce_pin, OUTPUT);
  pinMode(clk_pin, OUTPUT);
  pinMode(data_pin, INPUT);
  digitalWrite(ce_pin, HIGH);
  digitalWrite(data_pin, LOW);
  digitalWrite(clk_pin, LOW);
  digitalWrite(shld_pin, HIGH);
Serial.begin(9600);
}

void loop() {
  
digitalWrite(shld_pin, LOW);
delay (10); 
digitalWrite(shld_pin, HIGH);
delay (10);
digitalWrite(ce_pin, LOW);
delay (10);
for (uint8_t i=0; i<8; i++)
  { 
  digitalWrite(clk_pin , HIGH);
   delay (1);
  Serial.print(digitalRead (data_pin));
  digitalWrite(clk_pin , LOW);
  }
 digitalWrite(ce_pin, HIGH);
Serial.print("\n");
delay (1000);
}

 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Gino пишет:
В чём может быть проблема? или что я не заметил?
Я вижу неумение писать программы, а это большая проблема. А так же не умение пользоваться Гуглом. http://arduinolab.pw/index.php/2018/01/08/sdvigovyj-registr-74hc165-ili-kak-uvelichit-kolichestvo-vxodov-arduino/

ПС: Может у вас проблемы с руками. Ну я здесь точно не помошник.

Gino
Offline
Зарегистрирован: 01.11.2017

Qwone, ваши совет мне очень помог! Здоровья и счатья Вам и вашим близким.

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

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

Gino пишет:

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

Очередной Wavgat небось?

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Человек птица гордая, пока не пнешь , не взлетит даже если ей надо. Но человек еще птица неблагодарная. Если взлетит от пинка, то нагадит на голову помогающему.

Duet
Offline
Зарегистрирован: 17.01.2015
 Не пойму как с помощью команды shiftIn сделать считывание двух регистров.
 
  byte in_165_shift() {
  digitalWrite(LATCH_PIN, LOW);   
  digitalWrite(LATCH_PIN, HIGH);
  return shiftIn(DATA_PIN, CLOCK_PIN, MSBFIRST); }
Duet
Offline
Зарегистрирован: 17.01.2015

В монитор порта билеберду выводит.

byte in_165_shift() {
  digitalWrite(LATCH_PIN, LOW);   // щелкнули защелкой
  digitalWrite(LATCH_PIN, HIGH);
  return shiftIn(DATA_PIN, CLOCK_PIN, MSBFIRST); // считали данные
  digitalWrite(LATCH_PIN, LOW);   // щелкнули защелкой
  digitalWrite(LATCH_PIN, HIGH);
  return shiftIn(DATA_PIN, CLOCK_PIN, MSBFIRST); // считали данные
}

 

Duet
Offline
Зарегистрирован: 17.01.2015

Все понял, мегу надо брать и нафиг эту 165. 

b707
Offline
Зарегистрирован: 26.05.2017

Duet пишет:

В монитор порта билеберду выводит.

byte in_165_shift() {
  digitalWrite(LATCH_PIN, LOW);   // щелкнули защелкой
  digitalWrite(LATCH_PIN, HIGH);
  return shiftIn(DATA_PIN, CLOCK_PIN, MSBFIRST); // считали данные
  digitalWrite(LATCH_PIN, LOW);   // щелкнули защелкой
  digitalWrite(LATCH_PIN, HIGH);
  return shiftIn(DATA_PIN, CLOCK_PIN, MSBFIRST); // считали данные
}

 

это не монитор порта, это вы в коде билиберду пишете. Оператор return к чему у вас в 3 и 6-ой строке. подумайте?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Duet пишет:

Все понял, мегу надо брать и нафиг эту 165. 

Всё правильно!

Только решение половинчатое, берите сразу Fugaku!

Duet
Offline
Зарегистрирован: 17.01.2015

Использовал библиотеку. Два регистра подключено, использую 10 входов, 6 лишних подтянуты к нулю резисторами.

Монитор порта показывает числа от 1 до 1000000000, десять положений входов (кнопки), а не в двоичном формате.

#include <AH_74HC165.h>
AH_74HC165 hc(10,11,12,13);   
unsigned int intValue;  
   
void setup () 
{
Serial.begin(9600);
}
void loop() {
  hc.ReadBytes((byte*)&intValue,sizeof(int)); // чтение двух микрух
  Serial.println(intValue,BIN);
  delay(2000);
}

 

b707
Offline
Зарегистрирован: 26.05.2017

Duet пишет:

Монитор порта показывает числа от 1 до 1000000000, десять положений входов (кнопки), а не в двоичном формате.

а число 1 - это какое, двоичное или десятичное ?:)

nik182
Offline
Зарегистрирован: 04.05.2015

В ардуине нет десятичных чисел. Есть только двоичные. Десятичныим они становятся в момент вывода по умолчанию. Если залезть в описание принт, то можно увидеть, что умолчание можно изменить например на шеснадцатиричные и тогда вывод будет в хексах но это не значит, что хексы живут внутри ардуины. Это только вывод в человеку понятном виде.

Duet
Offline
Зарегистрирован: 17.01.2015

b707 пишет:


а число 1 - это какое, двоичное или десятичное ?:)
[/quote]

Как с 595, так B00100101. Перепаял подтяжку с не используемых ног с - на + и теперь как надо выдает 1111110000000001, но это тоже не работает пока не стал задавать так 64514.

Morroc
Offline
Зарегистрирован: 24.10.2016

Где задавать ? Что задавать ? Зачем ? Вроде регистры читали, не ? ) Взяли бы и без библиотеки прочитали (ну как в первых постах), глядишь и уложилось бы в голове что то.

Duet
Offline
Зарегистрирован: 17.01.2015

Morroc пишет:

Где задавать ? Что задавать ? Зачем ? Вроде регистры читали, не ? ) Взяли бы и без библиотеки прочитали (ну как в первых постах), глядишь и уложилось бы в голове что то.

Для запуска функций нужны значения каждой кнопки с 165-го. Так вот в формате 1111100000010101 не работает, а в формате 64514 условие на срабатывание функции работает.

b707
Offline
Зарегистрирован: 26.05.2017

Duet пишет:

Для запуска функций нужны значения каждой кнопки с 165-го. Так вот в формате 1111100000010101 не работает, а в формате 64514 условие на срабатывание функции работает.

жгешь просто :)

Показывай код, как работаешь с 1111100000010101 и как с 64514

Duet
Offline
Зарегистрирован: 17.01.2015

b707 пишет:

жгешь просто :)

Показывай код, как работаешь с 1111100000010101 и как с 64514

Что монитор порта выдает с тем и работаю.

#include <AH_74HC165.h>
AH_74HC165 hc(10,11,12,13);   
void setup () 
{
Serial.begin(9600);
}
void loop() {
  if (intValue == 64513) {motor_s1();}
  //if (intValue == 1111110000000001) {motor_s1();} Вот так не работает.
  
  unsigned int intValue;
  hc.ReadBytes((byte*)&intValue,sizeof(int)); // чтение двух микрух
  Serial.println(intValue);
  delay(2000);
}
void motor_s1() {
  stepperq.setMaxSpeed(172);
  stepperq.setAcceleration(20000);
  stepperq.moveTo(-8000000);
}

 

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

Duet пишет:

  //if (intValue == 1111110000000001) {motor_s1();} Вот так не работает.

Вот здесь я вам ответил - http://arduino.ru/forum/programmirovanie/modernizatsiya-biblioteki-ili-kto-kak-chitaet-74hc165#comment-609969

b707
Offline
Зарегистрирован: 26.05.2017

Duet пишет:

b707 пишет:

жгешь просто :)

Показывай код, как работаешь с 1111100000010101 и как с 64514

Что монитор порта выдает с тем и работаю.

 

тяжелый случай...

Столько возитесь с этими регистрами, а с битами так и не научились работать...

если вам нужно проверить, что какой-то вход регистра замкнут - пишите так:

if (intValue & (1 << N))  // проверить, что в разряде N находится единица, а не нуль

и это будет проверено. независимо от состояния других входов. И никакие лишние входы мешать не будут

b707
Offline
Зарегистрирован: 26.05.2017

да... с 2015года не научился двоичные и десятичные числа различать...

Green
Offline
Зарегистрирован: 01.10.2015

А вот никому не обязан! Прикажу - сделают!)

Duet
Offline
Зарегистрирован: 17.01.2015

b707 пишет:

да... с 2015года не научился двоичные и десятичные числа различать...

Это моя вторая самоделка. Не каждый день конструирую. С новым сталкиваюсь, изучаю как могу. Не прошу готового решения, прошу помощи в случае больших трудностей.

Гриша
Offline
Зарегистрирован: 27.04.2014

b707 пишет:

тяжелый случай...

Столько возитесь с этими регистрами, а с битами так и не научились работать...

это называется логика, не всем с ней везет.У некоторых с этим большие трудности, вот люди и мучаются. 

Duet пишет:

Это моя вторая самоделка. Не каждый день конструирую. С новым сталкиваюсь, изучаю как могу. Не прошу готового решения, прошу помощи в случае больших трудностей.

учитесь задавать вопросы, чаще случается, что когда вопрос составишь - тут и ответ сам складывается...

 

Гриша
Offline
Зарегистрирован: 27.04.2014

del