74HC595 y 74HC165 con Arduino

Hola:

Voy a intentar investigar a fondo el funcionamiento del 74HC595 y el 74HC165. Lo quiero para Arduino como 8 entradas digitales y 8 salidas digitales. Ahora me centro en como manejarlo desde Proteus 7 que es el que dispongo ahora.

bitshift_schematic.png

https://stefan.co/electronics/multiplexing-with-bitshift-ics/

A pesar del esquema de arriba en mic aso solo usaré uno de cada de estos IC. Como ves en el esquema de arriba. Tiene para controlar 16 entradas digitales y 16 salidas digitales. Arduino tiene conectado 5 pines para controlas estos IC.

En mi caso son 8 entradas digitales y 8 salidas digitales. ¿Cuántos pines necesito conectarlo a Arduino?

Se que si solo es 74HC595 son solo tres pines y lo mismo para el 74HC165.

Un cordial saludo.
 
Hola:

... Tiene para controlar 16 entradas digitales y 16 salidas digitales. Arduino tiene conectado 5 pines para controlas estos IC.

En mi caso son 8 entradas digitales y 8 salidas digitales. ¿Cuántos pines necesito conectarlo a Arduino?

Se que si solo es 74HC595 son solo tres pines y lo mismo para el 74HC165.

Un cordial saludo.

Usa el protocolo SPI para mandar/recibir datos a/de los registros, en el esquema usa 2 líneas de selección de esclavo, una para los 74hc165 y otra para los 74hc595 (cables blanco y gris).

En el esquema conecta los dos 74hc165 en serie (daisy chain), compartiendo la misma línea de selección, así que no va a haber diferencia con usar 1, 2, 3, 4... 74hc165 ya que la linea de selección es común a todos ellos.

En realidad no es una línea de selección en el sentido a que nos tiene acostumbrados SPI: no es que ponemos esa línea en 0, escribimos con spi_write(valor), y despues esa linea en 1.
Sino que en realidad esa línea es la que permite copiar los valores del registro de desplazamiento interno del 74hc595 a los flip-flop de salida, y esos flip-flop de salida tienen como entrada de reloj la "línea de selección".
Entonces la secuencia es, dejar la línea de selección en 0, escribir con spi_write, dar un pulso en la línea de selección (cs =1 e inmediatamente despues cs=0).

Parecido con el 74hc165, primero damos un pulso de muestreo (que es una línea de carga paralela de datos en el registro de desplazamiento interno), y luego haríamos un spi_read. Si tenemos 1 solo registro haremos solo 1 spi_read, si tenemos N registros entonces N spi_read().

Conclusión: vas a precisar la misma cantidad de líneas que en el diagrama por más que uses solo 1 registro de entrada y 1 de salida.
 
es verdad yo usaba esos chips como SPI

bueno si no quieres solo habilita el latchs o enable y vaz rotando un registro de 8 bits que contiene tu dato y ese bit que se va rotando lo mandas atravez de un pin y le das a cada bit rotado un clock y cuando termines de enviar 8 bits desactivas el enable o latch como gustes llamarle

es muy facil asi le hise para hacer una LCD 16x2 que en lugar de usar 4 bits u 8 bits mas sus señales de control

usar solo 3 pines mas su respectivo + y -
 
Hola.

Estoy con el Proteus intenando usar los IC por separado. Con el 74HC595 me funciona bien y con el módulo SPI para leer los bytes. Aquí explica muy bien el funcionamiento del 74HC595.

En cuanto al 74HC165 no se como poner el módulo SPI. Tampoco entiendo bien el funcionamiento, al menos los pasos a seguir. No he encontrado como explica muy bien el 74HC165.

Cuando entienda como funciona bien el 74HC165 por separado, quiero juntar los dos IC, los datos del 74HC165 se visualice en el 74HC595.

fsdafasdfsad-1272969.png


Pueden ayudarme como hacer lo que pido. De momento les paso el esquema hecho con Proteus para que lo prueben.

Saludos.
 

Adjuntos

  • 74HC595 y 74HC165.zip
    16.3 KB · Visitas: 88
Hola Meta

Dices: En cuanto al 74HC165 no se como poner el módulo SPI. Tampoco entiendo bien el funcionamiento, al menos los pasos a seguir. No he encontrado como explica muy bien el 74HC165.

Lo que hace el 74xx165 es ‘sacar’ por su salida SO(9) (Serial Out), en serie, los datos que están en sus entradas Dx(x).
Para lograr ese fin tiene 3 entradas de control:

SH/LD’(1). (SHift/Load’) Esta entrada tiene doble función: Carga los datos, en sus entradas Dx(x), en sus registros internos aplicándole un nivel bajo o 0. Cuando esta entrada es nivel alto, los datos se desplazan en sus registros internos en cada transición positiva del pulso aplicado a su entrada CLK(2). Y. . . los datos van apareciendo, uno a uno por su salida SO(9).
La salida QH(7) solo es el complemento del nivel que tenga su salida SO(9).

CLK(2). (CLocK) En cada transición positiva del pulso aplicado, los datos se desplazan en sus registros internos.

INH(15). Esta entrada de control inhibe la función del IC cuando está a nivel alto o 1.

Entonces la secuencia sería:
- Ajustar los datos a enviar en sus entradas Dx(x).
- Aplicar un pulso de transición negativa a su entrada SH/LD’(1). Normalmente debe ser nivel alto.
- Aplicar 8 pulsos de transición positiva a su entrada CLK(2).

Nota: Para que no interfiera el funcionamiento que estás requiriendo (PISO), la entrada SI(10) debe conectarse a Tierra (GND, Masa). Esta entrada es para cuando se utiliza el IC como SISO, Serial-IN Serial-OUT.

Yo creo que si lograste hacer funcionar el módulo SPI con el 74xx595 lo mismo podrás lograr con el 74xx165.

Te adjunto un diseño en ISIS de proteus para que si deseas practiques con él.
Nota en él que faltan las resistencias limitadoras de corriente para cada barra de cada conjunto.
Tambien nota que cuando las barras están apagadas se está enviando un nivel alto.

saludos
a sus ordenes
 

Adjuntos

  • PISO Muestra Para Practicar.PDF
    589.8 KB · Visitas: 78
  • PISO Muestra Para Practicar.zip
    19.4 KB · Visitas: 44
Hola:

Menudo ejemplo, ;)

fsdafasdfsad-1273181.png

1) ¿La salida Q7 del 74HC595 es el bit de mayor peso o menor peso?

Voy a explicar como creo que funciona el 74HC165 y si me equivoco me corrigen. Pongo el bit 4 activado. Dejo pulsado PL a 1 o activado, mientras pulso 8 veces CLK. Si no pulso PL o lo dejo pulsado mientras estoy pulsando CLK, esto no funciona.

2) ¿Es así su manera de funcionar?

Última duda, al menos por ahora. Quiero conectar el 74HC595 y el 74HC165 juntos, es decir, que si pongo como entrata los bits estos por poner un ejemplo 11110000 en el 165, a la salida del 595 tiene que aparecer los mismos bits de entrada, tambiéna 11110000.

3) ¿Cómo son sus conexiones en el circuito de arriba con el Proteus?

A pesar que has hecho un pedazo de ejemplo, quiero usar estos integrados sin usar los otros que has puesto, incluido el 555.

Muchas gracias y buen trabajo del ejemplo.
 
Hola Meta

1) Si, Así es. Prácticamente en los sistemas digitales, el BIT de mayor peso es aquel que es nombrado con los números o Letras o conjunto de esos dos, mayores.
Por ejemplo: En el grupo de las D’s, el BIT de mayor peso es D7. Normalmente es clasificado con el nombre MSB(Most Significant BIT). En un conjunto de BIT’s nombrados solo con letras, el de mayor peso es el que sea nombrado con la letra más cercana a la Z, D C B A. El BIT de mayor peso es el nombrado con la letra D.

Como te había mencionado: el PIN 1 del 165 tiene 2 Funciones, SH y LD Con rayita arriba, Normalmente se le nombra LD testada.
Así que solo puede estar en una de las dos funciones: En LD o En SH.
Si está en la función LD. Tiene nivel bajo, cero o 0. Así que la función SH no la hace.
Si está en la Función SH. Tiene nivel alto, uno o 1, por lo tanto los datos en los registros internos se desplazarán en cada transición positiva del pulso aplicado a su entrada CLK(2).

2) No, no precisamente.

Tu siguiente párrafo en éste inciso:
De ese modo es como funciona el diseño que te adjunté en mi mensaje #5.

3) Son o serán como el que te adjunto.
Puedes conectar tu Arduino al diseño que te adjunto.
Probablemente quieres programar las 8 entradas de datos (D’s) con tu Arduino. Ahí están los conectores de entrada para éste fin.
Luego efectuar la secuencia de pulsos que se describen al calce del diseño.

Nota que los IC’s de la familia HC requieren tanto una polarización como niveles lógicos de +9V.
Analiza, también, la carta de secuencia que te adjunto.

Espero haberte ayudado.

saludos
a sus ordenes
 

Adjuntos

  • PISO Data & Control Externos.PDF
    1,006.6 KB · Visitas: 45
  • Carta De Secuencia.png
    Carta De Secuencia.png
    11.9 KB · Visitas: 24
  • PISO Data & Control Externos.zip
    18.3 KB · Visitas: 27
Buenas:

Voy hacer pruebas y poner los botones como indicas.

Otra duda que tengo sonbre los 74HC165.

En cada pin de entrada del 74HC165, si solo necesito activar un pin y desactivarlo como si fuera un pulsador, y en la salida 74HC595 se activa y desactiva un Led.

¿Debo ponerle una señal de entrada al 74HC165 8 veces, es decir, 8 bits?

Enviar esto:
0010000 como entrada, envío 8 bits, ya que si se me ocurre solo enviar uno, me desordena todo ya que se desplaza los bits y en la salida del 74HC595 tendré comportamientos no deseados.

Como dice antes, si envío 0010000, recibo 0010000. Si envío 00000001, recibo 00000001. Así con cada puladore de entrada.

Espero que se entienda lo que quiero decir.

Saludos.
 
Buenas:

Voy hacer pruebas y poner los botones como indicas.

Otra duda que tengo sonbre los 74HC165.

En cada pin de entrada del 74HC165, si solo necesito activar un pin y desactivarlo como si fuera un pulsador, y en la salida 74HC595 se activa y desactiva un Led.

¿Debo ponerle una señal de entrada al 74HC165 8 veces, es decir, 8 bits?

Enviar esto:
0010000 como entrada, envío 8 bits, ya que si se me ocurre solo enviar uno, me desordena todo ya que se desplaza los bits y en la salida del 74HC595 tendré comportamientos no deseados.

Como dice antes, si envío 0010000, recibo 0010000. Si envío 00000001, recibo 00000001. Así con cada puladore de entrada.

Espero que se entienda lo que quiero decir.

Saludos.

Hola, exacto, cada que quieras actualizar un sólo bit debes de enviar los 8 bits. Para hacerlo más fácil en tu programa declara una variable que tenga el último valor enviado al registro serie y una rutina que se encargue de enviarlo. Actualizas un sólo bit de esa variable y llamas a la función de envió para actualizar los niveles lógicos de salida

En realidad no es una línea de selección en el sentido a que nos tiene acostumbrados SPI: no es que ponemos esa línea en 0, escribimos con spi_write(valor), y despues esa linea en 1.
Sino que en realidad esa línea es la que permite copiar los valores del registro de desplazamiento interno del 74hc595 a los flip-flop de salida, y esos flip-flop de salida tienen como entrada de reloj la "línea de selección".
Entonces la secuencia es, dejar la línea de selección en 0, escribir con spi_write, dar un pulso en la línea de selección (cs =1 e inmediatamente despues cs=0).

Aquí hay que considerar que el fabricante del 595 aclara que ambas entradas de reloj pueden conectarse juntas con la diferencia que el dato de salida (8bits) estará presente integramente después de 9 pulsos de reloj
 
[...]
Aquí hay que considerar que el fabricante del 595 aclara que ambas entradas de reloj pueden conectarse juntas con la diferencia que el dato de salida (8bits) estará presente integramente después de 9 pulsos de reloj

Sinttulo.jpg


Ver imagen

Lo que cuentas está bien para ahorrar pines o eso parece, de todas formas tengo que hacer pruebas con el Proteus, luego en la protoboard para saber la ralidad, ya que los simuladores a veces tienen comportamientos no deseado.

Quiero algo indicado en esta imagen de abajo.

1) Como puedes ver, Arduino usa 5 pines. ¿Para lo que yo quiero, se puede usar con menos pines o son obligados los indicado en la imagen?

2) En las entradas normales puede haber antirebotes si usamos pulsadores. Su código de ejemplo es este.
Código:
int estadoUltimo=0; 
int contador=0; 

void setup(){
      pinMode(4,OUTPUT); 
      pinMode(8,INPUT);  
      Serial.begin(9600);
}

void loop(){
      estadoActual1=digitalRead(8); 
      delay(10);
      estadoActual2=digitalRead(8);
      if (estadoActual1 == estadoActual2) {
          if (estadoActual1 != estadoUltimo){ 
              if (estadoActual1 == HIGH) {
                    contador = contador + 1;
                    Serial.print ("Ésta es la pulsación nº ");
                    Serial.println(contador); 
              }        
          }
      }  
      estadoUltimo= estadoActual1;
      if (contador % 2 == 0 ) {
          digitalWrite(4, LOW);       
      } else {
          digitalWrite(4, HIGH);     
      }  
}

Con las entradas del 74HC165 me imagino que le pasará lo mismo con el tema de los antirrebotes.

En Internet leí esto:
Claro que se puede, lees los 8 bits, y esperas 20 mseg y vuelves a leerlos, si coinciden entonces lo tomas como entrada de byte válida

¿Es cierto?

Saludos.
 
Última edición:
Pues una forma que se me ocurre de momento es usar una sólo línea de datos para ambos registros y solamente jugar con su sentido de E/S dependiendo de la acción que se quiera hacer: leer o escribir.
 
Buenas a todos y a todas:

He estado haciendo pruebas con el 74HC595 junto con el 74HC165 y explico como me funciona a mi justo este esquema que hice con Proteus 7.10 SP0.

fsdafasdfsad-1275254.png

Guiado gracias a nuestro amigo @MrCarlos. :apreton:

Manualmente lo hago así y uso solo tres pines en vez de 5 como hacen algunas personas.

Aunque en el esquema hay 5 pulsadores de contro, solo usaremos Clock que está conectado al mismo tiempo de los dos IC, PL y Latch.

Con el 74HC165 configuro por ejemplo un bit com entrada, precisamente 4. Dejo pulsado PL en 1 o alto y pulso Clock 9 veces, luego le doy a Latch.

fsdafasdfsad-1275278.png

Si, pulsé Clock 9 veces porque es lo que pedía. Si pulso 8 veces y luego le pulso Latch, a la salida de los Led no aparece nada, por eso pulsarlo 9 Clock veces como pide. Se ve que activa a su salida el Q7 del 74HC595. Después de pulsar Latch, pongo PL a 0.

1) ¿Eso es por si tiene otro 74HC595?

Pulso la configuración de un bit solo el 0 a 1 y los demás a 0.
En la mism aventana de arriba, solo pide 8 bits y no nueve como antes.

Vuelvo hacer lo mismo y siempre será 8 veces. Eso si, si reinicio Proteus hay que hacerlo con 9 veces.

2) ¿Esto es normal?

Saludos.
 

Adjuntos

  • 74HC595 y 74HC165.zip
    18.5 KB · Visitas: 32
Hola Meta

Realmente no se porque debes pulsar 9 veces el Botón Clock.
Tal vez tu ISIS Proteus 7.10 SP0 tenga ese defecto.
Yo tengo el ISIS Proteus 7.8 SP2 y no me presenta lo mencionado por ti.

Programo con el Botón PL los 8 BIT’s de entrada: 00000110 tal como los tienes en tu diseño.
-Edité las Propierties de éste Botón para que permanezca cerrado. Click Abre, No Click Cierra.
Presioné 8 veces el Botón Clock, luego 1 vez el Botón Latch y lo programado en el 165 aparece en el 595.

Por otra parte: si no utilizas la entrada SI(10) Del 165, sería más conveniente conectarla a GDN.
Además, la entrada MR’(10) del 595 muy probablemente requieras manejarla digitalmente en un futuro cercano.

saludos
a sus ordenes
 

Adjuntos

  • Meta 74HC595 y 74HC165.PDF
    595.9 KB · Visitas: 20
  • Meta 74HC595 y 74HC165.zip
    18.3 KB · Visitas: 19
Hola Meta

Realmente no se porque debes pulsar 9 veces el Botón Clock.
Tal vez tu ISIS Proteus 7.10 SP0 tenga ese defecto.
Yo tengo el ISIS Proteus 7.8 SP2 y no me presenta lo mencionado por ti.

Será un fallo, no lo se.

Programo con el Botón PL los 8 BIT’s de entrada: 00000110 tal como los tienes en tu diseño.
-Edité las Propierties de éste Botón para que permanezca cerrado. Click Abre, No Click Cierra.
Presioné 8 veces el Botón Clock, luego 1 vez el Botón Latch y lo programado en el 165 aparece en el 595.

Cuando le volví a pulsar otra vez los 8 bits con otras entradas, luego 8 veces Clock (en mi caso tiene que ser 9 o no funcionaraá siempre y cuando se la primera vez que ejecurtes Proteus) y al final pulso Latch. Llegué a pensar que no hay que usar en este caso el PL. Sí, hay que pulsar PL y dejarlo como está antes de volver a ponet datos de entrada de 8 bits. Hay que tenerlo encuenta.


Por otra parte: si no utilizas la entrada SI(10) Del 165, sería más conveniente conectarla a GDN.

Entendido, dejarlo en GND, de todas maneras no se para que sirve.

Además, la entrada MR’(10) del 595 muy probablemente requieras manejarla digitalmente en un futuro cercano.

saludos
a sus ordenes

Tengo intención de usar dos 74HC595 para hacer pruebas a fondo. ¿Te refieres a ese mismo futuro cercano?

Estoy haciendo pruebas con tu nuevo esquema, fucniona de maravilla, lo que no sabía es dejar el PL pulsado.

Pues este señor de abajo, no lo hace así, es para que lo sepas.

Pensando bien, si hay que usar más de tres pines, por lo menos uno más y se llama Data.
¿El motivo?

Porque en cualquier momento desde Arduino puede modificar por sofrware las salidas del 74HC595 sin tener encuenta las entradas digirales físicas. Por ejemplo: Hay una a alarma de algo y se activa de modo intermitente una salida del 595 un zumbador más un Led. ;)

Otra cosa:
Ya que tienes PL activado por defecto. Por lo que he probado, hay que pulsar los pulsadores de entrada por ejemplo 00100000, luego PL, luego 8 veces Data y al final Latch para que aparezca el Led correspondiente encendido.

¿Si tengo un sensor digital y precisamente quiero el bit sindicado arriba?

El sensor solo deja pulsado el bit de entrada correspondiente, como dije arriba hay que enviarlo así: 00100000.

¿Quién activa el PL? (Que no sea una persona, no olvidar que estos Ic se conectará a Arduino).

Saludos.
 
Última edición:
Hola Meta

Tú Dices: Tengo intención de usar dos 74HC595 para hacer pruebas a fondo. ¿Te refieres a ese mismo futuro cercano?
Digamos Que si, a ese mismo futuro me refiero.

Tú Dices: Estoy haciendo pruebas con tu nuevo esquema, fucniona de maravilla, lo que no sabía es dejar el PL pulsado.
En la última imagen que adjuntaste se ve que tú tienes a tierra atraves de R3 el PIN 1 del 165.

Luego Dices: Pues este señor de abajo, no lo hace así, es para que lo sepas.
Se te escapan detalles de los esquemas. El señor de abajo tiene conectado ese PIN a Vcc atraves de una R de 10K.

saludos
a sus ordenes
 
Entendido. No me había fijado.

He montado, al principio con todo tipos de fallos, lo volví a montar en una DemoBoard.

1) Al encender el 74HC595, ¿es normal que los Led estén todos encendidos?
Si pulso Latch se apagan todos de golpe.

2) Parece ser que tiene antirebotes, porque sea interruptores o pulsadores, me hace cosas raras. Con esto digo. ¿Hay algún ejemplo de Arduino UNO que contenga ejemplo básicos sobre el control del 74HC595?
Aunque sea un Led corriendo en una dirección y luego vovler.

Saludos.

Edito:
Encontré este:
Arduino - ShiftOut

Código:
//**************************************************************//
//  Name    : shiftOutCode, Hello World                               
//  Author  : Carlyn Maw,Tom Igoe, David A. Mellis
//  Date    : 25 Oct, 2006   
//  Modified: 23 Mar 2010                                
//  Version : 2.0                                            
//  Notes   : Code for using a 74HC595 Shift Register           //
//          : to count from 0 to 255                          
//****************************************************************

//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() {
  // count from 0 to 255 and display the number
  // on the LEDs
  for (int numberToDisplay = 0; numberToDisplay < 256; numberToDisplay++) {
    // take the latchPin low so
    // the LEDs don't change while you're sending in bits:
    digitalWrite(latchPin, LOW);
    // shift out the bits:
    shiftOut(dataPin, clockPin, MSBFIRST, numberToDisplay); 

    //take the latch pin high so the LEDs will light up:
    digitalWrite(latchPin, HIGH);
    // pause before next value:
    delay(500);
  }
}
Arduino - ShftOut11

Funciona.


Aún así quiero saber la primera pregunta y hacer otro tipo de códigos que al pulsar un pulsador externo active y desactive el Led que yo tenga indicado, por ejemplo esto.

00100000

Si vuelvo a pulsar.

00000000

Espero que se entienda.

Edito 2:

Hice un pequeño código, parece que si me funciona.
Código:
// Pin conectado a ST_CP del 74HC595.
int latchPin = 8;
// Pin conectado a  SH_CP del 74HC595.
int clockPin = 12;
// Pin conectado a  DS del 74HC595.
int dataPin = 11;


void setup() {
// Pines configurados como salidas.
  pinMode(latchPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
}

void loop() {
 
  digitalWrite(latchPin, LOW); // Apaga todos los Led desde el inicio.
  shiftOut(dataPin, clockPin, MSBFIRST, 128); // 10000000 en binario.
  digitalWrite(latchPin, HIGH);
  delay(500); // Retardo de 0.5 segundos.
 
  digitalWrite(latchPin, LOW);
  shiftOut(dataPin, clockPin, MSBFIRST, 1); // 00000001 en binario.
  digitalWrite(latchPin, HIGH);
  delay(500); // Retardo de medio segundo.
}

Le voy cogiendo el truco.

Ahora a por el 74HC165.
 
Hola Meta, te dejo un diagrama y un archivo empacado en winrar, con un ejemplo de como utilizar los integrados 74HC595 y 74HC165 como expansores de i/o aunque no es arduino (lo que dejo es para PIC programado en leguaje basic para el compilador proton).

En el comprimido viene todo lo necesario para simularlo en proteus y como veras utilizo solo cuatro pins del microcontrolador y se pueden utilizar en cascada tantos integrados como se plasca.

Yo espero que con este ejemplo puedas adelantar en tu investigación.

Saludos

PHP:
'****************************************************************
'*  Name    : expansor.BAS                                      *
'*  Author  : Miguel Angel Borbolla Bonomi                      *
'*  Notice  : Copyright (c) 2012 CIBERTLAN                      *
'*          : All Rights Reserved                               *
'*  Date    : 26/04/2012                                        *
'*  Version : 1.0                                               *
'*  Notes   : APLICACION DE UN EXPANSOR DE PUERTOS CON 74HC595  *
'*          : y 74HC165                                         *
'****************************************************************
Device = 16F886 

Xtal = 20 
@ CONFIG_REQ
@__CONFIG _CONFIG1, DEBUG_OFF & LVP_OFF & FCMEN_OFF & IESO_OFF & BOR_OFF & CPD_OFF & CP_OFF & MCLRE_ON & PWRTE_ON & WDT_OFF  & HS_OSC
@__CONFIG _CONFIG2, WRT_OFF & BOR21V
Declare Hserial_Baud = 38400

All_Digital = On
TRISB = %00001000

; HACEMOS ALIAS DE LOS PINS CON RESPECTO A LAS SEÑALES DEL 74HC595
Symbol SERO PORTB.0  ; serial output que va al 74HC595
Symbol SRCK PORTB.1 ; shift clock
Symbol RCK PORTB.2  ; output latch   y/o paralell load
Symbol SERI PORTB.3 ; serial input que viene del 74HC165

Dim PUERTOA As Byte  ;DECLARAMOS VARIABLES QUE se usaran para cada PUERTO
Dim PUERTOB As Byte
Dim PUERTOC As Byte
Dim DATOA As Byte
Dim DATOB As Byte
Dim DATOC As Byte


inicio:


SHOut SERO, SRCK, MsbFirst, [PUERTOA, PUERTOB, PUERTOC]  ;se mandan los datos de manera serial a los 74HC595

PulsOut RCK,8 ; se envia el pulso para activar el latch del 74hc595 y a la ves OBTENER los datos del 74HC165

SHIn SERI, SRCK, MsbPre,[DATOA, DATOB, DATOC]; se reciben los datos de manera serial de los 74HC165

PUERTOA=DATOA
PUERTOB=DATOB
PUERTOC=DATOC

HSerOut ["Dato A=",Dec3 DATOA," Dato B=",Dec3 DATOB," Dato C=",Dec3 DATOC, 13,0]

    DelayMS 250; hacemos una pausa solo para efecto de demostracion del presente programa, pero no es necesario

GoTo inicio
 

Adjuntos

  • expansor.rar
    65.4 KB · Visitas: 33
  • expansor.jpg
    expansor.jpg
    77.7 KB · Visitas: 174
Última edición:
Buenas miborbolla:

Una pasada lo que hiciste, y también uso el PIC16F886 como puedes ver aquí desde hace un tiempito, eso si, lo programa en asm, lo que ahora estoy con Arduino y cuando acabe todo, me meto con los PIC que no lo quiero abandonar ni el asm tampoco. ;)

Ver el archivo adjunto 127925
Por cierto, buen esquema.
1) ¿Entonces son 4 pines obligados?

2) ¿Haz montado este circuito real en la protoboard? Lo pregunto porque en mi caso tiene efectos de antirebotes y no puedo solucionarlo excepto que meta un flip flop como este.

el%20pic17.gif


También hay que usar disparador de Scmitch.
schmitt_trigger_levels.png

Como el 74HC04 que es el que tengo, lo malo que me invierta la poladirad y no me hace gracia. también se puede hacer un PIC por medio y que tenga antirrebotes.

Voy a analizarlo.

Saludos.
 
Sí que lo he probado y sin los rebotes que comentas; en puertos paralelos, en pics, atmel y no recuerdo en que otras plataformas, se han fabricado varios diseños de circuitos impresos y todos con 4 lineas de control, francamente nunca he considerado reducir mas; hemos puesto en cascada hasta 8 bancos logrando 64 bits de I/O.

La clásica consideración de todo circuito TTL colocando su capacitor de desacople por cada circuito integrado lo mas cerca de sus pines de alimentación y no mas. En los proyectos donde he utilizado este sistema es en ambientes semi-industriales y anexamos optoacopladores para el asunto de aislar electricamente el circuito y quizás sea la razón de que no se presenten los rebotes a los que te refieres..

No tengo mas que comentar, solo dejarles un cordial saludo.
 
Última edición:
Buenas campeón:

Si te funciona así, [Término innecesariamente vulgar] Porque el que usaba yo las tres entradas del 74HC595 era un martirio.
En cada IC de datos por lo que veo en Internet y por temas de ruidos, mejor usar un condensador de 100 nF en las entradas de alimentación.

En cuanto a las TTL, eso de poner lo que quieras, depende de la cantidad de energía que te pueda ofrecer la fuente de alimentación, que no es lo mismo 1A. que 5A. ;)

Una duda que tengo.
Si tengo diez 74HC595 en un PIC16F886, si quiero usar el bit 5 del tercer 595 de los 10 que hay. ¿Qué hay que hacer?

Siempre me ha llamado la atención. Con el protocolo I2C si lo entiendo y en ASM, pero esto del SPI dicen que es más fácil, por cierto, si lo es, pero no me entero.



Sigo haciendo pruebas.
 
Última edición por un moderador:
Atrás
Arriba