Uso de dos display's de 7 segmentos con 8 bits

Hola que tal.

Tengo una gran duda sobre el microcontrolador ATMEGA328P.
¿Es posible encender dos display's de 7 segmentos con distintos
valores usando solo los puertos de B (PB7 PB6 PB5 PB4 PB3 PB2 PB1 PB0)
que estarían configurados como salidas?.

Gracias. ...
 
si se puede multiplexandolos osea de esos 8 bits si lo ocupas 7 para los 2 display y el octavo bit para encender el primer display y apagar el segundo esto es si no ocupawss el punto de cada display
 
si se puede multiplexandolos osea de esos 8 bits si lo ocupas 7 para los 2 display y el octavo bit para encender el primer display y apagar el segundo esto es si no ocupawss el punto de cada display


Excelente, tenía esa idea en la mente, pero no se como concretarla. Ese octavo bit que sería el bit de control del multiplexor como lo utilizo? Debe ser de entrada o algo parecido?
 
yo usaria 4 bits para usar un 74ls47 y los otros 4 bits para encender display 1 y display 2
asi puedo conectar 4 displays
si le conectas un multiplexor le puedes poner hasta 15 displays
 
yo usaria 4 bits para usar un 74ls47 y los otros 4 bits para encender display 1 y display 2
asi puedo conectar 4 displays
si le conectas un multiplexor le puedes poner hasta 15 displays

Esa es una excelente idea, el decodificador de salidas. Lamentablemente tengo como restricción el uso único de esos puertos y lo que seria los display's.
 
pero no tiene nada de malo

solo necesitas 1 decodificador aunque tengas 100 displays solo con 1 decodificador
bueno asi le hago si puedes usar el puerto directo pero desperdicias 7 bits y 1 para el punto decimal
 
pero no tiene nada de malo

solo necesitas 1 decodificador aunque tengas 100 displays solo con 1 decodificador
bueno asi le hago si puedes usar el puerto directo pero desperdicias 7 bits y 1 para el punto decimal

Claro entiendo tu comentario. La cantidad de combinaciones posibles con esos puertos es grande y usando demultiplexores externos, y el decodificador haría únicamente la conversión. El problema es que apenas me inicio en esto y tengo esa duda de como conectar ese octavo bit para que funcione como bit de control a pesar del desperdicio de esos 7 bits.
 
no es dificil
solo tienes que usar mascaras
como NOT OR XOR AND y NAND

es facil usar un contador para hacer el barrido de izquierda a derecha de los displays
digamos que tenemos el numero 86
dibujamos el 6 primero y despues el 8 de derecha a izquierda

digamos que tenemos 4 digitos y tenemos el numero 1234
dibujando de derecha a izquierda
dibujamos
4
3
2
1
y asi

¿como lo hacemos?

digamos que en C usamos una instruccion de escribir en el puerto

hago la aclaracion que un puerto se comporta como un registro de memoria
ejemplo de registro es un CHAR

a un CHAR lo podemos sumar, restar , multiplicar, incrementar, decrementar, rotar y enmascarar

no se como se utilize un puerto en Avr studio pero mas o menos todos los micros usan la instruccion output

digamos en el puerto B puede ser cualquier otro escribimos lo que esta en mi CHAR que mi char vale un numero

ejemplo:

char numero;

numero=34;

outputB=(numero); //el puerto B escribio 34

ahorita veremos como usar mascaras



ahora veremos algo mas complicado que ami aveces se me olvida

digamos que tenemos en un entero un numero mas grande
como un 3453

y tenemos 4 displays debemos separar cada uno de esos digitos para irlos dibujando en nuestro arreglo de displays
debemos poner
3
5
4
3
¿como los separamos?

debemos dividir y usar el reciproco de una serie de operaciones
debemos tener varias variables para hacer esas separaciones y estas separaciones debemos meterlas en un arreglo para irlas aventando al display

ejemplo

3453

lo voy separando y lo voy metiendo en un arreglo de un valor definido digamos 4 arreglos

char numero[4]

numero[0] se carga con 3
numero[1] con 4
numero[2] con 5
numero[3] con 3

y despues con un barrido vamos dibujando de a uno en uno

ojo por que esto SE COMPLICA

ejemplo


char i=16;
char num=0;
char numero[4];
unsigned int32 valor;
unsigned int16 valor2;
unsigned int16 valor3;

valor=3453; //este numerito lo meteremos puedes cambiarlo

numero[0] =valor/1000;
valor2 =valor%1000;
numero[1] =valor2/100;
valor3 =valor2%100;
numero[2] =valor3/10;
numero[3] =valor3%10;

con esto cargamos nuestro arrglo numero con nuestro valor numerico

aqui usaremos una funcion llamada ROTAR que la debes rebisar y estudiar para saber que esta pasando aqui
la funcion ROTAR nos desplaza un bit como las luces del auto fantastico
asi encendemos display por display sin nececidad de usar un multiplexor
lo cargamos con 16 por ser el bit 4 y lo desplazaremos de izquierda a derecha
su funcion sera desplazarse mientras los otros 4 bits son los que se conectan al 74ls47 para mostrar los numeros

aca esta mas ejemplificado

if(num>=4) //indica los displays que usaremos en mi caso son 4
{
num=0;
}

if(i==0) //pregunta si mi incremento rotado llego a 0 "esto es por el desborde de memoria"
{
i=16; //si fue asi se carga con 16 nuevamente
}

outputb(numero[num]|i); //usamos una mascara OR el puerto envia mi numero y el display a encender

i=i<<1; rotamos 1 bit de derecha a izquierda
num++; //num sirve para seleccionar el display a encender recuerda que son 4

delay_us(100); //retardo



¿que es lo que hace?

1.-pregunta cuando es mayor que 4 displays regresa al primer display

2.-por desborde de memoria pregunta cuando el bit es mayor que 255 pero como no hay mayor que 255 osea se vuelve 0 debe cargarse a 16

3.-envia al puerto B el digito a dibujar y el display a encender todo con una OR
es decir me respeta mi nible alto que uso para multiplexar y mi nible bajo para el display
a eso se le llama MASCARA

4.-una vez dibujado en el puerto ROTAMOS nuestro bit es decir ahora sigue el display 2 luego el 3 despues el 4 y asi

5.-incrementanos num que se encarga de escojer que estaba dentro de nuestro arreglo
nuestro arreglo recuerda que contiene los digitos a mostrar

6.- un simple retardo
 
Última edición:
Hola catoo, entiendo que tu pregunta es por el Hardware del puerto de salidas y DS. Espero que esto te sirva. Un saludo.
2DS.jpg
 
Hola catoo, entiendo que tu pregunta es por el Hardware del puerto de salidas y DS. Espero que esto te sirva. Un saludo.
https://dl.dropboxusercontent.com/u/4896326/2DS.jpg

Excelente es justo lo que comentaba, ambas respuestas funcionan. La de arriba un poco mas avanzada jeje pero el algoritmo es perfecto.
Entonces puedo llegar a la conclusión que sería imposible realizar el uso de dos display's con solo 8 bits (con esto me refiero a no usar dispositivos externos como transistores, compuertas, multuplexores, etc.)?
 
Claro. Con dos displays tienes 14 segmentos, pero sólo dispones de 8 bits. Necesitas poner algo más. Para sólo 2 displays me quedo con la solución de ViCtorA. Para seleccionar un display o el otro, sólo tienes que encender o apagar el bit 7.

Utilizando registros de desplazamiento con entrada serie y salida paralelo podrías conectar "infinitos" displays con sólo dos o tres bits.
 
si los registros de desplazamiento es casi igual a usar un puerto de 8 bits

no me refiero a que sea menos efectivo ni nada de eso
me refiero a que se comportan todos los puertos sean serie , paralelo, etc.

como un registro de 8 bits es decir un bloque de memoria RAM de 1 byte

que no es mas que un descarado CHAR o un short int

el registro como dije lo pueden multiplicar dividir ,rotar ,enmascarar ,etc.
afin de cuentas el CPU asi lo trabaja y aventarlo al exterior ya tiene su algoritmo
igual al leer un puerto , ADC , serie ,etc.

cuando leemos algo es el mismo registro de 8 bits para los que quieran impresionar a la novia
les dicen ya puedo mover bien la memoria RAM ;)

cuando en realidad movemos un CHAR :p
 
Al leer este hilo me he acordado de que hay visualizadores con un tratamiento especial para el segmento C, ya que este está siempre encendido, salvo cuando hay que representar el valor 2.
 
Atrás
Arriba