Проблема с 74HC165N

kaiser
Offline
Зарегистрирован: 31.08.2014

Всем привет! Я только начинаю разбираться с arduino и действую исключительно по существующим мануалам. 

Для того, чтобы подключить 8 кнопок я решил использовать 74HC165N и нашел вот эту инструкцию.

Когда я действую строго по ней - все нормально, но если я решаю поменять pin'ы следующим образом:

9 pin => 3 pin

8 pin => 2 pin

(и отредактровав код, конечно):

int ploadPin        = 8;  // Connects to Parallel load pin the 165
int clockEnablePin  = 9;  // Connects to Clock Enable pin the 165

,я начинаю видеть нечто "левое", в мониторах порта по дефолту 8, 9, 10 и 11 выходы имеют значение "LOW":

*Pin value change detected*
Pin States:
  Pin-0: HIGH
  Pin-1: HIGH
  Pin-2: HIGH
  Pin-3: HIGH
  Pin-4: HIGH
  Pin-5: HIGH
  Pin-6: HIGH
  Pin-7: HIGH
  Pin-8: LOW
  Pin-9: LOW
  Pin-10: LOW
  Pin-11: LOW
  Pin-12: HIGH
  Pin-13: HIGH
  Pin-14: HIGH
  Pin-15: HIGH

Почему это происходит? Как мне это обойти?

Спасибо!

kaiser
Offline
Зарегистрирован: 31.08.2014

kaiser пишет:

(и отредактровав код, конечно):

int ploadPin        = 8;  // Connects to Parallel load pin the 165
int clockEnablePin  = 9;  // Connects to Clock Enable pin the 165

заменяю на 

int ploadPin        = 2;  // Connects to Parallel load pin the 165
int clockEnablePin  = 3;  // Connects to Clock Enable pin the 165

 

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

откуда 16 пинов если в в 165 всего 8

kaiser
Offline
Зарегистрирован: 31.08.2014

jeka_tm, Вы код моего примера, наверное, не смотрели?

16 "пинов" выводятся в консоль, но при этом активные только 8-15 (0-7 не меняются и формируются из-за сдвига насколько я понимаю).

Т.е. на нажатие клавиш реагируют только 8-15 пины, но при этом 8-11 почему-то всегда high по умолчанию

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

какой код? эти несколько строк вы называете кодом? это обрывки

 

kaiser
Offline
Зарегистрирован: 31.08.2014

jeka_tm, специально для вас скопирую весь код из примера, который я привел по ссылке (код находится там же):

/*
 * SN74HC165N_shift_reg
 *
 * Program to shift in the bit values from a SN74HC165N 8-bit
 * parallel-in/serial-out shift register.
 *
 * This sketch demonstrates reading in 16 digital states from a
 * pair of daisy-chained SN74HC165N shift registers while using
 * only 4 digital pins on the Arduino.
 *
 * You can daisy-chain these chips by connecting the serial-out
 * (Q7 pin) on one shift register to the serial-in (Ds pin) of
 * the other.
 * 
 * Of course you can daisy chain as many as you like while still
 * using only 4 Arduino pins (though you would have to process
 * them 4 at a time into separate unsigned long variables).
 * 
*/

/* How many shift register chips are daisy-chained.
*/
#define NUMBER_OF_SHIFT_CHIPS   2

/* Width of data (how many ext lines).
*/
#define DATA_WIDTH   NUMBER_OF_SHIFT_CHIPS * 8

/* Width of pulse to trigger the shift register to read and latch.
*/
#define PULSE_WIDTH_USEC   5

/* Optional delay between shift register reads.
*/
#define POLL_DELAY_MSEC   1

/* You will need to change the "int" to "long" If the
 * NUMBER_OF_SHIFT_CHIPS is higher than 2.
*/
#define BYTES_VAL_T unsigned int

int ploadPin        = 8;  // Connects to Parallel load pin the 165
int clockEnablePin  = 9;  // Connects to Clock Enable pin the 165
int dataPin         = 11; // Connects to the Q7 pin the 165
int clockPin        = 12; // Connects to the Clock pin the 165

BYTES_VAL_T pinValues;
BYTES_VAL_T oldPinValues;

/* This function is essentially a "shift-in" routine reading the
 * serial Data from the shift register chips and representing
 * the state of those pins in an unsigned integer (or long).
*/
BYTES_VAL_T read_shift_regs()
{
    long bitVal;
    BYTES_VAL_T bytesVal = 0;

    /* Trigger a parallel Load to latch the state of the data lines,
    */
    digitalWrite(clockEnablePin, HIGH);
    digitalWrite(ploadPin, LOW);
    delayMicroseconds(PULSE_WIDTH_USEC);
    digitalWrite(ploadPin, HIGH);
    digitalWrite(clockEnablePin, LOW);

    /* Loop to read each bit value from the serial out line
     * of the SN74HC165N.
    */
    for(int i = 0; i < DATA_WIDTH; i++)
    {
        bitVal = digitalRead(dataPin);

        /* Set the corresponding bit in bytesVal.
        */
        bytesVal |= (bitVal << ((DATA_WIDTH-1) - i));

        /* Pulse the Clock (rising edge shifts the next bit).
        */
        digitalWrite(clockPin, HIGH);
        delayMicroseconds(PULSE_WIDTH_USEC);
        digitalWrite(clockPin, LOW);
    }

    return(bytesVal);
}

/* Dump the list of zones along with their current status.
*/
void display_pin_values()
{
    Serial.print("Pin States:\r\n");

    for(int i = 0; i < DATA_WIDTH; i++)
    {
        Serial.print("  Pin-");
        Serial.print(i);
        Serial.print(": ");

        if((pinValues >> i) & 1)
            Serial.print("HIGH");
        else
            Serial.print("LOW");

        Serial.print("\r\n");
    }

    Serial.print("\r\n");
}

void setup()
{
    Serial.begin(9600);

    /* Initialize our digital pins...
    */
    pinMode(ploadPin, OUTPUT);
    pinMode(clockEnablePin, OUTPUT);
    pinMode(clockPin, OUTPUT);
    pinMode(dataPin, INPUT);

    digitalWrite(clockPin, LOW);
    digitalWrite(ploadPin, HIGH);

    /* Read in and display the pin states at startup.
    */
    pinValues = read_shift_regs();
    display_pin_values();
    oldPinValues = pinValues;
}

void loop()
{
    /* Read the state of all zones.
    */
    pinValues = read_shift_regs();

    /* If there was a chage in state, display which ones changed.
    */
    if(pinValues != oldPinValues)
    {
        Serial.print("*Pin value change detected*\r\n");
        display_pin_values();
        oldPinValues = pinValues;
    }

    delay(POLL_DELAY_MSEC);
}

==

Я соответственно меняю значения в 42-43 строках и у меня начинаются проблемы с дефолтными значениями входов 74HC165N

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

а что вообще на входах 165 микросхемы? не воздухе висят?

kaiser
Offline
Зарегистрирован: 31.08.2014

Нет, все именно так подключено, как в примере:

(Только 8-9 pin'ы я заменил на 2-3)

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

проверьте вольтметром точно ли есть напряжение на этих пинах, по идее смена пина ни на что не должна повлиять

kaiser
Offline
Зарегистрирован: 31.08.2014

jeka_tm, 

вольтметра у меня на руках, к сожалению, нет.

 

Вы знаете, я вынужден перед вами извиниться: сейчас с нуля всю схему построил, 8-11 пин в консоли все равно инвертированы (когда нажаты - high, когда не нажаты - low). Видимо это сбой моего регистра. jeka_tm, спасибо вам за потраченное время!

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

)