много кнопок

Gadwil
Offline
Зарегистрирован: 28.02.2017

Есть много кнопок. Имеются платы с 4-мя регистрами 74HC165 на каждой плате. Вследствие малого колличества входов на arduino mega 2560, платы подключаются последовательно (должны подключаться, но с этим проблемы). 
Считывание состояния с отдельно подключенной платы не представляет трудностей, но когда последовательно подключается ещё хотя бы одна плата, то теряются последние регистры (последние 15 пинов не детектируются, но если замкнуть один пин перед ними, получим множественное нажатие кнопок, которые на самом деле не нажаты). В чём может быть проблема? Может ли быть дело в недостаточной амплитуде сигнала? 

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

то есть как работает железо и как работае твой код ты понимаешь до конца. и просто наблюдаешь глюк. или это чей то код и ты пытаешься расширить, но что то делаешь неправильно?

Gadwil
Offline
Зарегистрирован: 28.02.2017

Может и не до конца, но понимаю. Я продолжаю работу знакомого, который мне всё объяснил по коду, да я и сам уже внёс поправки. 
Последовательное подключение плат с  74HC595 работает нормально. 
Сам знакомый последовательного подключения с кнопками так и не добился.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

В 48 строке кода явная ошибка. Да и номинал резистора в верхнем правом углу схемы сомнителен (R3, кажется, шар что-то мунтноват сегодня).

Gadwil
Offline
Зарегистрирован: 28.02.2017

Могу пока что скинуть код.



#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();
  }
}

С одной платой работает нормально. Последовательное соединение  -  нет.

AlexeySh
Offline
Зарегистрирован: 16.01.2017

Это у Mega 2560 мало входов? А вы не шутите случайно?

Подключили бы две платы на разные пины и не мучались. А так схему давайте, тогда может что и подскажем.