Expansiones I/O_74HC165

Buenos días,

Mi proyecto se trata de expandir entradas y salidas utilizando registros de desplazamiento.

Para las entradas utilizo el IC 74Hc165 y para las salidas el 74HC595.

Hasta el momento, las entradas son las que más me ha costado configurar en mi Arduino UNO dado que hay que utilizar dos entradas de reloj para controlar los registros. Basado en un ejemplo tomado de modifique un poco hasta llegar al siguiente código, cuya función es encender un led cuando se presiona uno de los botones asociados a las entradas del 74HC165. El detalle es que cuando presiono el bit 7 (pin 6 del IC 165) no hay una respuesta a la salida (led = OFF).

Aquí les dejo el código por si hay algún interesado en probar, espero les sea de utilidad.

/Encender led cuando se hay un bit de entrada/

#define DATA_WIDTH 8
#define BYTES_VAL_T unsigned int
#define PULSE_WIDTH_USEC 5 //ancho de pulso para habilitar el registro en leer y retener
//for 74HC165
int ploadPin = 8; //PL (or SH_LD) pin 1
int clockEnablePin = 9; //salida serial desde el ultimo estado
int dataPin1 = 11; //QH Salida serial para el último estado pin 9
int clockPin1 = 12; //CLK pin 2

BYTES_VAL_T pinValues;
BYTES_VAL_T oldPinValues;
BYTES_VAL_T bytesVal = 0;

int led = 13;
int switchstate = 0;
/estado Shift contiene cada uno los registros internos hacia la salida
serial QH (pin 9). Los datos en DS (pin 10) se desplazan dentro del primer registro*/

BYTES_VAL_T read_shift_regs(){
byte bitVal;// bitVal = Dato de tipo byte
BYTES_VAL_T bytesVal = 0;
//desencadenar una carga paralela para retener el estado de las líneas de datos
digitalWrite(clockEnablePin, HIGH); //no cargar datos para la salida QH'
digitalWrite(ploadPin, LOW); //habilitar entrada de datos
delayMicroseconds(PULSE_WIDTH_USEC);
digitalWrite(ploadPin, HIGH); //inhabilitar entrada de datos
digitalWrite(clockEnablePin, LOW); //shift

for(int i = 0; i < 8; i++){
bitVal = digitalRead(dataPin1);
//establecer el correspondiente bit en bytesVal
bytesVal |= (bitVal << ((DATA_WIDTH)-i));
//pulso de reloj (flanco ascendente desplaza el siguiente bit)
digitalWrite(clockPin1, HIGH); //habilitar salida para datos
delayMicroseconds(PULSE_WIDTH_USEC);
digitalWrite(clockPin1, LOW);
}
return(bytesVal);
}

void setup(){
//for 74HC595
pinMode(led, OUTPUT);
pinMode(ploadPin, OUTPUT);
pinMode(clockEnablePin, OUTPUT);
pinMode(clockPin1, OUTPUT);
pinMode(dataPin1, INPUT);
//for 74HC595
pinMode(latchPin, OUTPUT);
pinMode(clockPin2, OUTPUT);
pinMode(dataPin2, OUTPUT);

digitalWrite(clockPin1, LOW); //escuchar datos
digitalWrite(ploadPin, HIGH); //Shift*

pinValues = read_shift_regs();
}

void loop(){
int bitToSend = 0;
pinValues = read_shift_regs();
//lectura de datos
bitToSend = bitRead(pinValues, 0);
switchstate = digitalRead(pinValues); //lectura de los datos (D0-D7)
digitalWrite(led, pinValues);
}

Hola

Disculpa la groseria de no ayudarte directamente pero aquí te dejo unos enlaces que podrian ayudar.

74HC165: http://www.gammon.com.au/forum/?id=11979
74HC595: http://www.gammon.com.au/forum/?id=11518

El autor de estos es Nick Gammon, un moderador del foro en ingles.
espero que ayuden.

¡ ha y como diria nick porfavor utiliza la etiqueta codigo("#") para mostrar el codigo.!

Muchas gracias!!!

Voy a ver que se puede hacer-..... 8)

Hola

He implementado algo parecido con los mismos chips ,no entiendo cual es tu problema
pero la hoja de datos de dichos chips te muestra un diagrama de estados o sequencia donde
puedes ver las señales y como trabaja.
tambien hay una tabla de verdad, o sea la convinacion de las entradas de control incluido clock y
las salidas.
Necesito mas datos, no el codigo, para entender cual est tu problema
saludos
jmdc

Hasta la fecha he depurado algunos errores, y conectado el 74HC595 con el 74HC165 para manejar 32 bits de entrada con 32 bits de salida.

Si alguno quisiera el código, mandar un mensaje.

Saludos,

Hola a todos!

Tengo las siguientes consultas:

.- ¿Se pueden manejar los registros de desplazamiento ( 74HC595 y 74HC165v) vía I2C???

.- Necesito expandir los módulos de entrada y salida (hasta el momento tengo 32 entradas y 32 salidas con los IC ante mencioandos) a 64 entradas y 64 salidas (128). ¿Cómo podría conectar las salidas del arduino UNO para utilizar un decodificador o multiplexor que maneje los datos, las entradas de reloj y demás????

Muchas gracias por la colaboración.....

.- No, almenos directamente no.
pero deberian de existir para i2c, creo que uno es el PCF8574, como el que viene en una pantalla lcd 16x02 i2c que tengo.