Форумчане, нужна ваша помощь. Не выходит запустить устрйство. Нужно именно этот сдвиговый регистр ( 74HC165 Не подойдет по контактам в готовой плате) Схема вот:
// --- Считываем последовательные данные --- Serial.print("Bits: "); for (int i = 0; i < numBits; i++) { int bit = digitalRead(dataPin); Serial.print(bit ? '1' : '0');
Задача программы максимально простая, в Серийном порте выводить информацию о нажатой кнопке. Но выдает или 0 или 1 (все) нормально не работает, и не показывает какую кнопку я нажал.
Ну и наворотил... У "стиля ардуино" нет имен портов МК - этот вариант уже только опытным пользователям применять желательно, ибо потянет за собой и соответствующую предварительную настройку портов в стиле "чистого СИ" внутри скотча ардуинки. Собственно 74hc166 это наш старый 555ИР10... Может лениво гляну из интереса - только по своему схемку с прожкой набросаю... Но без макетирования.
Добавлено after 2 hours 15 minutes 32 seconds: Для начала бы не помешало изменить схему... Вот так к примеру:
Serial.print("Port state: "); for (int i = numBits - 1; i >= 0; i--) Serial.print((portState >> i) & 1);
Serial.println();
delay(200); }
При печати измените напр. статус Port state: 00111111 по своему усмотрению. Мне понравилось использование. Спасибо за идею. (Хотя с МК, где есть много выводов, не имеет смысла).
/* ---------- */ /* схема ввода данных с регистра 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 появляются не забитые завершающим "переводом строки"). Чего в реальном железе будет - не ведаю, возможно интервалы задержек придется подрегулировать. Хоть поразвлекся чуток.
А я таки малость "просклерозил" - данные у ИР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)); } }
Так на симуляторе то я и попался. Данные вручную подставлялись (по аналогии с обычным сдвигом у микросхем более "мозговитых" - там сначала выставляются данные, а затем следует импульс сдвига) - живой модели регистра в моем варианте нету. А вот за особенности переключения "по спаду отрицательного импульса" у аппаратного ИР10 и засклерозил. Т.е. старший бит на выходе регистра появляется сразу после защелкивания параллельных данных, а остальные 7 бит данных обновляются за задним фронтом очередного тактового - это как раз второй вариант моей прожки и учитывает.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 15
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения