Você está na página 1de 2

10/2/2015

Ampliacion de I/O para PIC

Ampliacin de Entradas/Salidas para PIC


El PIC con el que estoy aprendiendo es un PIC16F876A que est un poco limitado en cuanto a entradas y salidas. Con
este diseo se puede ampliar todo lo que se quiera, siempre que se tenga memoria para almacenar los datos y tiempo de
ciclo para leerlos.
El circuito ya lo he utilizado antes con otros micros, su fiabilidad est fuera de toda duda. Se trata de un conjunto de registros
paralelo/serie para leer datos y otro de serie/paralelo para escribir datos. Estos registros de desplazamiento son CMOS serie B
convencionales, muy baratos. Para conectarlo al PIC bastan 5 pines libres, aunque hay otras configuraciones que usan ms. En
este ejemplo he usado 4 CD4014 para las entradas y 4 CD4094 para las salidas, que proporcionan un total de 64 bits de entrada y
otros 64 de salida. Sera como tener un PIC de ms de 128 patas...
Este es el esquema en PNG del circuito:

El funcionamiento es el siguiente: para leer los datos primero se pone a nivel alto la seal LOAD_CD4014 y a continuacin se
aplica un pulso alto a CLK_CD4014, despues se pone a nivel bajo LOAD_CD4014. Con esta operacin hemos hecho que los
registros CD4014 memoricen en sus latch internos los datos que haba presentes en sus entradas paralelas P1 a P8. Tras este
primer pulso el estado de DATO_CD4014 es el estado de P8 del primer CD4014. Ahora vamos aplicando pulsos altos a
CLK_CD4014 con LOAD_CD4014 a nivel bajo. De esta forma, a cada pulso, los CD4014 desplazan sus datos de Pn a Pn+1. Al
primer pulso sale por DATO_CD4014 el dato ledo de P7, despus P6 etc. Por la entrada SI de cada CD4014 introducimos el
dato saliente Q8 del CD4014 siguiente en la cadena. Los datos atraviesan en serie los registros que tienen a su derecha hasta
llegar al PIC, donde el programa los va agrupando de nuevo en bytes, en mi programa uso el array
"DatosCD4014[NumeroCD4014]".
Este es un ejemplo de como hacerlo:
// Primero carga TODOS los datos en paralelo en los registros
output_high(LOAD_CD4014); // LOAD activo
output_high(CLK_CD4014); // CLK activo, carga los datos en paralelo
output_low(CLK_CD4014); // CLK inactivo
output_low(LOAD_CD4014); // LOAD inactivo
// Ahora vamos leyendo en serie en grupos de 8 bits N veces
http://www.arrakis.es/~helitp/ampliacion/ampliacion.htm

1/2

10/2/2015

Ampliacion de I/O para PIC

for (bytes = 0; bytes < NumeroCD4014; bytes++)


{
data = 0;
for (bits = 0; bits < 8; bits++)
{
data <<=1;
if (input (DATA_CD4014)) data|=0x01;
output_high(CLK_CD4014); // CLK activo, desplaza
output_low(CLK_CD4014); // CLK inactivo
}
DatosCD4014[bytes] = data; // Copiamos el dato compuesto al array
}
Las salidas funcionan de forma parecida: Se pone en DATO_CD4094 el dato que queremos enviar al ultimo bit de los CD4094.
Se aplica un pulso alto en CLK_CD4094 y este dato pasa al registro interno Q1, el dato que haba en Q1 a Q2 etc. El dato que
haba en QS se enva al siguiente CD4094. De esta forma tras 64 pulsos (en este caso de 4 registros) el primer dato introducido
ha llegado hasta Q8 del ltimo CD4094. Sin embargo los datos no estn presentes en las salidas, que permanecen fijas con los
ltimos datos cargados, se encuentran en unos registros internos. Al aplicar un pulso alto en LOAD_CD4094 estos datos pasan de
los registros internos a los registros de salida y aparecen, todos a la vez, en las patas Q8 a Q1 de los CD4094 para ser usados.
Esto puede hacerse as:
for (bytes = NumeroCD4094; bytes > 0; )
{
data = DatosCD4094[--bytes]; // Pre-decremento, la cuenta comienza en NumeroCD4094-1
for (bits = 0; bits < 8; bits++)
{
if (data & 0x80) output_high(DATA_CD4094);
else output_low(DATA_CD4094);
output_high(CLK_CD4094); // CLK activo, desplaza
output_low(CLK_CD4094); // CLK inactivo
data <<=1;
}
}
// Ahora transfiero los datos enviados a las salidas
output_high(LOAD_CD4094); // LOAD activo
output_low(LOAD_CD4094); // LOAD inactivo
Otra ventaja de este sistema es que es fcilmente ampliable, basta con aadir ms registros a la cadena. Por ejemplo pueden
unirse varios como el del diseo de arriba conectando SL10 de uno con SL9 de otro, amplindolo as en grupos de 64+64
entradas/salidas.
Este es el esquema con Eagle 4,15 del circuito anterior, por si alguien quiere construirlo.
Este es un programa en C (compilable con CCS 3.236) para PIC16F876A que muestra como funciona el circuito del ejemplo y
contiene las funciones de lectura y escritura de los registros CD40x4 en el fichero "shift_io.c". Est bastante comentado como
para comprender su funcionamiento. Para utilizarlo en otras aplicaciones solo hay que poner en "hardware.h" y en "shift_io.h" los
valores adecuados segn nuestro hardware e incluir en el programa principal #include "shift_io.c".
Evidentemente aunque aqu he propuesto utilizarlo con PIC puede utilizarse con cualquier otro micro. Yo lo ha utilizado en
muchos proyectos con i8051, con unos resultados muy buenos. Ya solo queda disear la parte de potencia para las salidas
CD4094 y la parte de adaptacin de seales de entrada para CD4014, si queremos conectarlo a circuitos NO CMOS...
Inicio.
mailto:helitp@arrakis.es

http://www.arrakis.es/~helitp/ampliacion/ampliacion.htm

2/2

Você também pode gostar