sábado, 2 de marzo de 2013

Multiplexado de entradas y salidas en microcontroladores


Cuando se necesita comunicar a un microcontrolador con el mundo exterior, se utilizan las patillas (pines) que éstos tienen al efecto. Éstos pines de E/S varían de un modelo a otro, pero normalmente varían entre una y varias decenas, siendo raro encontrarlos con más de 50 o 60 pines.  A continuación veremos cómo se conectan las señales al microcontroladora través de esos pines de entrada (todo lo dicho aquí es válido también para las salidas) y como multiplicar la cantidad de entradas de señal posibles sobre un número limitado de pines.


Conexión directa de entradas


La manera más simple de conectar señales de entrada al microcontrolador es hacerlo directamente con un pulsador (o cualquier otra clase de interruptor, codificador, captador, etc. etc.) conectado al pin correspondiente mediante una resistencia pull-down. En este gráfico se muestra su configuración:



En este caso, un microcontrolador genérico tiene dos puertos de pines de E/S, uno de ellos con los pines A, B, C y el otro con los pines 1, 2, 3. El pulsador “inyecta” una señal de nivel alto (5v) al pin A cuando es pulsado, y cuando se suelta, la resistencia pull-down de 10k se encarga de mantener el pin A en nivel bajo (0v).

Este modo de conectar señales de entrada a los pines del microcontrolador, a pesar de su sencillez, tiene el inconveniente de que sólo podremos implementar tantas entradas como pines de E/S tenga el microcontrolador. Si tenemos en cuenta que los micros necesitan frecuentemente algunos pines de E/S para otras tareas de control o comunicaciones, la cantidad disponible de pines es aún menor. 

Multiplexado matricial de pines E/S


Es posible aumentar  la cantidad de entradas al micro manteniendo los mismos pines escasos de E/S. Una de ellas es ordenar los pines en una matriz. En el micro genérico que estamos usando dispondremos los pines en una matriz de 3x3 donde las filas serán los pines A, B, C y las columnas los pines 1, 2, 3



Lo interesante de este diseño es que ahora se nos forman 9 nodos independientes a cada uno de los cuales podemos aplicar una señal que pondrá a nivel alto una fila y una columna simultáneamente. Hay que observar que las filas y las columnas no se tocan directamente, por lo que para aplicar una señal que active tanto una fila como una columna hay que proveer al circuito de un componente adicional que haga esta función. Éste componente es el diodo, y su configuración es la mostrada en el siguiente diagrama:



 Si aplicamos señal en el nodo superior izquierdo,  la fila A y la columna 1 se ponen en 5v, ya que los diodos desde el nodo hacia las líneas están polarizados directamente. Las demás líneas quedan a nivel bajo ya que, para ellas, los diodos están polarizados en inversa. Las resistencias pull-down adicionales al final de cada línea mantienen éstas a nivel bajo (0v) cuando no hay ningún nodo activo en ellas.

Los inconvenientes de éste método son dos:  por un lado, la circuitería adicional que hay que construir, ya que cada nodo requiere dos diodos. Por otro lado, ahora cada pulsador que inyecte una señal, activa dos líneas del microcontrolador, por lo que la programación de éste ha de estar diseñada para discriminar cada caso, y eso añade más código al programa del micro y lo complica un poco.

Aún así, la ventaja principal estriba en que se aumenta el número de entradas de señal que podemos comunicar al micro. El número de señales posibles en esta configuración, suponiendo que el micro tenga disponibles X pines para utilizar, es de X^2/4. Por tanto, un micro con 6 pines como el de nuestro ejemplo admite 6*6/4=9 entradas (los nueve nodos ya vistos). Uno de  8 pines admitiría 16 entradas. Uno de 16, 64 entradas, y así sucesivamente.

Multiplexado por matriz de palabra completa


En el caso anterior, cada señal de entrada activa dos pines simultáneos del microcontrolador, uno en las filas y otro en las columnas. Con ese sistema, cada vez que hay una señal de entrada, sólo dos de los pines E/S del micro están en nivel alto (5V), mientras todos los demás están en nivel bajo (0v). Ya vimos que esto permite tener más combinaciones que cantidad de pines, pero tiene una restricción fuerte: Sólo dos del total de pines del micro pueden estar en nivel alto simultáneamente.

En nuestro micro imaginario de 6 pines, eran posibles 9 entradas. Sin embargo, existen más combinaciones posibles con 6 pines (muchas más, para ser exactos). Una palabra binaria completa de 6 bits puede representar 2^6 = 64 estados diferentes, los cuales son bastantes más que los 9 anteriores. A continuación veremos cómo hacer uso de combinar TODOS los pines del micro (no solo dos a dos) y obtener una cantidad de entradas posibles verdaderamente exponencial a la cantidad de pines disponibles y que representan el límite matemático a las entradas posibles implementables en, en este caso, 6 patillas de un microcontrolador.

La configuración eléctrica en este caso es la siguiente:



En este caso, todos los pines del micro son filas, y los cables de señal no los aplicamos en los nodos, sino en los terminales de las columnas. Obsérvese que las resistencias pull-down sólo son necesarias ahora al final de las filas.

Si aplicamos señal, por ejemplo, en E3, se activan los pines A y B. Si aplicamos en E31 se activan A, B, C, 1 y 2. En E32 sólo se activa la línea 3… y así sucesivamente. Ahora podemos codificar cualquier combinación posible de seis bits (palabra completa) colocando diodos en los lugares adecuados. Y lo más interesante: siempre con un único pulsador para cada combinación.

Un microcontrolador baratito y muy común es el PIC 16f84A, que tiene dos puertos de 8 y 5 pines respectivamente. Ya, ya, son poquísimos, pero... si los usamos todos, podríamos codificar 2^13=8192 entradas diferentes, lo cual no está nada mal para un chip de medio euro. Una placa de desarrollo basada en microcontrolador como el Arduino Mega posee 53 pines digitales de E/S totalmente funcionales. ¿Saben cuantas entradas se le pueden implementar?...

Pues eso.

Domingo Piñero
dpinaranjo@hotmail.com