Consulta Multiplexor 74HC595

Buenas noches!!!

Antes de nada presentarme:

Mi nombre es Juankar y vivo en Murcia. Hace unos meses descubrí por casualidad Arduino y desde entonces dedico parte de mi escaso tiempo libre a "jugar" un poco con él :slight_smile:

Al mismo tiempo he ido leyendo este foro y toda la documentación que voy encontrado en la web y aunque la mayor parte se escapa a mi comprensión (todo llegará espero...) me está sirviendo para ir aclarando conceptos básicos y aprendiendo poco a poco a modificar algún código que otro...

El caso es que hace unas semanas leí acerca del Multiplexor 74HC595 y me hice con un par de ellos.

He probado varios ejemplos que he encontrado en la red y todo funciona según lo previsto aunque a la hora de intentar entender el código para comprender realmente como funciona el multiplexor me han ido surgiendo algunas dudas. Algunas las he ido despejando a base de buscar-leer-buscar y otras a base de ir modificando el código original para ver que ocurría...

Uno de los ejemplos que he probado ha sido el de http://arduino.cc/es/Tutorial/ShiftOut que incluye el siguiente esquema:

El código incluido con el ejemplo dice que hace que cuente de 0 a 255 representando los números con los leds.

Como no entendía bien el funcionamiento del multiplexor he intentado modificar el código para que se enciendan los 8 leds de uno en uno y así poder ver que "patilla" era la que se activaba en cada momento y debido a que comando...

Después de muchos intentos y correcciones el código resultante ha sido (viéndolo ahora da un poco de vergüenza por lo pequeño que es y lo que me ha costado :sweat_smile:...):

//Pin connected to ST_CP of 74HC595
int latchPin = 8;
//Pin connected to SH_CP of 74HC595
int clockPin = 12;
////Pin connected to DS of 74HC595
int dataPin = 11;



void setup() {
  //set pins to output so you can control the shift register
  pinMode(latchPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
}

void loop() {
  
  int x;
  for (x=1; x <= 128; x=x*2)
  {
     // enciende el led 1
     digitalWrite(latchPin, LOW);
     shiftOut(dataPin, clockPin, MSBFIRST, x);  
     digitalWrite(latchPin, HIGH);
     delay(500);
  }    

}

... y aquí surge mi duda...

Resulta que el "orden" de salida es

Q0............ valor x = 1
Q1............ valor x = 2
Q2............ valor x = 4
Q3............ valor x = 8
Q4............ valor x = 16
Q5............ valor x = 32
Q6............ valor x = 64
Q7............ valor x =128

¿Esto es así siempre?

Quiero decir... ¿siempre que utilice un 74HC595 los valores de x dentro del comando shiftOut(dataPin, clockPin, MSBFIRST, x) son los mismos que he indicado antes (1,2,4,8, 16...)?

¿Y si añado un segundo multiplexor en "serie" las salidas de este último seguirán con la misma secuencia?

Si fuerais tan amables de aclarármelo os estaría muy agradecido.

Muchas gracias por anticipado!!!!

Juankar

pasa esos valores a binario y te daras cuenta tu solo.

maxid:
pasa esos valores a binario y te daras cuenta tu solo.

Q0............ valor x = 1.......... codigo binario = 1
Q1............ valor x = 2.......... codigo binario = 10
Q2............ valor x = 4.......... codigo binario = 100
Q3............ valor x = 8.......... codigo binario = 1000
Q4............ valor x = 16.......... codigo binario = 10000
Q5............ valor x = 32.......... codigo binario = 100000
Q6............ valor x = 64.......... codigo binario = 1000000
Q7............ valor x =128.......... codigo binario = 1000000

:astonished: :astonished: :astonished: :astonished: :astonished: :astonished: :astonished: :astonished: :astonished:

:slight_smile: Como mola....

Entonces si conecto 2 en serie el siguiente código binario sería el 100000000 o 256 ¿no?

Otra duda... ¿es casualidad que el nº de la "Q" sea el nº de ceros del nº binario?

Gracias!!!!!

Te sugiero leas las hojas de datos para que sepas que es cada pin y como se manejan. Las Q no son ceros son las salidas, el chip es un registro de desplazamiento.

Muchas gracias Maxid!!!

Lo de las Q y el nº de ceros lo suponía pero tenía que preguntar por si acaso. Como dice el famoso refrán: “Es mejor parecer tonto por preguntar lo que no se sabe, que permanecer tonto por no preguntar lo que no se sabe:wink: jejeje

Por supuesto antes de nada leí el datasheet pero entre mi mediocre nivel de inglés (el google traslator tampoco ayuda mucho) y el menor todavía de electrónica me enteré de lo más básico: pines de salida del 1 al 7 +15, pin 9 y 14 para conexión en serie entre ellos, el 8 masa, el 16 voltaje...

Tengo problemas para entender el funcionamiento "lógico" que parece estar en los pines 11, 12, 13 y 14 del registro de desplazamiento.... Entiendo que la idea que tengo yo de un registro de desplazamiento es tan básica que es errónea: entra la información por un pin, se va almacenando en la memoria y en un momento dado se reparte por los pines de salida en el mismo orden en que han ido entrando (o en el inverso)...

Supongo que la clave está aquí:

pero no logro interpretarlo... Se que es un problema de falta de conocimientos de base pero seguiré leyéndolo e intentando comprenderlo hasta conseguirlo :wink:

Un saludo!!!!

aca tienes un ejemplo muy completo y el funcionamientp, esta en ingles pero se entiende facilemnte

Muchísimas gracias por el enlace Maxid!!!

Tiene muy buena pinta :):):slight_smile: Voy a ponerme con ello cuanto antes.

Un saludo!!!!!

Estoy en ello XD XD XD

Hola,

Miralo asi:
Q7.......Q0
valor x = 1.......... codigo binario = 00000001
valor x = 2.......... codigo binario = 00000010
valor x = 4.......... codigo binario = 00000100
valor x = 8.......... codigo binario = 00001000
valor x = 16.......... codigo binario = 00010000
valor x = 32.......... codigo binario = 00100000
valor x = 64.......... codigo binario = 00100000
valor x =128.......... codigo binario = 10000000
valor x =170.......... codigo binario = 10101010

Saludos.

Luis_AM3C:
Hola,

Miralo asi:
Q7.......Q0
valor x = 1.......... codigo binario = 00000001
valor x = 2.......... codigo binario = 00000010
valor x = 4.......... codigo binario = 00000100
valor x = 8.......... codigo binario = 00001000
valor x = 16.......... codigo binario = 00010000
valor x = 32.......... codigo binario = 00100000
valor x = 64.......... codigo binario = 00100000
valor x =128.......... codigo binario = 10000000
valor x =170.......... codigo binario = 10101010

Saludos.

Muchas gracias Luis!!!!

He conectado 2 multiplexores en serie con 8 leds cada uno y ya consigo que se encienda el mismo led en cada uno de ellos. También los "contrarios" en cada uno.

//Pin connected to ST_CP of 74HC595
int latchPin = 8;
//Pin connected to SH_CP of 74HC595
int clockPin = 12;
////Pin connected to DS of 74HC595
int dataPin = 11;



void setup() {
  //set pins to output so you can control the shift register
  pinMode(latchPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
}

void loop() {
  
  int x;
  for (x=1; x <= 128; x=x*2)
  {
     // enciende el led de cada multiplexor
     digitalWrite(latchPin, LOW);
     shiftOut(dataPin, clockPin, MSBFIRST, x); 
     shiftOut(dataPin, clockPin, MSBFIRST, x);
     digitalWrite(latchPin, HIGH);      
     delay(500);
  }    

}

Lo que no he conseguido todavía es que se encienda un led solo... en el primero o en el segundo multiplexor....

Tiempo.... necesito más tiempo!!!!!!!! XD

Un saludo!!!!