много кнопок
- Войдите на сайт для отправки комментариев
Втр, 28/02/2017 - 13:28
Есть много кнопок. Имеются платы с 4-мя регистрами 74HC165 на каждой плате. Вследствие малого колличества входов на arduino mega 2560, платы подключаются последовательно (должны подключаться, но с этим проблемы).
Считывание состояния с отдельно подключенной платы не представляет трудностей, но когда последовательно подключается ещё хотя бы одна плата, то теряются последние регистры (последние 15 пинов не детектируются, но если замкнуть один пин перед ними, получим множественное нажатие кнопок, которые на самом деле не нажаты). В чём может быть проблема? Может ли быть дело в недостаточной амплитуде сигнала?
то есть как работает железо и как работае твой код ты понимаешь до конца. и просто наблюдаешь глюк. или это чей то код и ты пытаешься расширить, но что то делаешь неправильно?
Может и не до конца, но понимаю. Я продолжаю работу знакомого, который мне всё объяснил по коду, да я и сам уже внёс поправки.
Последовательное подключение плат с 74HC595 работает нормально.
Сам знакомый последовательного подключения с кнопками так и не добился.
В 48 строке кода явная ошибка. Да и номинал резистора в верхнем правом углу схемы сомнителен (R3, кажется, шар что-то мунтноват сегодня).
Могу пока что скинуть код.
#define NUMBER_OF_SHIFT_CHIPS 4 #define DATA_WIDTH NUMBER_OF_SHIFT_CHIPS * 8 #define PULSE_WIDTH_USEC 5 #define POLL_DELAY_MSEC 1 int ploadPin = 11; // Connects to Parallel load pin the 165 SH int dataPin = 13; // Connects to the Q7 pin the 165 QH int clockPin = 12; // Connects to the Clock pin the 165 CLK byte arr[DATA_WIDTH],oldArr[DATA_WIDTH]; void read_shift_regs() { digitalWrite(ploadPin, LOW); delayMicroseconds(PULSE_WIDTH_USEC); digitalWrite(ploadPin, HIGH); for (int i = 0; i < DATA_WIDTH; i++) { arr[i] = digitalRead(dataPin); digitalWrite(clockPin, HIGH); delayMicroseconds(PULSE_WIDTH_USEC); digitalWrite(clockPin, LOW); } } void display_pin_values() { Serial.print("Pin States: "); Serial.print( " \r\n"); for (int i = 0; i < DATA_WIDTH; i++) { Serial.print(" Pin-"); Serial.print(i); Serial.print(": "); if (arr[i]) Serial.print("HIGH"); else Serial.print("LOW"); if(arr[i]!=oldArr[i]) Serial.print(" - - - changed"); Serial.print("\r\n"); } } bool change(byte* arr1, byte* arr2){ for(int i = 0; i < DATA_WIDTH; i++){ if(arr1[i]!=arr2[i]) return true; } return false; } void assignment(){ for(int i = 0; i < DATA_WIDTH; i++){ oldArr[i] = arr[i]; } } void setup() { Serial.begin(9600); pinMode(ploadPin, OUTPUT); pinMode(clockPin, OUTPUT); pinMode(dataPin, INPUT); digitalWrite(clockPin, LOW); digitalWrite(ploadPin, HIGH); read_shift_regs(); display_pin_values(); assignment(); } void loop() { read_shift_regs(); if (change(arr, oldArr)) { display_pin_values(); assignment(); } }С одной платой работает нормально. Последовательное соединение - нет.
Это у Mega 2560 мало входов? А вы не шутите случайно?
Подключили бы две платы на разные пины и не мучались. А так схему давайте, тогда может что и подскажем.