¿Por qué mi circuito de registro de desplazamiento no funciona?

0

Me gustaría capturar el estado de algunos botones con un registro de desplazamiento ( CD4014B ). Intento solucionar problemas e identificar si el problema que tengo es el hardware o el software.

Al imprimir el byte en el monitor serie, puedo ver 11111111 cuando no se presiona ningún botón. El resultado esperado.

El problema que tengo es que no importa el botón que presione, todos los bits permanecen 1 ... Excepto el botón 'D' . Cuando se presiona 'D', todos los bits son 0.

Aquí está mi esquema:

(Nota al margen: actualmente no tengo botones pulsadores instalados. Estoy simulando que se presiona un botón conectando el cabezal del pin al suelo)

int dataPin = 8;
int clockPin = 9;
int latchPin = 10;

void setup() {
    Serial.begin(9600);
    pinMode(latchPin, OUTPUT);   
    pinMode(clockPin, OUTPUT);
    pinMode(dataPin, INPUT);

    digitalWrite(latchPin, LOW);    
    digitalWrite(clockPin, LOW);

}

byte shift() {

  byte data, i;

    /* first clock pulse gets parallel load */
    digitalWrite(latchPin, HIGH);

    data=0;
    for(i=0;i<8;i++)
    {
        /* clock low-high-low */
        digitalWrite(clockPin, HIGH);
        digitalWrite(clockPin, LOW);

        /* if this is the first bit, then we're done with the parallel load */
        if (i==0) digitalWrite(latchPin, LOW);

        /* shift the new bit in */
        int temp = digitalRead(dataPin);
        if(temp) {
            data = data | (1 << i);
        }

    }
    return(data);

}

void loop() {
    byte buttons = shift();
    Serial.println(buttons, BIN);

    delay(10);
}

¿Mi cableado esquemático es correcto y mi código está libre de errores? Y en cualquier caso, ¿por qué no obtengo los resultados deseados?

    
pregunta bwoogie

1 respuesta

1

Tu código está lleno de errores. Sus índices de pin están equivocados y los pines de reloj, latch y datos son entradas. Con las entradas definidas como salidas, no obtiene resultados útiles.

De acuerdo con la hoja de datos, solo debe configurar el pin 9 'alto' para que siempre se cargue en paralelo, luego use el reloj para desplazar los datos. No estoy seguro de por qué tiene un bucle interno para el pin de cierre / carga.

NOTA: usaría un interruptor DIP de 8 secciones para ingresar el patrón que quieras, luego hacer que la MPU alterne el pin de control y el pin del reloj para cambiar los datos en Q8, que has marcado como 'IN_DATA', aunque no veo eso en el conector.

Disminuya la velocidad y preste atención a los detalles, revise dos y tres veces su trabajo o el software lo volverá loco.

    
respondido por el Sparky256

Lea otras preguntas en las etiquetas