Страница 1 из 1
74hc166+ Arduino328p
Добавлено: Пн окт 06, 2025 00:47:15
idima
Форумчане, нужна ваша помощь.
Не выходит запустить устрйство.
Нужно именно этот сдвиговый регистр ( 74HC165 Не подойдет по контактам в готовой плате)
Схема вот:
Код программы
Код: Выделить всё
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
diplodok
Для начало притяни входы регистра к земле. Поставь резисторы 10-100k
Re: 74hc166+ Arduino328p
Добавлено: Пн окт 06, 2025 14:07:50
BOB51
Ну и наворотил...
У "стиля ардуино" нет имен портов МК - этот вариант уже только опытным пользователям применять желательно, ибо потянет за собой и соответствующую предварительную настройку портов в стиле "чистого СИ" внутри скотча ардуинки.
Собственно 74hc166 это наш старый 555ИР10...
Может лениво гляну из интереса - только по своему схемку с прожкой набросаю...
Но без макетирования.
Добавлено after 2 hours 15 minutes 32 seconds:
Для начала бы не помешало изменить схему...
Вот так к примеру:

Re: 74hc166+ Arduino328p
Добавлено: Пн окт 06, 2025 15:04:32
veso74
На симуляторе код ниже работает:
Спойлер
Код: Выделить всё
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 по своему усмотрению.
Мне понравилось использование. Спасибо за идею.
(Хотя с МК, где есть много выводов, не имеет смысла).
Re: 74hc166+ Arduino328p
Добавлено: Пн окт 06, 2025 16:42:15
BOB51
У меня вот такое получилось:
Спойлер
Код: Выделить всё
/* ---------------------------------------------------- */
/* схема ввода данных с регистра 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 пущай сам думает.

На симуляторе UnoArduSim 2.9.2 с ручным вводом данных проверилась (только вместо Serial.println(regData, BIN) ставил Serial.print(regData, BIN) - тогда данные в окошке SERIAL появляются не забитые завершающим "переводом строки").
Чего в реальном железе будет - не ведаю, возможно интервалы задержек придется подрегулировать.
Хоть поразвлекся чуток.

Re: 74hc166+ Arduino328p
Добавлено: Пн окт 06, 2025 20:38:57
idima
Ого ) , аж 4 ответа. Неожидал такого теплого приема ) Благодраю, за ответы, сейчас буду пробывать
Re: 74hc166+ Arduino328p
Добавлено: Пн окт 06, 2025 20:55:54
BOB51
А я таки малость "просклерозил" - данные у ИР10 чуток похитрее выдаются.
Вот это правильный вариант (можно сравнить с ранее выложенным, чтоб понять разницу):
Спойлер
Код: Выделить всё
/* ---------------------------------------------------- */
/* схема ввода данных с регистра 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));
}
}
//---------------------------------------------------------

Re: 74hc166+ Arduino328p
Добавлено: Вт окт 07, 2025 10:13:40
veso74
BOB51, все ОК

.

Re: 74hc166+ Arduino328p
Добавлено: Вт окт 07, 2025 11:03:50
BOB51
Так на симуляторе то я и попался.
Данные вручную подставлялись (по аналогии с обычным сдвигом у микросхем более "мозговитых" - там сначала выставляются данные, а затем следует импульс сдвига) - живой модели регистра в моем варианте нету.
А вот за особенности переключения "по спаду отрицательного импульса" у аппаратного ИР10 и засклерозил.
Т.е. старший бит на выходе регистра появляется сразу после защелкивания параллельных данных, а остальные 7 бит данных обновляются за задним фронтом очередного тактового - это как раз второй вариант моей прожки и учитывает.
