Например TDA7294

Форум РадиоКот • Просмотр темы - 74hc166+ Arduino328p
Форум РадиоКот
Здесь можно немножко помяукать :)

Текущее время: Пн фев 16, 2026 07:23:08

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 9 ] 
Автор Сообщение
Не в сети
 Заголовок сообщения: 74hc166+ Arduino328p
СообщениеДобавлено: Пн окт 06, 2025 00:47:15 
Родился

Зарегистрирован: Пн окт 06, 2025 00:23:21
Сообщений: 2
Рейтинг сообщения: 3
Форумчане, нужна ваша помощь.
Не выходит запустить устрйство.
Нужно именно этот сдвиговый регистр ( 74HC165 Не подойдет по контактам в готовой плате)
Схема вот:


Вложение:
Screenshot_49.png [51.48 KiB]
Скачиваний: 62


Код программы
Код:

const int dataPin  = PC0;  // Q7
const int clockPin = PC2;  // CP
const int loadPin  = PC3;  // PL#
const int mrPin    = PC1;  // MR#
const int numBits  = 8;   // 8 бит = один регистр

void setup() {
  Serial.begin(115200);

  pinMode(dataPin, INPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(loadPin, OUTPUT);
  pinMode(mrPin, OUTPUT);

  // Инициализация
  digitalWrite(clockPin, LOW);
  digitalWrite(loadPin, HIGH);
  digitalWrite(mrPin, HIGH); // не сбрасываем
}

void loop() {
  // --- Сброс регистра (если нужно) ---
  digitalWrite(mrPin, LOW);
  delayMicroseconds(5);
  digitalWrite(mrPin, HIGH);

  // --- Захватываем входы ---
  digitalWrite(loadPin, LOW);     // разрешаем параллельную загрузку
  delayMicroseconds(5);
  digitalWrite(loadPin, HIGH);    // фиксируем данные
  delayMicroseconds(5);

  // --- Считываем последовательные данные ---
  Serial.print("Bits: ");
  for (int i = 0; i < numBits; i++) {
    int bit = digitalRead(dataPin);
    Serial.print(bit ? '1' : '0');

    // тактовый импульс
    digitalWrite(clockPin, HIGH);
    delayMicroseconds(2);
    digitalWrite(clockPin, LOW);
    delayMicroseconds(2);
  }

  Serial.println();
  delay(1000);
}


Задача программы максимально простая, в Серийном порте выводить информацию о нажатой кнопке. Но выдает или 0 или 1 (все) нормально не работает, и не показывает какую кнопку я нажал.

очень прошу помогите, что я не так делаю?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: 74hc166+ Arduino328p
СообщениеДобавлено: Пн окт 06, 2025 08:04:43 
Говорящий с текстолитом

Карма: 20
Рейтинг сообщений: 513
Зарегистрирован: Чт авг 10, 2017 20:57:51
Сообщений: 1692
Рейтинг сообщения: 0
Для начало притяни входы регистра к земле. Поставь резисторы 10-100k


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: 74hc166+ Arduino328p
СообщениеДобавлено: Пн окт 06, 2025 14:07:50 
Друг Кота
Аватар пользователя

Карма: 96
Рейтинг сообщений: 1502
Зарегистрирован: Вт мар 16, 2010 22:02:27
Сообщений: 15460
Откуда: ДОНЕЦК
Рейтинг сообщения: 0
Ну и наворотил...
У "стиля ардуино" нет имен портов МК - этот вариант уже только опытным пользователям применять желательно, ибо потянет за собой и соответствующую предварительную настройку портов в стиле "чистого СИ" внутри скотча ардуинки.
Собственно 74hc166 это наш старый 555ИР10...
Может лениво гляну из интереса - только по своему схемку с прожкой набросаю...
Но без макетирования.
:roll:

Добавлено after 2 hours 15 minutes 32 seconds:
Для начала бы не помешало изменить схему...
Вот так к примеру:
Изображение
8)


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: 74hc166+ Arduino328p
СообщениеДобавлено: Пн окт 06, 2025 15:04:32 
Мудрый кот

Карма: 25
Рейтинг сообщений: 499
Зарегистрирован: Сб май 05, 2012 20:24:52
Сообщений: 1867
Откуда: KN34PC, Болгария
Рейтинг сообщения: 0
На симуляторе код ниже работает:

Спойлер
Код:
const int dataPin  = A0;  // Q7
const int clockPin = A2;  // CP
const int loadPin  = A3;  // PL#
const int mrPin    = A1;  // MR#
const int numBits  = 8;   // 8 бит = один регистр

void setup() {
  Serial.begin(9600);

  pinMode(dataPin, INPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(loadPin, OUTPUT);
  pinMode(mrPin, OUTPUT);

  digitalWrite(clockPin, LOW);
  digitalWrite(loadPin, HIGH);
  digitalWrite(mrPin, HIGH);
}

void loop() {
  digitalWrite(loadPin, LOW);
  delayMicroseconds(5);
  digitalWrite(loadPin, HIGH);
  delayMicroseconds(5);

  byte portState = 0;
  for (int i = 0; i < numBits; i++) {
    int bit = digitalRead(dataPin);
    portState |= (bit ? 1 : 0) << (numBits - 1 - i);  // MSB first

    digitalWrite(clockPin, HIGH);
    delayMicroseconds(2);
    digitalWrite(clockPin, LOW);
    delayMicroseconds(2);
  }

  Serial.print("Port state: ");
  for (int i = numBits - 1; i >= 0; i--)
    Serial.print((portState >> i) & 1);

  Serial.println();

  delay(200);
}


Изображение

При печати измените напр. статус Port state: 00111111 по своему усмотрению.
Мне понравилось использование. Спасибо за идею.
(Хотя с МК, где есть много выводов, не имеет смысла).


Вложения:
sketch_oct06a.zip [25.59 KiB]
Скачиваний: 26
Вернуться наверх
 
Эиком - электронные компоненты и радиодетали
Не в сети
 Заголовок сообщения: Re: 74hc166+ Arduino328p
СообщениеДобавлено: Пн окт 06, 2025 16:42:15 
Друг Кота
Аватар пользователя

Карма: 96
Рейтинг сообщений: 1502
Зарегистрирован: Вт мар 16, 2010 22:02:27
Сообщений: 15460
Откуда: ДОНЕЦК
Рейтинг сообщения: 0
У меня вот такое получилось:
Спойлер
Код:
/* ---------- */
/* схема ввода данных с регистра 555ИР10 */

#define dataPin 14 // линия данных
#define clockPin 16 // линия тактового строба
#define loadPin 17 // линия типа ввода(последовательный = 1, параллельный = 0)
#define mrPin 15 // линия сброса
// регистр считанных данных
byte regData = 0;
// функция чтения данных из регистра
void reread();

//----------

void setup() {
  // put your setup code here, to run once:
   Serial.begin(115200); // (9600);
   digitalWrite(dataPin, HIGH);
   digitalWrite(clockPin, HIGH);
   digitalWrite(loadPin, HIGH);
   digitalWrite(mrPin, HIGH);
   pinMode(dataPin, INPUT);
   pinMode(clockPin, OUTPUT);
   pinMode(loadPin, OUTPUT);
   pinMode(mrPin, OUTPUT);
 

}

void loop() {
  // put your main code here, to run repeatedly:
  // --- Считываем последовательные данные ---
  Serial.print("Bits: ");
  reread();
  Serial.println(regData, BIN);
  delay(1000);

}

//----------
// функция чтения данных из регистра
void reread()
{
  // установить loadPin = 0 (параллельная загрузка)
  digitalWrite(loadPin, LOW);
  delayMicroseconds(2);
  // дать импульс на линии строба - выполняем
  // защелкивание параллельных данных
  // предыдущее содержимое значения не имеет
  digitalWrite(clockPin, LOW); //
  delayMicroseconds(2);
  digitalWrite(clockPin, HIGH);
  delayMicroseconds(2);
  // установить loadPin = 1 (последовательный сдвиг)
  digitalWrite(loadPin, HIGH);
  delayMicroseconds(2);
  // выполнить 8 циклов строба с записью данных в регистр regData
  for(byte cnt = 8; cnt > 0; cnt--)
  {
   digitalWrite(clockPin, LOW); //
   delayMicroseconds(2);
   bitWrite(regData, (cnt - 1), digitalRead(dataPin));
   digitalWrite(clockPin, HIGH);
   delayMicroseconds(2);
  }
}


//----------

Но вывод сброса регистра 555ИР10 в таком варианте просто лишний.
Достаточно было бы на него единичку подать (соединив через 4,7 к с +5 вольт питанием)...
Другое дело проблемы антидребезга - но то уж idima пущай сам думает.
:wink:
На симуляторе UnoArduSim 2.9.2 с ручным вводом данных проверилась (только вместо Serial.println(regData, BIN) ставил Serial.print(regData, BIN) - тогда данные в окошке SERIAL появляются не забитые завершающим "переводом строки").
Чего в реальном железе будет - не ведаю, возможно интервалы задержек придется подрегулировать.
Хоть поразвлекся чуток.
8)


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: 74hc166+ Arduino328p
СообщениеДобавлено: Пн окт 06, 2025 20:38:57 
Родился

Зарегистрирован: Пн окт 06, 2025 00:23:21
Сообщений: 2
Рейтинг сообщения: 0
Ого ) , аж 4 ответа. Неожидал такого теплого приема ) Благодраю, за ответы, сейчас буду пробывать


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: 74hc166+ Arduino328p
СообщениеДобавлено: Пн окт 06, 2025 20:55:54 
Друг Кота
Аватар пользователя

Карма: 96
Рейтинг сообщений: 1502
Зарегистрирован: Вт мар 16, 2010 22:02:27
Сообщений: 15460
Откуда: ДОНЕЦК
Рейтинг сообщения: 3
А я таки малость "просклерозил" - данные у ИР10 чуток похитрее выдаются.
:oops:
Вот это правильный вариант (можно сравнить с ранее выложенным, чтоб понять разницу):
Спойлер
Код:
/* ---------- */
/* схема ввода данных с регистра 555ИР10 */

#define dataPin 14 // линия данных
#define clockPin 16 // линия тактового строба
#define loadPin 17 // линия типа ввода(последовательный = 1, параллельный = 0)
#define mrPin 15 // линия сброса
// регистр считанных данных
byte regData = 0;
// функция чтения данных из регистра
void reread();

//----------

void setup() {
  // put your setup code here, to run once:
   Serial.begin(9600); // (115200);
   digitalWrite(dataPin, HIGH);
   digitalWrite(clockPin, HIGH);
   digitalWrite(loadPin, HIGH);
   digitalWrite(mrPin, HIGH);
   pinMode(dataPin, INPUT);
   pinMode(clockPin, OUTPUT);
   pinMode(loadPin, OUTPUT);
   pinMode(mrPin, OUTPUT);
 

}

void loop() {
  // put your main code here, to run repeatedly:
  // --- Считываем последовательные данные ---
  Serial.print("Bits: ");
  reread();
  Serial.print(regData, BIN);// Serial.println(regData, BIN);
  delay(1000);

 
}

//----------
// функция чтения данных из регистра
void reread()
{
  // установить loadPin = 0 (параллельная загрузка)
  digitalWrite(loadPin, LOW);
  delayMicroseconds(2);
  // дать импульс на линии строба - выполняем
  // защелкивание параллельных данных
  // предыдущее содержимое значения не имеет
  digitalWrite(clockPin, LOW); //
  delayMicroseconds(2);
  digitalWrite(clockPin, HIGH);
  delayMicroseconds(2);
  // установить loadPin = 1 (последовательный сдвиг)
  digitalWrite(loadPin, HIGH);
  delayMicroseconds(2);
  // читаем старший бит сразу после выполнения параллельной записи
  // в регистр
  bitWrite(regData, 7, digitalRead(dataPin));
  // выполнить 7 циклов строба с записью данных в регистр regData
  for(byte cnt = 7; cnt > 0; cnt--)
  {
   digitalWrite(clockPin, LOW); //
   delayMicroseconds(2);
   // bitWrite(regData, (cnt - 1), digitalRead(dataPin));
   digitalWrite(clockPin, HIGH);
   delayMicroseconds(2);
   // данные появляются после заднего фронта
   // строб - импульса сдвига
   bitWrite(regData, (cnt - 1), digitalRead(dataPin));
  }
}


//----------

8)


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: 74hc166+ Arduino328p
СообщениеДобавлено: Вт окт 07, 2025 10:13:40 
Мудрый кот

Карма: 25
Рейтинг сообщений: 499
Зарегистрирован: Сб май 05, 2012 20:24:52
Сообщений: 1867
Откуда: KN34PC, Болгария
Рейтинг сообщения: 0
BOB51, все ОК :).
Изображение


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: 74hc166+ Arduino328p
СообщениеДобавлено: Вт окт 07, 2025 11:03:50 
Друг Кота
Аватар пользователя

Карма: 96
Рейтинг сообщений: 1502
Зарегистрирован: Вт мар 16, 2010 22:02:27
Сообщений: 15460
Откуда: ДОНЕЦК
Рейтинг сообщения: 0
Так на симуляторе то я и попался.
Данные вручную подставлялись (по аналогии с обычным сдвигом у микросхем более "мозговитых" - там сначала выставляются данные, а затем следует импульс сдвига) - живой модели регистра в моем варианте нету.
А вот за особенности переключения "по спаду отрицательного импульса" у аппаратного ИР10 и засклерозил.
Т.е. старший бит на выходе регистра появляется сразу после защелкивания параллельных данных, а остальные 7 бит данных обновляются за задним фронтом очередного тактового - это как раз второй вариант моей прожки и учитывает.
8)


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 9 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 15


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y