Duda: Manejo de salida con multiples lineas

ufff... esque el valor decimal es una variable local de la funcion y la otra es la variable que almacena el valor que devuelve esa funcion... umm busca por internet cosas como funciones, metodos, ect a ver si entiendes eso... es muy util a la hora de programar. Es como por asi decirlo crear tus funciones al igual que cuando importas una libreria con funciones ya creadas
 
Creo que no nos estamos entendiendo!!

Tu al principio del codigo has puesto:

Código:
void loop(){
  
  valorBCD=LeerBCDDecimal(DATAA,DATAB,DATAC,DATAD);
  
  if(AUTO==1){
    if(WARC3==1 && BAND3==1){
        if(valorBCD==0){
          //en 0 nada
        }
        if(valorBCD==1){
        digitalWrite(M160,HIGH);
        digitalWrite(M80,LOW);
        digitalWrite(M40,LOW);
        digitalWrite(M30,LOW);
        digitalWrite(M20,LOW);
        digitalWrite(M17,LOW);
        digitalWrite(M15,LOW);
        digitalWrite(M12,LOW);
        digitalWrite(M10,LOW);
        digitalWrite(M6,LOW);
       }

y luego:

Código:
int LeerBCDDecimal(int DATAAA,int DATAAB,int DATAAC,int DATAAD){
  
   int ValorDecimal;
   int DATa;
   int DATb;
   int DATc;
   int DATd;
   
   DATa=digitalRead(DATAAA);
   DATb=digitalRead(DATAAB);
   DATc=digitalRead(DATAAC);
   DATd=digitalRead(DATAAD);
    
   if((DATa==0) && (DATb=0) && (DATc==0) && (DATd==0)){
      ValorDecimal=0;
   }
   if((DATa==0) && (DATb=0) && (DATc==0) && (DATd==1)){
      ValorDecimal=1;
   }
   if((DATa==0) && (DATb=0) && (DATc==1) && (DATd==0)){
      ValorDecimal=2;
   }
   if((DATa==0) && (DATb=0) && (DATc==1) && (DATd==1)){
      ValorDecimal=3;
   }
   if((DATa==0) && (DATb=1) && (DATc==0) && (DATd==0)){
      ValorDecimal=4;
   }
   if((DATa==0) && (DATb=1) && (DATc==0) && (DATd==1)){
      ValorDecimal=5;
   }
   if((DATa==0) && (DATb=1) && (DATc==1) && (DATd==0)){
      ValorDecimal=6;
   }
   if((DATa==0) && (DATb=1) && (DATc==1) && (DATd==1)){
      ValorDecimal=7;
   }
   if((DATa==1) && (DATb=0) && (DATc==0) && (DATd==0)){
      ValorDecimal=8;
   }
   if((DATa==1) && (DATb=0) && (DATc==0) && (DATd==1)){
      ValorDecimal=9;
   }
   if((DATa==1) && (DATb=0) && (DATc==1) && (DATd==0)){
      ValorDecimal=10;
   }
   
   return ValorDecimal;

Lo que no entiendo, es donde asocias valorBCD, con ValorDecimal??
 
Hola Gabi, creo que no me he sabido explicar, tu pones alli:

Gracias! A que se debe el "return" ultimo?

a que define todo como una función.

int LeerBCDDecimal(int DATAAA,int DATAAB,int DATAAC,int DATAAD)
o sea LeerBCDDEcimal pide 4 argumentos y devuelve un entero
Ese entero es un valor de 0 a 10 que luego uso para actualizar valorBCD

O sea pones valorBCD = LeerBCDDecimal(dataA, dataB, dataC dataD)
y luego los if o un switch case
 
Bueno queria simplificarte el resto pero no entiendo tu tabla de verdad que esta clara para BCD y su equivalencia con las salidas y entradas pero no esta todo definido y tal como leo no entiendo que hacen a, b y donde estan el resto de las entradas que mencionas 3_WAC y 3_BAND.
Solo podria sugerirte un modo de simplificar las salidas pero como veo que hay alternativas que a mi no me cierran con la tabla de verdad no puedo darte una respuesta satisfactoria.
 
A y b son 3_WARC y 3_BAND.

Cuando estan en alto, independiente una de otra, "fusionan" tres salidas en una, por ejemplo, con 3_Warc en 1, para 4, 6 y 8 la salida sera 8, y con 3_band en 1, para 5, 7 y 9 la salida sera 9.
 
Bueno que raras (por poco coherentes) tus designaciones, lo dibujas con a y b y luego llamas 3_WARC y 3_BAND.
Ok. En la tabla eso no se veía de ese modo. pero ahora si me queda claro.
Dejame ver como simplifico todo.

Entendiste la función LeerBCDDecimal?
 
Última edición:
Hola a todos , caro Don alexus , serias mui util premeramente esplicar a los conpañeros lo que realmente quieres que tu Software realize y tanbien esplicar las variables en juego , yo como radioaficcionado entiendo lo que quieres hacer , pero desafortunadamente soy totalmente leigo en desahollo de Softwares
Att,
Daniel Lopes.
 
Bueno que raras (por poco coherentes) tus designaciones, lo dibujas con a y b y luego llamas 3_WARC y 3_BAND.
Ok. En la tabla eso no se veía de ese modo. pero ahora si me queda claro.
Dejame ver como simplifico todo.

Entendiste la función LeerBCDDecimal?
Hola SURbyte, fue el error que cometi al nombrarlas genéricamente como "a" y "b", que no se condecian con los nombres verdaderos, y que si aparecen en MI tabla de verdad.

Lo de la función, comprendido!



Hola a todos , caro Don alexus , serias mui util premeramente esplicar a los conpañeros lo que realmente quieres que tu Software realize y tanbien esplicar las variables en juego , yo como radioaficcionado entiendo lo que quieres hacer , pero desafortunadamente soy totalmente leigo en desahollo de Softwares
Att,
Daniel Lopes.
Hola Daniel!

Creo que dentro de todo fui claro (creo jaja), mi idea es leer 4 bits BCD, y activar una salida para cada numero binario de entrada, salvo, cuando las entradas 3_WARC y 3_BAND esten activas, que alli, la forma en que se activan las salidas cambia, obteniendo la misma salida para tres numeros binarios de entrada, y esto, para cuando cada una de las entradas 3_WARC y 3_BAND esten activas, independientes entre si.

Abrazo!
 
Última edición:
e82a95de2cc1e4297c52ff30416db626.jpg


Buenas tardes!

Aqui estoy con el asunto em cuestión!

Arme un contador binario de 4bit sobre un 4029, el pulsador es para darle clock.

Decir que tuve que modificar algunas cosas en el programa, porque no hubo caso de que anduviera.

Tuve que quitar el IF AUTO = 1, y el ELSE final.

Lo que no logro hacer que funcionen, son las salidas que dependen de 3_BAND y 3_WARC, no logro darme cuenta de donde esta el error.




Aqui adjunto un videillo, los led del contador binario se ven al revés, y las salidas del arduino estan de izquierda a derecha, M6 a M160, que se ve que no enciende, pero funciona, la desconecte a falta de un cablecillo.
 
Última edición:
Buenas noches!

Aqui sigo con el código... Me esta dando pelea...

Limpie el código al punto de dejar solo IF VALORDECIMAL==(algo) y ni siquiera asi me respeta el código...
 
Es para simplificar las cosas.
Hace lo mismo que la tuya pero de modo mas simple.

Hola Sur! Probe sin exito alguno... es mas, ni siquiera me respeta que salida corresponde a cada decimal...

Este es el codigo que estoy usando:

Código:
int DATAA = 8;
int DATAB = 9;
int DATAC = 10;
int DATAD = 11;
int TRIWARC = A2;
int TRIBAND = 13;
int AUTO   = A3;
//-----------------------------
int M160   = A5;
int M80    = A4;
int M40    = A0;
int M30    = A1;
int M20    = 2;
int M17    = 3;
int M15    = 4;
int M12    = 5;
int M10    = 6;
int M6     = 7;
//-------------------------------
int VValorBCD;
//-------------------------------

void setup(){

  pinMode (DATAA, INPUT);
  pinMode (DATAB, INPUT);
  pinMode (DATAC, INPUT);
  pinMode (DATAD, INPUT);
  pinMode (TRIWARC, INPUT);
  pinMode (TRIBAND, INPUT);
  pinMode (AUTO,   INPUT);
  //-------------------------------
  pinMode (M160, OUTPUT);
  pinMode (M80,  OUTPUT);
  pinMode (M40,  OUTPUT);
  pinMode (M30,  OUTPUT);
  pinMode (M20,  OUTPUT);
  pinMode (M17,  OUTPUT);
  pinMode (M15,  OUTPUT);
  pinMode (M12,  OUTPUT);
  pinMode (M10,  OUTPUT);
  pinMode (M6,   OUTPUT);

}

void loop(){
  // 0 0 0 1 1 160M
  // 0 0 1 0 2 80M
  // 0 0 1 1 3 40M
  // 0 1 0 0 4 30M
  // 0 1 0 1 5 20M
  // 0 1 1 0 6 17M
  // 0 1 1 1 7 15M
  // 1 0 0 0 8 12M
  // 1 0 0 1 9 10M
  // 1 0 1 0 A 6M 

  VValorBCD=LeerBCDDecimal(DATAA,DATAB,DATAC,DATAD);

    if (VValorBCD==0 || VValorBCD==11 || VValorBCD==12||VValorBCD==13|| VValorBCD==14||VValorBCD==15){
      digitalWrite (M160,LOW);
      digitalWrite (M80,LOW);
      digitalWrite (M40,LOW);
      digitalWrite (M30,LOW);
      digitalWrite (M20,LOW);
      digitalWrite (M17,LOW);
      digitalWrite (M15,LOW);
      digitalWrite (M12,LOW);
      digitalWrite (M10,LOW); 
      digitalWrite (M6,LOW);
    }
    
    //160 
    if (VValorBCD==1){
      digitalWrite (M160,HIGH);
      digitalWrite (M80,LOW);
      digitalWrite (M40,LOW);
      digitalWrite (M30,LOW);
      digitalWrite (M20,LOW);
      digitalWrite (M17,LOW);
      digitalWrite (M15,LOW);
      digitalWrite (M12,LOW);
      digitalWrite (M10,LOW); 
      digitalWrite (M6,LOW);
    }

    //80 METROS
    if (VValorBCD==2){
      digitalWrite (M80,HIGH);
      digitalWrite (M160,LOW);
      digitalWrite (M40,LOW);
      digitalWrite (M30,LOW); 
      digitalWrite (M20,LOW);
      digitalWrite (M17,LOW);
      digitalWrite (M15,LOW);
      digitalWrite (M12,LOW);
      digitalWrite (M10,LOW); 
      digitalWrite (M6,LOW);
    }
    //40 METROS
    if (VValorBCD==3){
      digitalWrite (M40,HIGH);
      digitalWrite (M160,LOW);
      digitalWrite (M80,LOW);
      digitalWrite (M30,LOW); 
      digitalWrite (M20,LOW);
      digitalWrite (M17,LOW);
      digitalWrite (M15,LOW);
      digitalWrite (M12,LOW);
      digitalWrite (M10,LOW); 
      digitalWrite (M6,LOW);
    }

    //30 METROS
    if ((VValorBCD==4) && (TRIWARC==0)){
      digitalWrite (M30,HIGH);
      digitalWrite (M160,LOW);
      digitalWrite (M80,LOW);
      digitalWrite (M40,LOW); 
      digitalWrite (M20,LOW);
      digitalWrite (M17,LOW);
      digitalWrite (M15,LOW);
      digitalWrite (M12,LOW);
      digitalWrite (M10,LOW); 
      digitalWrite (M6,LOW);
    }
    //20 METROS
    if ((VValorBCD==5) && (TRIBAND==0)){
      digitalWrite (M20,HIGH);
      digitalWrite (M160,LOW);
      digitalWrite (M80,LOW);
      digitalWrite (M40,LOW); 
      digitalWrite (M30,LOW);
      digitalWrite (M17,LOW);
      digitalWrite (M15,LOW);
      digitalWrite (M12,LOW);
      digitalWrite (M10,LOW); 
      digitalWrite (M6,LOW);
    }
    //17 METROS
    if ((VValorBCD==6) && (TRIWARC==0)){
      digitalWrite (M17,HIGH);
      digitalWrite (M160,LOW);
      digitalWrite (M80,LOW);
      digitalWrite (M40,LOW); 
      digitalWrite (M30,LOW);
      digitalWrite (M20,LOW);
      digitalWrite (M15,LOW);
      digitalWrite (M12,LOW);
      digitalWrite (M10,LOW);  
      digitalWrite (M6,LOW);
    }
    //15 METROS
    if ((VValorBCD==7) && (TRIBAND==0)){
      digitalWrite (M15,HIGH);
      digitalWrite (M160,LOW);
      digitalWrite (M80,LOW);
      digitalWrite (M40,LOW); 
      digitalWrite (M30,LOW);
      digitalWrite (M20,LOW);
      digitalWrite (M17,LOW);
      digitalWrite (M12,LOW);
      digitalWrite (M10,LOW);
      digitalWrite (M6,LOW);
    }

    //12 METROS
    if ((VValorBCD==8) && (TRIWARC==0)){
      digitalWrite (M12,HIGH);
      digitalWrite (M80,LOW);
      digitalWrite (M160,LOW);
      digitalWrite (M40,LOW);
      digitalWrite (M30,LOW); 
      digitalWrite (M20,LOW);
      digitalWrite (M17,LOW);
      digitalWrite (M15,LOW);
      digitalWrite (M10,LOW);  
      digitalWrite (M6,LOW);
    }

    //10 METROS
    if ((VValorBCD==9) && (TRIBAND==0)){
      digitalWrite (M10,HIGH);
      digitalWrite (M80,LOW);
      digitalWrite (M160,LOW);
      digitalWrite (M40,LOW);
      digitalWrite (M30,LOW); 
      digitalWrite (M20,LOW);
      digitalWrite (M17,LOW);
      digitalWrite (M15,LOW);
      digitalWrite (M12,LOW); 
      digitalWrite (M6,LOW);
    }
    //6 METROS
    if (VValorBCD==10){
      digitalWrite (M6,HIGH);
      digitalWrite (M80,LOW);
      digitalWrite (M160,LOW);
      digitalWrite (M40,LOW);
      digitalWrite (M30,LOW); 
      digitalWrite (M20,LOW);
      digitalWrite (M17,LOW);
      digitalWrite (M15,LOW);
      digitalWrite (M12,LOW); 
      digitalWrite (M10,LOW);
    }
    //3_WARC = 1 ---------------------------------

    //30 METROS
    if ((VValorBCD==4) && (TRIWARC==1)){
      digitalWrite (M12,HIGH);
      digitalWrite (M160,LOW);
      digitalWrite (M80,LOW);
      digitalWrite (M40,LOW); 
      digitalWrite (M30,LOW);
      digitalWrite (M20,LOW);
      digitalWrite (M17,LOW);
      digitalWrite (M15,LOW);
      digitalWrite (M10,LOW); 
      digitalWrite (M6,LOW);
    }
    //17 METROS
    if ((VValorBCD==6) && (TRIWARC==1)){
      digitalWrite (M12,HIGH);
      digitalWrite (M160,LOW);
      digitalWrite (M80,LOW);
      digitalWrite (M40,LOW); 
      digitalWrite (M30,LOW);
      digitalWrite (M20,LOW);
      digitalWrite (M17,LOW);
      digitalWrite (M15,LOW);
      digitalWrite (M10,LOW); 
      digitalWrite (M6,LOW);
    }

    //12 METROS
    if ((VValorBCD==6) && (TRIWARC==1)){
      digitalWrite (M12,HIGH);
      digitalWrite (M160,LOW);
      digitalWrite (M80,LOW);
      digitalWrite (M40,LOW); 
      digitalWrite (M30,LOW);
      digitalWrite (M20,LOW);
      digitalWrite (M17,LOW);
      digitalWrite (M15,LOW);
      digitalWrite (M10,LOW); 
      digitalWrite (M6,LOW);
    }

    //3_BAND = 1---------------------------------

    //20 METROS
    if ((VValorBCD==5) && (TRIBAND==1)){
      digitalWrite (M10,HIGH);
      digitalWrite (M80,LOW);
      digitalWrite (M160,LOW);
      digitalWrite (M40,LOW);
      digitalWrite (M30,LOW); 
      digitalWrite (M20,LOW);
      digitalWrite (M17,LOW);
      digitalWrite (M15,LOW);
      digitalWrite (M12,LOW);  
      digitalWrite (M6,LOW);
    }
    //15 METROS
    if ((VValorBCD==7) && (TRIBAND==1)){
      digitalWrite (M10,HIGH);
      digitalWrite (M80,LOW);
      digitalWrite (M160,LOW);
      digitalWrite (M40,LOW);
      digitalWrite (M30,LOW); 
      digitalWrite (M20,LOW);
      digitalWrite (M17,LOW);
      digitalWrite (M15,LOW);
      digitalWrite (M12,LOW); 
      digitalWrite (M6,LOW);
    }

    //10 METROS
    if ((VValorBCD==9) && (TRIBAND==1)){
      digitalWrite (M10,HIGH);
      digitalWrite (M80,LOW);
      digitalWrite (M160,LOW);
      digitalWrite (M40,LOW);
      digitalWrite (M30,LOW); 
      digitalWrite (M20,LOW);
      digitalWrite (M17,LOW);
      digitalWrite (M15,LOW);
      digitalWrite (M12,LOW);  
      digitalWrite (M6,LOW);
      
    }    
}


int LeerBCDDecimal(int DATAA,int DATAB,int DATAC,int DATAD){
  
   int ValorDecimal;
   int DATa;
   int DATb;
   int DATc;
   int DATd;
   
   DATa=digitalRead(DATAA);
   DATb=digitalRead(DATAB);
   DATc=digitalRead(DATAC);
   DATd=digitalRead(DATAD);
    
   if((DATa==0) && (DATb=0) && (DATc==0) && (DATd==0)){
      ValorDecimal=0;
   }
   if((DATa==1) && (DATb=0) && (DATc==1) && (DATd==1)){
      ValorDecimal=0;
   }
   if((DATa==0) && (DATb=0) && (DATc==0) && (DATd==0)){
      ValorDecimal=11;
   }
   if((DATa==1) && (DATb=1) && (DATc==0) && (DATd==0)){
      ValorDecimal=12;
   }
   if((DATa==1) && (DATb=1) && (DATc==0) && (DATd==1)){
      ValorDecimal=13;
   }
   if((DATa==1) && (DATb=1) && (DATc==1) && (DATd==0)){
      ValorDecimal=14;
   }
   if((DATa==1) && (DATb=1) && (DATc==1) && (DATd==1)){
      ValorDecimal=15;
   }
   
   if((DATa==0) && (DATb=0) && (DATc==0) && (DATd==1)){
      ValorDecimal=1;
   }
   if((DATa==0) && (DATb=0) && (DATc==1) && (DATd==0)){
      ValorDecimal=2;
   }
   if((DATa==0) && (DATb=0) && (DATc==1) && (DATd==1)){
      ValorDecimal=3;
   }
   if((DATa==0) && (DATb=1) && (DATc==0) && (DATd==0)){
      ValorDecimal=4;
   }
   if((DATa==0) && (DATb=1) && (DATc==0) && (DATd==1)){
      ValorDecimal=5;
   }
   if((DATa==0) && (DATb=1) && (DATc==1) && (DATd==0)){
      ValorDecimal=6;
   }
   if((DATa==0) && (DATb=1) && (DATc==1) && (DATd==1)){
      ValorDecimal=7;
   }
   if((DATa==1) && (DATb=0) && (DATc==0) && (DATd==0)){
      ValorDecimal=8;
   }
   if((DATa==1) && (DATb=0) && (DATc==0) && (DATd==1)){
      ValorDecimal=9;
   }
   if((DATa==1) && (DATb=0) && (DATc==1) && (DATd==0)){
      ValorDecimal=10;
   }
   
   return ValorDecimal;
   //y así con todos los valores posibles decimales posibles que pueden llegarte por tus entradas para   ahorrarte tener que poner en los If unas burradas de condiciones.
}
 
Practicamentr quieres hacer un multiplexor/demultiplexor con el arduino.
Deberias leer la hoja de datos de algún multiplexor/demultiplexor comercial, traen trabla de verdad, diagrama esquematico, etc.
Digo, es un consejo...
También podrías reducir el uso de tantas palabras e setencias if si usaras matrices...
 
Última edición:
Este es el código que postee en el foro Arduino Español.
Luego que volviste con la consulta.

Código:
//                     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;
}
 
Atrás
Arriba