Mal comportamiento del CD4021BE Shift-in

0

Tengo un CD4021BE configurado de manera muy similar al Tutorial de Arduino ShiftIn (la principal diferencia es que yo no Actualmente no tengo 8 botones, por lo que acabo de conectar PI-5 a PI-7 a tierra con una resistencia, me sale el mismo mal comportamiento si se dejan flotando).

Todos los valores que estoy obteniendo están siendo cambiados 1 bit, por lo que con 5 botones conectados de PI-1 a 4 y PI-8), al presionar el que está conectado a PI-1 me da el valor 00000010 , al presionar PI-2 me da 00000100 y PI-8 solo me da 00000000 .

Tengo mi pin de datos conectado a Q8, que, por lo que puedo ver en la Hoja de datos es el lugar correcto. Solo para ver qué sucedió, lo conecté a la Q6 y obtuve 00001000 de PI-1 y así sucesivamente.

Obtuve 5 de estos chips cuando los ordené y he probado 3 hasta el momento y todos funcionan de la misma manera, lo que realmente sugiere que estoy haciendo algo estúpido.

Este es el código que estoy usando actualmente:

#define CLK 10
#define LATCH 9
#define DATA 8

int data;

void setup() {
  Serial.begin(9600);
  pinMode(DATA, INPUT);
  pinMode(CLK, OUTPUT);
  pinMode(LATCH, OUTPUT);
  Serial.println("Begin...");
}

void loop() {
  digitalWrite(LATCH, HIGH);

  digitalWrite(LATCH, LOW);

  data = shiftIn(DATA, CLK, MSBFIRST);

  Serial.println(data, BIN);

  delay(500);
}

CLK está conectado a CLOCK en el chip, y LATCH es PARALLEL/SERIAL CONTROL .

¿Por qué sucede esto?

    
pregunta MalphasWats

1 respuesta

0

Después de seguir buscando en Google, encontré una especie de "respuesta". Un problema sobre la implementación de Arduino de shiftIn() con una solución:

  

Hay una solución:   Si enciende el reloj antes de bajar el indicador de control, evitará la transición positiva adicional del reloj.    digitalWrite (shiftClock, HIGH);    digitalWrite (shiftControl, LOW);   No estoy seguro si esto es un error o una característica que falta. El problema es que el primer bit ya está en la salida Q8 cuando ocurre la primera transición de reloj positiva en shiftIn. Creo que esto es lo que se describe en la hoja de datos como "En el HCC / HCF4021B, la entrada de RELOJ de la etapa interna se" fuerza "cuando se realiza una entrada paralela asíncrona".

Agregué un CLK alto entre el LATCH pulse y ahora funciona:

void loop() {
  digitalWrite(LATCH, HIGH);
  digitalWrite(CLK, HIGH);   // Set clock high to catch first bit.
  digitalWrite(LATCH, LOW);

  data = shiftIn(DATA, CLK, MSBFIRST);
  ...
}

¡Justo cuando siento que realmente he empezado a entender las cosas, empiezo a encontrar errores extraños en las bibliotecas!

    
respondido por el MalphasWats

Lea otras preguntas en las etiquetas