Decodificador BCD a Decimal (Especial)

Buenas tardes, soy de Uruguay y es la primera vez que escribo por aca, un saludo para todos.

Estoy desarrolando un decodificador bcd a decimal, son 4 bits de entradas, y pretendo usar un pin para cada salida que correspondera al decimal de entrada.

Lo de "especial", tengo una 5ta y 6ta entrada que haran que, cuando estas esten en alto, tres combinaciones de entrada se correspondan a una misma salida, cada entrada de estas, maneja tres combinaciones cada una, y nunca se intercambiarian entre si, y a su vez, son totalmente independientes entre ellas.

Lo que sigue aqui abajo, es lo que he logrado hasta ahora, que no se porque, no funciona como quiero...

La tabla de verdad de lo que pretendo:

Espero puedan darme una mano.

Gracias.

Esto ya se hizo. Lo que me hace pensar que es una tarea de colegio o universidad.
Búscala en este foro que esta resuelta.
busca 3_BAND

Hola Surbyte, esto NO es una tarea de colegio, es un proyecto de quien escribe.

SI lo publique en otro foro.

Bueno, alguien vino con el mismo tema y me arriesgo a decir que la tabla o imagen que muestras era la misma.

Bueno, me equivoqué de foro aunque creo que aquí tmb está.
hice la búsqueda por ti, Manejo de salida con multiples lineas
Ahora entenderás cuando digo que es la misma tabla y resulta curioso no?

Bueno, esa tabla la hice yo, distinto nickname.

Y que pasó con ese código porque recuerdo haberlo seguido en el otro foro, pero no se que pasó.

Pues yo debo estar un poco espeso, pero tras seis post, sigo sin entender qué se está intentando hacer. Este párrafo:

Lo de "especial", tengo una 5ta y 6ta entrada que haran que, cuando estas esten en alto, tres combinaciones de entrada se correspondan a una misma salida, cada entrada de estas, maneja tres combinaciones cada una, y nunca se intercambiarian entre si, y a su vez, son totalmente independientes entre ellas.

Me tiene aún perplejo. :confused: :confused: :confused: :confused:
¿Algún egiptólogo que me lo pudiera traducir, por favor? :slight_smile:

noter:
Pues yo debo estar un poco espeso, pero tras seis post, sigo sin entender qué se está intentando hacer. Este párrafo:Me tiene aún perplejo. :confused: :confused: :confused: :confused:
¿Algún egiptólogo que me lo pudiera traducir, por favor? :slight_smile:

Hola, alli en el primer post esta la tabla de verdad que explica lo quw quiero hacer,

Pretendo hacer un decodificador bcd de 4 bits, que tendra dos entradas mas, que harán que cuando una este en alto,

Los números binarios 4 6 y 8 me decodifique el 4,

y cuando la otra este en alto, los números binarios 5 7 9, me los decodifique como 5.

Pero no quedó resuelto? Ninguna de las soluciones propuestas en el otro foro te acercó a tu solución?

Sigo sin entender mucho, pero a ver si esto hace algo similar a lo que buscas.

const int DATA_BCD[] = {8, 9, 10, 11};
const int WARC = 12;
const int BAND = 13;
//-----------------------------
const int SALIDA[]  = {A4, A5, 0, 1, 2, 3, 4, 5, 6, 7};



void setup() 
{
      for (int i=0; i<4; i++) {
            pinMode(DATA_BCD[i], INPUT);
      }
      pinMode (WARC, INPUT);
      pinMode (BAND, INPUT);
      for (int i=0; i<10; i++) {
            pinMode(SALIDA[i], OUTPUT);
      }      
}

void loop() 
{
      // leemos entradas
      int miValor = leevalor();

      // aquí irían los if para las transformaciones especiales de miValor
      
      // Encendemos el pin correspondiente al valor
      sacaValor(miValor);
}

int leevalor()
{
      int valorLeido=0;
      for(int i=0; i<4; i++) {
            if (digitalRead(DATA_BCD[i])) {
                  i += (1<<i);
            }
      }
      return(valorLeido);
}

void sacaValor(int valor)
{
      for (int i=0; i<10; i++) {
            if (i==valor){
                  digitalWrite(i, HIGH);
            } else {
                  digitalWrite(i, LOW);
            }
      }
}

noter:
Sigo sin entender mucho, pero a ver si esto hace algo similar a lo que buscas

Hola, gracias por responder,

Quiero hacer un decodificador bcd a decimal!

Cada valor decimal obtenido, se correspondera a una salida, que se pondran en alto con cada combinación de entrada.

Lo unico diferente, son esas dos entradas (interruptores) que estando activados, uno de ellos hara que cuando la combinación de entrada sean 4 6 8 (binario) la salida activa sera la 4, y cuando el otro interruptor este activado y las entradas sean 5 7 9, la salida activa sera la 5,

Con ambos interruptores apagados, el decodificador funcióna normalmente.

Si me dicen como pegar el codigo, se los comparto.

surbyte:
Pero no quedó resuelto? Ninguna de las soluciones propuestas en el otro foro te acercó a tu solución?

Ya que no respondes, te lo vuelvo a preguntar.
Hay mucha información y hasta código hecho en la referncia que te mencioné como para empezar desde 0 otra vez.

surbyte:
Ya que no respondes, te lo vuelvo a preguntar.
Hay mucha información y hasta código hecho en la referncia que te mencioné como para empezar desde 0 otra vez.

Hola, no, no quedo resuelto y no pude encontrar el error.

Aqui se ve:

¿Probaste el código que te propuse? Creo que como base debería servir a tus propósitos. Le faltarían dos condicionales para lo que acabas de decir.

void loop()
{
      // leemos entradas
      int miValor = leevalor();

      // aquí irían los if para las transformaciones especiales de miValor
      if (warc && (miValor==6||miValor==8)) { 
            miValor=4;
      }
      if (band && (miValor==7||miValor==9)) { 
            miValor=5;
      }
      
      // Encendemos el pin correspondiente al valor
      sacaValor(miValor);
}

Bueno, anoche pensaba como resolver esto de modo elegante y creo haberlo resuelto.
Como no vi hasta ahora algo respecto el manejo MANUAL AUTOMATICO, esta funcionando en modo AUTOMATICO.
Me queda claro que es un selector de Antes de HF de 160metros a 6 metros, pero bueno, en lo personal me gusta saber para que es, pero eso ocurre por mi nivel de curiosidad.
Aca mi solución, presta atención a la selección de piens utilizados.
En lo personal yo usaria uno o dos 74595s para ahorrar pines, y si quieres agregar un LCD por ejemplo, y un teclado para uso manual.
Por ahora chequea esto.

//                     BCDA BCDB BCDC BCDD WARC  BAND
const byte Entradas[6] = {   8,   9,  10,  11,  12,   13};
//-----------------------------
//                        160m 80m 40m 30m 20m 17m 15m 12m 10m  6m
const byte Salidas[10] = { A5, A4,  A3, A2, 2,  3,  4,  5,  6,  7};
const byte matrix[10][10] = {
                     {  1,  0,   0,  0,  0,  0,  0,  0,  0,  0},   // 0
                     {  0,  1,   0,  0,  0,  0,  0,  0,  0,  0},   // 1
                     {  0,  0,   1,  0,  0,  0,  0,  0,  0,  0},   // 2
                     {  0,  0,   0,  1,  0,  0,  0,  0,  0,  0},   // 3
                     {  0,  0,   0,  0,  1,  0,  0,  0,  0,  0},   // 4
                     {  0,  0,   0,  0,  0,  1,  0,  0,  0,  0},   // 5
                     {  0,  0,   0,  0,  0,  0,  1,  0,  0,  0},   // 6
                     {  0,  0,   0,  0,  0,  0,  0,  1,  0,  0},   // 7
                     {  0,  0,   0,  0,  0,  0,  0,  0,  1,  0},   // 8
                     {  0,  0,   0,  0,  0,  0,  0,  0,  0,  1}};   // 9

//-------------------------------
int valorBCD, valorBCDAnt=0;
//----------------------------
void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  for (int i=0; i<6; i++) {
      pinMode(Entradas[i], INPUT);
  }
//-------------------------------
  for (int i=0; i<10; i++) {
      pinMode(Salidas[i], OUTPUT);
  }  
}


void loop(){
  
  valorBCD = LeerBCDDecimal();
  if (valorBCD != valorBCDAnt)
      Serial.println(valorBCD);
  valorBCDAnt = valorBCD;
  for (int i=0; i<=10; i++) {
      if (i== valorBCD) 
        digitalWrite(Salidas[i], HIGH);
      else 
        digitalWrite(Salidas[i], LOW);
  }
          
}

int LeerBCDDecimal(){
  
   int ValorDecimal;

   byte datA = digitalRead(Entradas[0]);
   byte datB = digitalRead(Entradas[1]);
   byte datC = digitalRead(Entradas[2]);
   byte datD = digitalRead(Entradas[3]);

   ValorDecimal = (datD << 3) + (datC <<2) + (datB << 1) + datA;
   byte WARC = digitalRead(Entradas[4]);
   byte BAND = digitalRead(Entradas[5]);


   if (WARC && BAND) {
     switch (ValorDecimal) {
         case 4:
         case 6:
         case 8:
                 ValorDecimal = 7;   // revisar
                 break;
         case 5:
         case 7:
         case 9:
                 ValorDecimal = 8;
                 break;
         default: 
                 break;
     }
   }

   return ValorDecimal;
}

Yo utilizaría una matriz de 10x30 y correría el índice entre BCD+10pin5+20pin6

Este tema lo viene trayendo desde hace meses, yo lo recuerdo porque lo respondí en otro foro.
Tiene dos entradas que son irrelevantes como BAND y WARC porque con el estado de 1 resuelve hasta ahora lo mismo.
También habla de manual automático pero nunca dice como cambian las cosas porque el decodificador trabajará igual asi como esta hecho en la matriz sugerida.
También las dos entradas 3_W y 3_B son superfluas, con 1 alcanza aunque por ahora lucen como BAND invertida asi que con 1 resuelves todo.

noter:
¿Probaste el código que te propuse? Creo que como base debería servir a tus propósitos. Le faltarían dos condicionales para lo que acabas de decir.

void loop()

{
      // leemos entradas
      int miValor = leevalor();

// aquí irían los if para las transformaciones especiales de miValor
      if (warc && (miValor==6||miValor==8)) {
            miValor=4;
      }
      if (band && (miValor==7||miValor==9)) {
            miValor=5;
      }
     
      // Encendemos el pin correspondiente al valor
      sacaValor(miValor);
}

Hola Noter! Estoy probandolo justo en este momento, y el comentario es que la placa hace NADA :frowning:

surbyte:
Este tema lo viene trayendo desde hace meses, yo lo recuerdo porque lo respondí en otro foro

Si, efectivamente, le dedico un poco de tiempo cuando es posible!

surbyte:
Tiene dos entradas que son irrelevantes como BAND y WARC porque con el estado de 1 resuelve hasta ahora lo mismo.

Estas entradas no son irrelevantes, sino no las pondria! ambas manejan cosas distintas, ambas son necesarias, y si, cuando hice la tabla de verdad en papel las nombre 3_band y 3_warc, pero el soft de arduino me obligo a renombrarlas.

surbyte:
También habla de manual automático pero nunca dice como cambian las cosas porque el decodificador trabajará igual asi como esta hecho en la matriz sugerida.

Cuando este en AUTOMATICO, funcionara de manera autonoma, recibiendo e interpretando el BCD que le llegue a los pines de entrada, y en MANUAL, el decodificador dejaria de funcionar de manera autonoma, seleccionando que salida utilizar por medio de pulsadores, uno para cada salida.

surbyte:
Me queda claro que es un selector de Antes de HF de 160metros a 6 metros.

Exactamente eso, mas conocido como BAND DECODER.

surbyte:
Aca mi solución, presta atención a la selección de piens utilizados.
En lo personal yo usaria uno o dos 74595s para ahorrar pines

Aqui no entendi que quisiste decir.

Gracias Surbyte.