h1

Un registro SIPO para el rey

2 junio 2009

Nuestro rey posee catorce puertos de entrada/salida digitales que pueden ser más que suficientes para muchas aplicaciones, pero ¿y si necesitamos más? Supongamos por ejemplo que tenemos las entradas analógicas ocupadas y deseamos controlar una matriz de leds de 8×8, para lo cual necesitamos 16 puertos, o que sólo tenemos dos puertos libres y necesitamos un contador binario de 8 bits. En ambos casos nos veríamos ante dos alternativas: adquirir el Ardiuno Mega, con 54 puertos digitales, o utilizar hardware adicional. En mi caso, como poseo el Duemilanove y poco presupuesto, voy a optar por la segunda de dichas alternativas para obtener el contador binario de 8 bits.

Una de las opciones es emplear un dispositivo que permita leer datos en serie y pueda mostrarlos en paralelo. Nos referimos a un registro Serial In – Parallel Out o SIPO. Uno de estos dispositivos es el circuito integrado 74164, un SIPO de 8 bits , cuyo símbolo puede observarse en la siguiente imagen. Las patillas 7 y 8, que no aparecen en el mismo, son las de alimentación, GND y Vcc, 0 V y 5 V, respectivamente.

74164NEl funcionamiento y sus características pueden consultarse en su hoja de datos. Seguidamente describimos las más importantes para entender su funcionamiento.

Qi (patillas 3, 4, etc.): las 8 salidas del dispositivo.

CLEAR (patilla 9): entrada de puesta a cero de todas las salidas. Al poner un nivel lógico bajo, todas las salidas Qi quedan a bajo.

S1 y S2 (patillas 1 y 2): entradas de datos. El dato que se almacena es el producto lógico, AND, de ambas.

CLOCK (patilla 8): entrada de sincronismo. A cada flanco de subida, paso del nivel bajo al alto, el producto lógico de S1 y S2 se almacena en Q0. El valor que había en Q0 se desplaza a Q1, el de éste a Q2, el de Q2 a Q3, etc., y el de Q7 se pierde.

Un resumen de todo ello se puede ver en la siguiente tabla.

tabla-74164

La siguiente imagen representa el esquema de conexión a la placa Arduino que utilizaremos.

arduinoSIPO

Observe como el pin 13 de Arduino será quien genere los impulsos de sincronismo y el 12 quien dé los datos que serán almacenados en el registro. De este modo estamos controlando con sólo dos puertos los 8 bits del registro SIPO.El funcionamiento se puede comprobar con el siguiente ejemplo.
int serialInput = 12; // a los pines 1 y 2 del SIPO
int clockInput = 13; // al pin 8 del SIPO
void setup() {
pinMode(serialInput, OUTPUT);
pinMode(clockInput, OUTPUT);
}
// ************PROGRAMA PRINCIPAL************
void loop() {
for (int k=1; k<9; k++){
digitalWrite(serialInput, HIGH);
digitalWrite(clockInput, LOW);
digitalWrite(clockInput, HIGH);
delay(150);
}
delay(500);
for (int k=1; k<9; k++){
digitalWrite(serialInput, LOW);
digitalWrite(clockInput, LOW);
digitalWrite(clockInput, HIGH);
delay(150);
}
delay(500);
}

Se trata de mandar mediante sendos bucles, ocho impulsos a intervalos de 150 ms para almacenar niveles altos y bajos. Entre ambos bucles se ha introducido un retardo de 500 ms. El resultado, como puede verse en el siguiente vídeo, proporciona un desplazamiento desde Q0, led más a la derecha, a Q7, led más a la izquierda, de niveles altos y bajos.

Para el contador binario no resulta profesional dar los impulsos de sincronismos poniendo primero a bajo y  acontinuación a alto el clockInput 8 veces cada vez que deseamos escribir un dato de 8 bits, esto es un octeto o byte. Para ello, Arduino tiene la función shiftOut() cuya sintaxis es la siguiente:

shiftOut(dataPin, clockPin, bitOrder, value)

donde:

  • dataPin: terminal que mandará los datos al registro. En nuestro caso el 12, al que hemos denominado serialInput.
  • clockPin: terminal por donde se enviarán los impulsos de sincronismo. En nuestro esquema el 13, denominado clockInput.
  • bitOrder: modo en el que se desplazarán los bits en el registro. Si primero se debe almacenar el bit más significativo, MSB, caso del 74164, hay que poner el valor MSBFIRTS. En el caso de que el primer bit que se almacena sea el menos significativo, LSB, se pondrá LSBFIRTS.
  • value: valor, de tipo byte, que se desea escribir.

El programa, sencillo, es el siguiente:

int serialInput = 12;
int clockInput = 13;
void setup() {
pinMode(serialInput, OUTPUT);
pinMode(clockInput, OUTPUT);
}
// ******************PROGRAMA PRINCIPAL******************
void loop() {
//Puesta a cero
shiftOut(serialInput, clockInput, MSBFIRST, 0x00);
delay(3000);
for (int k=0; k<256; k++){
shiftOut(serialInput, clockInput, MSBFIRST, k);
delay(150);
}
}

Y su resultado este:

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: