| Форум РадиоКот https://radiokot.ru/forum/ |
|
| 74hc166+ Arduino328p https://radiokot.ru/forum/viewtopic.php?f=22&t=199293 |
Страница 1 из 1 |
| Автор: | idima [ Пн окт 06, 2025 00:47:15 ] |
| Заголовок сообщения: | 74hc166+ Arduino328p |
Форумчане, нужна ваша помощь. Не выходит запустить устрйство. Нужно именно этот сдвиговый регистр ( 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 (все) нормально не работает, и не показывает какую кнопку я нажал. очень прошу помогите, что я не так делаю? |
|
| Автор: | diplodok [ Пн окт 06, 2025 08:04:43 ] |
| Заголовок сообщения: | Re: 74hc166+ Arduino328p |
Для начало притяни входы регистра к земле. Поставь резисторы 10-100k |
|
| Автор: | BOB51 [ Пн окт 06, 2025 14:07:50 ] |
| Заголовок сообщения: | Re: 74hc166+ Arduino328p |
Ну и наворотил... У "стиля ардуино" нет имен портов МК - этот вариант уже только опытным пользователям применять желательно, ибо потянет за собой и соответствующую предварительную настройку портов в стиле "чистого СИ" внутри скотча ардуинки. Собственно 74hc166 это наш старый 555ИР10... Может лениво гляну из интереса - только по своему схемку с прожкой набросаю... Но без макетирования. Добавлено after 2 hours 15 minutes 32 seconds: Для начала бы не помешало изменить схему... Вот так к примеру: |
|
| Автор: | veso74 [ Пн окт 06, 2025 15:04:32 ] | ||
| Заголовок сообщения: | Re: 74hc166+ Arduino328p | ||
На симуляторе код ниже работает: СпойлерКод: 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 по своему усмотрению. Мне понравилось использование. Спасибо за идею. (Хотя с МК, где есть много выводов, не имеет смысла).
|
|||
| Автор: | BOB51 [ Пн окт 06, 2025 16:42:15 ] |
| Заголовок сообщения: | Re: 74hc166+ Arduino328p |
У меня вот такое получилось: СпойлерКод: /* ---------- */ /* схема ввода данных с регистра 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 появляются не забитые завершающим "переводом строки"). Чего в реальном железе будет - не ведаю, возможно интервалы задержек придется подрегулировать. Хоть поразвлекся чуток. |
|
| Автор: | idima [ Пн окт 06, 2025 20:38:57 ] |
| Заголовок сообщения: | Re: 74hc166+ Arduino328p |
Ого ) , аж 4 ответа. Неожидал такого теплого приема ) Благодраю, за ответы, сейчас буду пробывать |
|
| Автор: | BOB51 [ Пн окт 06, 2025 20:55:54 ] |
| Заголовок сообщения: | Re: 74hc166+ Arduino328p |
А я таки малость "просклерозил" - данные у ИР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)); } } //---------- |
|
| Автор: | veso74 [ Вт окт 07, 2025 10:13:40 ] |
| Заголовок сообщения: | Re: 74hc166+ Arduino328p |
BOB51, все ОК |
|
| Автор: | BOB51 [ Вт окт 07, 2025 11:03:50 ] |
| Заголовок сообщения: | Re: 74hc166+ Arduino328p |
Так на симуляторе то я и попался. Данные вручную подставлялись (по аналогии с обычным сдвигом у микросхем более "мозговитых" - там сначала выставляются данные, а затем следует импульс сдвига) - живой модели регистра в моем варианте нету. А вот за особенности переключения "по спаду отрицательного импульса" у аппаратного ИР10 и засклерозил. Т.е. старший бит на выходе регистра появляется сразу после защелкивания параллельных данных, а остальные 7 бит данных обновляются за задним фронтом очередного тактового - это как раз второй вариант моей прожки и учитывает. |
|
| Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
| Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |
|


