Multiplexación con ATMEGA32A


¿Que es?

La multiplexación consiste en comunicar múltiples señales a través de un mismo canal y leer cada una de ellas por separado. Es ampliamente usado para control de dispositivos tales como teclados matriciales, displays y matrices de LED.


Las principales ventajas de la multiplexación es que permite simplificar y reducir la cantidad de conexiones físicas, así como de optimizar los procesos para enviar y recibir información.

El proceso para controlar matrices (ya sean teclados o displays) consiste


Multiplexación de dos displays usando un solo puerto

Supongamos que deseamos controlar dos displays de 7 segmentos. Una manera de realizarlo es conectar cada segmento a un puerto de la siguiente manera:


Esta conexión presenta tres problemas; el primero es que cada segmento requiere una conexión física a un pin, el segundo es que cada segmento de los displays consume entre 15 y 20 mA, por lo que estaríamos requiriendo una corriente de entre 210 y 280 mA para encender todos los segmentos con lo cual se estaría llegando al límite de corriente máxima que el microcontrolador puede entregar (200 mA). Finalmente, si siguiéramos la misma configuración podríamos controlar un máximo de 4 displays, además de que ya no tendríamos pines disponibles para implementar otras funciones.

Los problemas mencionados se pueden solucionar si en lugar de usar un puerto para controlar cada display por separado usamos un puerto que controle los segmentos que deseamos encender y un puerto que controle cual display estará encendido. Nuestro circuito entonces sería así:


Los segmentos de los displays deben estar conectados entre sí (Es decir, el segmento A del primer display debe estar conectado al segmento A del segundo display, el segmento B del primer display debe estar conectado al segmento B del segundo display, sucesivamente con todos los segmentos). Los comunes de cada display deben ir conectados independientemente a un pin que controlará cuando se enciende y cuando se apagan.

En este caso se están usando display cátodo común, por lo que se activarán con bajos.

La multiplexación consistirá en enviar un dato (la combinación de bits de los segmentos para mostrar un número o letra) a través de los puertos del microcontrolador. Este dato llegará a ambos displays ya que sus segmentos están conectados entre sí. Entonces, si el mismo dato está llegando a ambos displays, ¿Cómo debemos manipular el circuito para que cada display muestre un dato distinto?

Aquí es en donde entra en juego el puerto de control de los segmentos comunes. Supongamos que queremos mostrar el número 59. Para esto, primero enviaríamos la combinación de bits para formar el número 5, pero si ambos displays están activados, entonces mostraría el numero 55. Para evitar esto, solamente activamos el display en el que deseamos mostrar el número. Entonces, el proceso sería el siguiente:



Enviamos los datos de combinación de segmentos para formar el número 5. Enseguida, al común del primer display enviamos un bajo y al común del segundo display enviamos un nivel alto. Esto hará que solo el primer display encienda y muestre el número 5.


Ahora enviamos la combinación de segmentos para formar el 9. Enseguida, enviamos un alto al primer display y un bajo al segundo display. Esto hará que solo el segundo display encienda y muestre el número 9.

De esta manera nuestros displays mostrarán de manera intermitente el número 5 y 9. Ahora bien, ¿Cómo mostramos ambos números a la vez? Esto se logra haciendo que ambos displays se enciendan y apaguen a tal velocidad que sea imperceptible para el ojo humano que hay un parpadeo. En su lugar se verán ambos números sólidos a la vez dando la ilusión de que ambos displays están encendidos a la vez.


Implementación en código


El siguiente código usa multiplexación para controlar dos displays e implementar un contador descendente del 59 al 00:


#include <avr/io.h> // Librerías básicas para manipular el microcontrolador

#include <stdio.h>

#include <util/delay.h>


int combinacion [10] ={0b0111111, 0b0000110, 0b1011011, 0b1001111, 0b1100110, 0b1101101, 0b1111101, 0b0000111, 0b1111111, 0b1100111}; // Combinaciones de bits para mostrar los números del 0 al 9 en los segmentos


#define GNDU PORTD0 // Macro para definir al puerto D0 como el común del primer display

#define GNDD PORTD1 // Macro para definir al puerto D0 como el común del primer display



int main(void)

{

DDRB = 0xFF; //Declaracion del puerto B como salida

DDRD = 0xFF; //Declaracion del puerto D como salida


while (1) // Bucle

{

for(int x=5;x>=0;x--){// For que decrementará de 5 a 0 para el primer display

for(int y=9;y>=0;y--){ // For que decrementará de 9 a 0 para el segundo display

for(int z=0;z<125;z++){ // El ciclo se ejecutará 125 veces, mostrando los números en los displays por 1 sgundo

PORTB = combinacion[y]; // Envío de combinación para el primer display

PORTD = !(1<<GNDU)|(1<<GNDD); // Envía un bajo al primer display, envía un alto al segundo display

_delay_ms(2); // Espera 2 ms

PORTB = combinacion[x]; // Envío de combinación para el segundo display

PORTD = (1<<GNDU)|!(1<<GNDD); // Envía un alto al primer display, envía un bajo al segundo display

_delay_ms(2); // Espera 2 ms

}

}

}

}

}



8 visualizaciones0 comentarios

Entradas Recientes

Ver todo