¿Convertidor octal a bcd en display 7 segmentos arduino UNO?

#1
Estoy aprendiendo arduino pero no sé me ocurre como hacer este programa.

Con un dip switch tengo que insertar un número en octal de 4 bits y se vean en un display de 7 segmentos.

Sé que necesito el circuito 74lS48 para la codificación del bcd, pero con un segundo display no sé si se conectan igual que como uno de binario a bcd.

¿Acaso hay forma de evitar el circuito con el código fuente?
 
#2
La idea de usar arduino es no usar integrados. Si necesitas 4+7=11pines y el arduino tiene de sobra...
 
#3
si solo fuera para un display lo entiendo, pero para números mayores a 7, se necesitan dos displays, en circutos lógicos vi como usar otro integrado para hacer el segundo digito, aqui me harian falta salidas porque se ve muy feo usar swtich/ if else para cada numero
 

Dr. Zoidberg

Well-known-Papá Pitufo
#5
Joder hombre!!!
Con los dip-switch pones (por ejemplo): 1010 (binario) --> tomás de a 3 y pasa a octal --> 001 010 --> 12 en octal
bien hasta ahí????
Bueno, los números octales y BCD son los mismos, solo que se usan del 0 al 7, bien hasta ahí???
Pues bueno, entonces le agregamos un 0 adelante a cada conjunto de 3 bits, y queda:
0001 0010... listo, problema solucionado: mando cada grupo de 4 bits a un decodificador BCD a 7-segmentos.. que si los empaqueto bien y pongo en cero el bit mas significativo del decodificador, ni siquiera tengo que agregar los 0-por-delante en el código.

Veamos un proyecto de código en C:
Código:
char dipSw, unOctal, dosOctal, resultado;

dipSw = funcion_que_lee_el_puerto_de_los_dipSwitches();

/* Supongamos que ahora los 4 bits menos significativos son los bits 0..3 de los dip switches
hay que separar los ultimos 3 y el cuarto... los demas valen 0 */
unOctal = dipSw & 0x07;   /* ahí va los tres ultimos */
dosOctal = (dipSw & 0x08) << 1; /* ahi va el cuarto bit solo pasado al nibble alto*/

/* ahora armamos los 8 bits para enviar a los decoders, por que los 0's ya estan puestos */
resultado = dosOctal | unOctal;

/* y lo mandamos al puerto donde estan los decoders conectados */
funcion_que_escribe_en_el_puerto_de_los_decoders( resultado );
.
Fácil ehhhh?????
Si suponés que los 4 bits de entrada de cada decoder están conectados EN ORDEN a los bits 0..3 y 4..7 del puerto, deberías ver perfectamente el resultado "octal codificado en numeritos BCD".

Se puede hacer mas corto, pero como no conozco cuanto sabés, dejalo así nomás...
 
#6
¡¡Que manía de pagar!!

¿Para que quieres un decodificador de 7 segmentos sobrando pines?Cuando no queden pines hablamos del decodificador.

Incluso sin multiplexar hay pines
 
#8
Yo no lo quiero!!!! El que lo quiere es quien hizo la pregunta, y si es feliz así.... todo OK!!!!
Mmmm. Pues no sé, es confuso lo que quiere:

¿Cómo hacer un convertidor octal a bcd en display de 7 segmentos arduino UNO?
El BCD es una cosa y el 7 segmentos otra, así que o quiere una o la otra.
Si hubiese puesto "en BCD y en display de..." pero no existe el bcd_en_display_de_7_segmentos, existe el BCD y el 7 segmentos.

Estoy aprendiendo arduino pero no sé me ocurre como hacer este programa.
Muy bien, no hay dudas

Con un dip switch tengo que insertar un número en octal de 4 bits y se vean en un display de 7 segmentos.
¿Y en BCD?¿O el BCD ya no?

Sé que necesito el circuito 74lS48 para la codificación del bcd, pero con un segundo display no sé si se conectan igual que como uno de binario a bcd.
No necesariamente

¿Acaso hay forma de evitar el circuito con el código fuente?
Propongo ahorrar los dos desde el principio



Por cierto el cuarto dipswich enciende siempre el uno en el segundo display así que no hace falta decodificador ni arduino, solo conectar esos dos segmentos
Los otros tres son tal cual en bcd así que decodificador O arduino, los dos... por practicar solamente
 
Última edición:
#9
Corrijo, el profesor no se explicó bien, es un número binario en 4 bits, para pasarlo a octal en display en bcd,

Lo vi con circuitos sin programa (ttl) con binario, el cual era sumarle 6 a los números mayores a 9, aquí sería sumarle 3 a los números mayores a 7 por cada múltiplo de 7 que alcance el número, lo del multiplexor, no tengo mucha idea, de arduino apenas empecé y de programación en c no lo vi para circuitos, esa parte lo medio vi en vhdl.

Esto es lo que llevo en código con 3 bits:

Código:
//programa diseñado para pasar un numero binario a octal y representarlo en octal en bcd de 7 segmentos

const int   a=2,b=3,c=4,d=5,e=6,f=7,g=8;
int E1=0,E2=0,E3=0,E4=0;

void setup() 
{
  Serial.begin(9600);
  
  pinMode(a,OUTPUT);  pinMode(b,OUTPUT);  pinMode(c,OUTPUT);
  pinMode(d,OUTPUT);  pinMode(e,OUTPUT);  pinMode(f,OUTPUT);
  pinMode(g,OUTPUT);
  
  pinMode(9,INPUT);   pinMode(10,INPUT);
  pinMode(11,INPUT);  pinMode(12,INPUT);
}

void loop() 
{
  //aquí solo tengo la lectura de las entradas
  E1=digitalRead(9);    
  E2=digitalRead(10);  
  E3=digitalRead(11);  
  E4=digitalRead(12);  

  /*Esto seria si solo es con 3 bits.
 // 0
  if (E1==0 && E2==0 &&E3==0)
  {
    digitalWrite(a,HIGH);digitalWrite(b,HIGH);digitalWrite(c,HIGH);
    digitalWrite(d,HIGH);digitalWrite(e,HIGH);digitalWrite(f,HIGH);
    digitalWrite(g,LOW);delay(500);
  }
  
  //1
  if (E1==0 && E2==0 &&E3==1)
  {
    digitalWrite(a,LOW);digitalWrite(b,HIGH);digitalWrite(c,HIGH);
    digitalWrite(d,LOW);digitalWrite(e,LOW);digitalWrite(f,LOW);
    digitalWrite(g,LOW);delay(500);
  }
  
  //2
  if (E1==0 && E2==1 &&E3==0)
  {
    digitalWrite(a,HIGH);digitalWrite(b,HIGH);digitalWrite(c,LOW);
    digitalWrite(d,HIGH);digitalWrite(e,HIGH);digitalWrite(f,LOW);
    digitalWrite(g,HIGH);delay(500);
  }
  
  //3
  if (E1==0 && E2==1 &&E3==1)
  {
    digitalWrite(a,HIGH);digitalWrite(b,HIGH);digitalWrite(c,HIGH);
    digitalWrite(d,HIGH);digitalWrite(e,LOW);digitalWrite(f,LOW);
    digitalWrite(g,HIGH);delay(500);
  }
  
  //4
  if (E1==1 && E2==0 &&E3==0)
  {
    digitalWrite(a,LOW);digitalWrite(b,HIGH);digitalWrite(c,HIGH);
    digitalWrite(d,LOW);digitalWrite(e,LOW);digitalWrite(f,HIGH);
    digitalWrite(g,HIGH);delay(500);
  }
  
  //5
  if (E1==1 && E2==0 &&E3==1)
  {
    digitalWrite(a,HIGH);digitalWrite(b,LOW);digitalWrite(c,HIGH);
    digitalWrite(d,HIGH);digitalWrite(e,LOW);digitalWrite(f,HIGH);
    digitalWrite(g,HIGH);delay(500);
  }

  
  //6
  if (E1==1 && E2==1 &&E3==0)
  {
    digitalWrite(a,HIGH);digitalWrite(b,LOW);digitalWrite(c,HIGH);
    digitalWrite(d,HIGH);digitalWrite(e,HIGH);digitalWrite(f,HIGH);
    digitalWrite(g,HIGH);delay(500);
  }
  //7
  if (E1==1 && E2==1 &&E3==1)
  {
    digitalWrite(a,HIGH);digitalWrite(b,HIGH);digitalWrite(c,HIGH);
    digitalWrite(d,LOW);digitalWrite(e,LOW);digitalWrite(f,LOW);
    digitalWrite(g,HIGH);delay(500);
  }
  */
}
 
Última edición por un moderador:
#10
La frase octal en BCD es inconsistente.
Octal es octal: 0,1,2...7
Equivale a tres bits binarios: del 000 al 111
BCD es decimal codificado en binario. Si es decimal no es octal. Es como decir las docenas decimales, o son docenas o son decimales.

Para el segundo display no hace falta ni arduino ni circuito ninguno: el microswich enciende el 1 del display y ya está, un cable y una resistencia o dos.

Si lo quieres en código para gastar dos pines
If(swich3==1){
Poner el pin a 1
}
Else
{
Poner el pin a 0
}

O mejor:
Digitalwrite(Pindesalida,digitalread(pindeentrada));
 
Última edición:

Dr. Zoidberg

Well-known-Papá Pitufo
#11
La frase octal en BCD es inconsistente.
Octal es octal: 0,1,2...7
Equivale a tres bits binarios: del 000 al 111
BCD es decimal codificado en binario. Si es decimal no es octal. Es como decir las docenas decimales, o son docenas o son decimales.
@Scooter:
Entre que "el profe no se explica bien" ;) y que este flaco tiene poca idea de lo que es octal y lo que es BCD, vamos a terminar jugando a las adivinanzas.


@RAIGA:
Para pasar de BINARIO a OCTAL solo tenés que partir el binario en grupos de 3 bits...Y LISTO!!! No hay que sumar ni restar nada, y te quedan numeros de tres bits entre 0 y 7. Como el BCD ocupa 4 bits, solo hay que agregar un CERO a la izquierda del bit mas significativo de cada grupo de 3 bits y ya queda un numero de 4 bits con valor entre 0 y 7.
Como ese valor NO ES MAYOR QUE 9, no hay que sumar ni restar NADA, así que lo mandas a los decoders y ellos te lo muestran en octal-BCD-lo que se sea que se llame eso.
El ejercicio es una estupidez mayúscula, y de todas formas - afortunadamente - las normas nos impiden hacer tu trabajo de la escuela, así que andá, estudiá y consultá con tu profesor si no entendés lo que pide.
Hasta aquí llego.
 
#13
es lo que digo, representar un numero de 4 bits binarios en sistema octal en displays
siendo el 8 el numero 1 en display "1" y "0" en el display 2
 
#15
No entiendo porque das tantas vueltas.

Es simple, no precisas cálculos matemáticos ni nada ya que no vas a tener arrastre en ningún caso.
El Dr. te explico paso a paso como hacerlo en el #11, y si todavia no lo entendés podes practicar con la Calc.

Por otra parte, si eso se te complica, podrias optar por la siguiente solución alternativa, que no es la mas correcta en esta situación pero que funciona tambien.

Hay que leer el puerto de entrada, pasar el dato por una LUT y mover el dato de la LUT al/a los puerto/s de salida derecho al/a los display/s.
 
Última edición:
#16
La lo hice, extendí los pines de salida digital con los analógicos, el multiplexor lo usaré cuando me quede sin pines.

Estudiaré lo del comentario #11, gracias.
Pueden cerrar el tema
 

Temas similares

Arriba