Haz una pregunta
  Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos » Arduino y Raspberry Pi
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

25/11/2015 #1

Avatar de alexus

Duda: Manejo de salida con multiples lineas
Buenas noches!

Hacia mucho tiempo que no rondaba por estos lares! Estoy trancado con un programa que estoy desarrollando:

Tengo una entrada BCD de 4 bit + entrada "manual/automatico" + dos entradas "a" y "b".

Para lo cual utilizo 7 pines de entrada.

Manejare 10 salidas digitales.

En modo "manual" las salidas las manejare mediante pulsadores, aqui no tengo problemas, pienso partir de:

Código:
if AUTOMATICO =1
{
//Programa automatico
}

else
{
//Manual
}
En modo automatico las salidas seran controladas por la entrada BCD, pero, las entradas "a" y "b", haran "ignorar" lo que dice el BCD para sacar por una misma salida tres combinaciones de entrada.

Y en esto ultimo esta mi problema, estoy usando IF, pero recien estoy escribiendo el caso de AUTOMATICO = 1 (activo), por lo que tendria que usar otros dos IF para a = 1 y b =1 respectivamente.

Aclarar que las salidas que manejaria "a" (10M, 15M y 20M) no son las mismas que manjeria "b" (12M, 17M y 30M).

Adjunto lo que he escrito hasta el momento, espero que me puedan dar una mano!

Gracias!

Código:
int DATA_A = 8
int DATA_B = 9
int DATA_C = 10
int DATA_D = 11
int 3_WARC = 12
int 3_BAND = 13
int AUTO   = 13
//-----------------------------
int 160M   = A4
int 80M    = A5
int 40M    = 0
int 30M    = 1
int 20M    = 2
int 17M    = 3
int 15M    = 4
int 12M    = 5
int 10M    = 6
int 6M     = 7
//-------------------------------
pinMode (DATA_A, INPUT)
pinMode (DATA_B, INPUT)
pinMode (DATA_C, INPUT)
pinMode (DATA_D, INPUT)
pinMode (3_WARC, INPUT)
pinMode (3_BAND, INPUT)
pinMode (AUTO,   INPUT)
//-------------------------------
pinMode (160M, OUTPUT)
pinMode (80M,  OUTPUT)
pinMode (40M,  OUTPUT)
pinMode (30M,  OUTPUT)
pinMode (20M,  OUTPUT)
pinMode (17M,  OUTPUT)
pinMode (15M,  OUTPUT)
pinMode (12M,  OUTPUT)
pinMode (10M,  OUTPUT)
pinMode (6M,   OUTPUT)
//----------------------------
void setup() {
  // put your setup code here, to run once:

}

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 

if (AUTO = 0)
{
//160 METROS
if ((AUTO == 0 ) && (DATA_A == 0 ) && (DATA_B == 0 ) && (DATA_C== 0 ) && (DATA_D == 1 ))
{
  digitalWrite (160M = HIGH)
  digitalWrite (80M = LOW)
  digitalWrite (40M = LOW)
  digitalWrite (30M = LOW)
  digitalWrite (20M = LOW)
  digitalWrite (17M= LOW)
  digitalWrite (15M= LOW)
  digitalWrite (12M = LOW)
  digitalWrite (10M = LOW)  
  digitalWrite (6M = LOW)
}

//30 METROS (IGUAL PARA 30M, 17M Y 12M) (IGUAL PARA 10M, 15M Y 20M)
if ((AUTO == 0 )&&(DATA_A == 0 ) && (DATA_B == 1 ) && (DATA_C== 0 ) && (DATA_D == 0 ))
{
  digitalWrite (30M = HIGH)
  digitalWrite (160M = LOW)
  digitalWrite (80M = LOW)
  digitalWrite (40M = LOW)  
  digitalWrite (20M = LOW)
  digitalWrite (17M= LOW)
  digitalWrite (15M= LOW)
  digitalWrite (12M = LOW)
  digitalWrite (10M = LOW)  
  digitalWrite (6M = LOW)
}
}

else
{
//MANUAL  
}
26/11/2015 #2


Especificacion
Hola, podrias especificar algo mas lo que quieres hacer?
Entiendo por lon que dices que tienes 4 entradas BCD binarias y luego un pulsador que cambia de manual a automatico, pero no entiendo bien que quieres sacar por las salidas ni lo de las señales a y b ni para que sirven.
Un saludo
26/11/2015 #3

Avatar de alexus

Hola, gracias por tu respuesta.

Con las salidas excitare reles, asi que es solo ponerlas en alto o bajo.

Tanto las entradas de AUTO, como 3_WARC y 3_BAND son interruptores simple conmutadores, osea que si AUTO no esta en alto, quiere decir que esta manual, lo mismo con las otras dos entradas.

3_BAND y 3_WARC si estan en alto (1) haran que una misma salida sea activada por tres combinaciónes de BCD, si no estan activadas, se regiran solo por el BCD.
26/11/2015 #4


A ver ya me voy enterando aunque lo de los interruptores A y B no me queda claro, me hice un pequeño dibujo para ver si conseguido ayudarte.
Tambien decirte que en tu codigo una vez pones la condicion de If(AUTO==0) , en las siguientes condiciones dentro de esa misma condiciones es redundante que vuelvas a poner otras vez IF(AUTO==0).
Mira el dibujo y me comentas plzz.
Un saludo
Imágenes Adjuntas
Tipo de Archivo: jpg image.jpg (68,2 KB (Kilobytes), 17 visitas)
26/11/2015 #5

Avatar de alexus

A ver si me explico ahora mejor, puse "a" y "b" como entrada pero da lugar a confusión.

Va tabla:



---------- Actualizado después de 2 minutos ----------

Y solo en automático perdon!
26/11/2015 #6


Ya me he enterado! Si te esperas un momento te respondo bien y t digo lonque tienes q hacer, aunque ya te digo que te vas a aburrir a poner condionales de If o simplificar un poco añadie do alguna funcion recursiva que te ayude y ya si sabes de hardware y puertas logicas podrias sacarte las diferentes funciones a nivel de bit para cada salida dependiendo de el modo que tengas seleccionado y los botones a y b.
Entre hoy y mañana te especifico mejor que ahora mismo no puedo.
26/11/2015 #7

Avatar de alexus

Ningun problema! Lo que habia pensado también era manejar los PORT completos, pero no lo manejo con facilidad.

Muchas gracias!
26/11/2015 #8


Los ports tampoco son difíciles de manejar, solo tienes que aprender operaciones a nivel de bit como pueden ser &, |, desplazamientos, etc... para saber hacer mascaras.
Para saber sobre los ports de Arduino uno mírate esto y si tienes dudas me preguntas:
https://www.arduino.cc/en/Reference/PortManipulation
Esto te simplificaría de tener que poner una instrucción de escritura para cada salida, a una sola para configurar todas de una vez.
Lo primero que haría yo seria una funcioncita que cambiase el valor en binario del data a una variable de tipo int tipo

int ConvertirValor(Data_a,Data_b,Data_c,Data_d){
int ValorDecimal

if((Data_a==0) && (Data_b==0) && (Data_c==0) && (Data_d==0)){
ValorDecimal=0;
}
if((Data_a==0) && (Data_b==0) && (Data_c==0) && (Data_d==1)){
ValorDecimal=1;
}
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.
}

Esta funcion la pondria antes de toda la secuencia de comparaciones que seria de la siguiente manera:


-------------------------------------------------------------------------------------------------------------
if(AUTO==0)
{

}
if(Auto==1)
{

}

O si auto solo tiene dos estados posible puedes poner una condicion y la otra con else

luego le añadimos en automática la parte de A y B

if(AUTO==1)
{
//Lo que quieras poner en manual
}
if(AUTO==0)
{
if((A==1) && (B==1)){
//ahora aquí irían los demás if según el Valor Decimal calculada según la tabla de verdad si a y b están activadas

if(ValorDecimal==1){
PORTX=B10000000; //o eso o activas las salidas que correspondan y desactivas las que no, o haces mascaras de 0 y 1
}
//y así con los demás valores
}
else{
//ahora aquí irían los demás if según el Valor Decimal calculada según la tabla de verdad si a y b están desactivadas
}
}
-----------------------------------------------------------------------------------------------------------------

Otra cosa que puedes hacerte para no meter tantos if es calcularte las funciones de las salidas segun las entradas en los casos que A y B estén o no activadas con karnaugh y utilizar todo a nivel de bit, pero si no sabes mucho de esto te recomiendo poner ifs por que te puedes liar.
Creo que así debería funcionar, cuando tengas algo probado o tengas dudas me escribes.

P.D. Si ya lo que buscas también es que las salidas no estén cada nada petando el micro al tener que estar todo el rato escribiendo valores (Aunque en tu caso te da igual) ya que casi es una máquina de estados según unos switches) tendrías que hacer comparaciones de cuando este todo igual o no, pero eso requiere ya que tu código sea algo mas complejo.

---------- Actualizado después de 2 minutos ----------

Código:

if(AUTO==1)
{
   //Lo que quieras poner en manual
}
if(AUTO==0)
{
   if((A==1) && (B==1)){
      //ahora aquí irían los demás if según el Valor Decimal calculada según la tabla de verdad si a y b    están       activadas

      if(ValorDecimal==1){
         PORTX=B10000000; //o eso o activas las salidas que correspondan y desactivas las que no, o    haces    mascaras de 0 y 1
      }
      //y así con los demás valores
   }
   else{
   //ahora aquí irían los demás if según el Valor Decimal calculada según la tabla de verdad si a y b están   desactivadas
   }
}
Código:
int ConvertirValor(bool Data_a,bool Data_b,bool Data_c,bool Data_d){
   int ValorDecimal

   if((Data_a==0) && (Data_b==0) && (Data_c==0) && (Data_d==0)){
      ValorDecimal=0;
   }
   if((Data_a==0) && (Data_b==0) && (Data_c==0) && (Data_d==1)){
      ValorDecimal=1;
   }
   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.
}
Esto es un esquema conceptual... asi que no es el codigo tal cual (por ejempo data_A etc los he puesto como bool pero tendrias que poner creo q int que es como tienes declaradas esas variables)
26/11/2015 #9


Tambien faltaria contemplar los casos que a=0 y b=1 y vicebersa a=1 y b=0.
Como esos casos no los has contemplado he supuesto que son casos imposibles, pero si no es asi deberias poner unos else if comtemplando dichos casos
En tu codigo de inicio de tema tambien decirte que la configuracion de pines es mejor ponerla en el setup, no despues de declarar variables
26/11/2015 #10

Avatar de alexus

Hola Gabi!

Como ves en la tabla "3_WARC" combina funciona para tres combinaciónes (en rosado) y 3_BAND para otras tres (en amarillo), nunca se intercambian entre si.

Esto con ambas entradas en alto, si estan en bajo, el progama se maneja con el BCD, obteniendo una salida en alto por cambinacion de BCD.

Me explico?
26/11/2015 #11


Si, por eso mismo, tu dentro del if si a=1 y b=1 , cuando se al caso de que el valor decimal sea 5 || 7 || 9 activaras la salida 10m y en el caso dentro del else (en el caso que a=0 y b=0) para esos casos activaras su salida correspondiente segun el bcd.
Lo mismo con valor decimal 4||6||8 y la salida 12m
Si hace falta te hago el codigo entero si no lo comprendes, o alomejor esque no entiendo yo muy bien lo que quieres hacer, por eso, si hace falta me lo dices y te escribo el codigo tal cual escribirlo en arduino
26/11/2015 #12

Avatar de alexus

A ver que te parece,

deje el "ConvertirValor" fuera de setup y loop, no se si esta bien asi, ahi me comentas!

Código:
int DATA_A = 8
int DATA_B = 9
int DATA_C = 10
int DATA_D = 11
int 3_WARC = 12
int 3_BAND = 13
int AUTO   = 13
//-----------------------------
int 160M   = A4
int 80M    = A5
int 40M    = 0
int 30M    = 1
int 20M    = 2
int 17M    = 3
int 15M    = 4
int 12M    = 5
int 10M    = 6
int 6M     = 7
//-------------------------------
int ConvertirValor (DATA_A,DATA_B,DATA_C,DATA_D)
int ValorDecimal

//160 METROS
if((DATA_A == 0) && (DATA_B == 0) && (DATA_C == 0) && (DATA_D == 1))
{
ValorDecimal = 1;
}
//80 METROS
if((DATA_A == 0) && (DATA_B == 0) && (DATA_C == 1) && (DATA_D == 0))
{
ValorDecimal = 2;
}
//40 METROS
if((DATA_A == 0) && (DATA_B == 0) && (DATA_C == 1) && (DATA_D == 1))
{
ValorDecimal = 3;
}
//30 METROS
if((DATA_A == 0) && (DATA_B == 1) && (DATA_C == 0) && (DATA_D == 0))
{
ValorDecimal = 4;
}
//20 METROS
if((DATA_A == 0) && (DATA_B == 1) && (DATA_C == 0) && (DATA_D == 1))
{
ValorDecimal = 5;
}
//17 METROS
if((DATA_A == 0) && (DATA_B == 1) && (DATA_C == 1) && (DATA_D == 0))
{
ValorDecimal = 6;
}
//15 METROS
if((DATA_A == 0) && (DATA_B == 1) && (DATA_C == 1) && (DATA_D == 1))
{
ValorDecimal = 7;
}
//12 METROS
if((DATA_A == 1) && (DATA_B == 0) && (DATA_C == 0) && (DATA_D == 0))
{
ValorDecimal = 8;
}
//10 METROS
if((DATA_A == 1) && (DATA_B == 0) && (DATA_C == 0) && (DATA_D == 1))
{
ValorDecimal = 9;
}
//6 METROS
if((DATA_A == 1) && (DATA_B == 0) && (DATA_C == 1) && (DATA_D == 0))
{
ValorDecimal = 10;
}
return ValorDecimal
//-------------------------------
pinMode (DATA_A, INPUT)
pinMode (DATA_B, INPUT)
pinMode (DATA_C, INPUT)
pinMode (DATA_D, INPUT)
pinMode (3_WARC, INPUT)
pinMode (3_BAND, INPUT)
pinMode (AUTO,   INPUT)
//-------------------------------
pinMode (160M, OUTPUT)
pinMode (80M,  OUTPUT)
pinMode (40M,  OUTPUT)
pinMode (30M,  OUTPUT)
pinMode (20M,  OUTPUT)
pinMode (17M,  OUTPUT)
pinMode (15M,  OUTPUT)
pinMode (12M,  OUTPUT)
pinMode (10M,  OUTPUT)
pinMode (6M,   OUTPUT)
//----------------------------
void setup() {
  // put your setup code here, to run once:
}

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 

if (AUTO = 1)
{
//160 METROS
if ((ValorDecimal == 1)
{
  digitalWrite (160M = HIGH)
  digitalWrite (80M = LOW)
  digitalWrite (40M = LOW)
  digitalWrite (30M = LOW)
  digitalWrite (20M = LOW)
  digitalWrite (17M= LOW)
  digitalWrite (15M= LOW)
  digitalWrite (12M = LOW)
  digitalWrite (10M = LOW)  
  digitalWrite (6M = LOW)
}

//80 METROS
if ((ValorDecimal == 2)
{
  digitalWrite (80M = HIGH)
  digitalWrite (160M = LOW)
  digitalWrite (40M = LOW)
  digitalWrite (30M = LOW)  
  digitalWrite (20M = LOW)
  digitalWrite (17M= LOW)
  digitalWrite (15M= LOW)
  digitalWrite (12M = LOW)
  digitalWrite (10M = LOW)  
  digitalWrite (6M = LOW)
}
//40 METROS
if ((ValorDecimal == 3)
{
  digitalWrite (40M = HIGH)
  digitalWrite (160M = LOW)
  digitalWrite (80M = LOW)
  digitalWrite (30M = LOW)  
  digitalWrite (20M = LOW)
  digitalWrite (17M= LOW)
  digitalWrite (15M= LOW)
  digitalWrite (12M = LOW)
  digitalWrite (10M = LOW)  
  digitalWrite (6M = LOW)
}

//30 METROS
if ((ValorDecimal == 4) && (3_WARC == 0))
{
  digitalWrite (30M = HIGH)
  digitalWrite (160M = LOW)
  digitalWrite (80M = LOW)
  digitalWrite (40M = LOW)  
  digitalWrite (20M = LOW)
  digitalWrite (17M= LOW)
  digitalWrite (15M= LOW)
  digitalWrite (12M = LOW)
  digitalWrite (10M = LOW)  
  digitalWrite (6M = LOW)
}
//20 METROS
if ((ValorDecimal == 5) && (3_BAND == 0))
{
  digitalWrite (20M = HIGH)
  digitalWrite (160M = LOW)
  digitalWrite (80M = LOW)
  digitalWrite (40M = LOW)  
  digitalWrite (30M = LOW)
  digitalWrite (17M= LOW)
  digitalWrite (15M= LOW)
  digitalWrite (12M = LOW)
  digitalWrite (10M = LOW)  
  digitalWrite (6M = LOW)
}//17 METROS
if ((ValorDecimal == 6) && (3_WARC == 0))
{
  digitalWrite (17M = HIGH)
  digitalWrite (160M = LOW)
  digitalWrite (80M = LOW)
  digitalWrite (40M = LOW)  
  digitalWrite (30M = LOW)
  digitalWrite (20M= LOW)
  digitalWrite (15M= LOW)
  digitalWrite (12M = LOW)
  digitalWrite (10M = LOW)  
  digitalWrite (6M = LOW)
}
//15 METROS
if ((ValorDecimal == 7) && (3_BAND == 0))
{
  digitalWrite (15M = HIGH)
  digitalWrite (160M = LOW)
  digitalWrite (80M = LOW)
  digitalWrite (40M = LOW)  
  digitalWrite (30M = LOW)
  digitalWrite (20M= LOW)
  digitalWrite (17M= LOW)
  digitalWrite (12M = LOW)
  digitalWrite (10M = LOW)  
  digitalWrite (6M = LOW)
}
//12 METROS
if ((ValorDecimal == 8) && (3_WARC == 0))
{
  digitalWrite (12M = HIGH)
  digitalWrite (80M = LOW)
  digitalWrite (160M = LOW)
  digitalWrite (40M = LOW)
  digitalWrite (30M = LOW)  
  digitalWrite (20M = LOW)
  digitalWrite (17M= LOW)
  digitalWrite (15M= LOW)
  digitalWrite (10M = LOW)  
  digitalWrite (6M = LOW)
}
//10 METROS
if ((ValorDecimal == 9) && (3_BAND == 0))
{
  digitalWrite (10M = HIGH)
  digitalWrite (80M = LOW)
  digitalWrite (160M = LOW)
  digitalWrite (40M = LOW)
  digitalWrite (30M = LOW)  
  digitalWrite (20M = LOW)
  digitalWrite (17M= LOW)
  digitalWrite (15M= LOW)
  digitalWrite (12M = LOW)  
  digitalWrite (6M = LOW)
}
//6 METROS
if ((ValorDecimal == 10)
{
  digitalWrite (6M = HIGH)
  digitalWrite (80M = LOW)
  digitalWrite (160M = LOW)
  digitalWrite (40M = LOW)
  digitalWrite (30M = LOW)  
  digitalWrite (20M = LOW)
  digitalWrite (17M= LOW)
  digitalWrite (15M= LOW)
  digitalWrite (12M = LOW)  
  digitalWrite (10M = LOW)

//3_WARC = 1 ---------------------------------

//30 METROS
if ((ValorDecimal == 4) && (3_WARC == 1))
{
  digitalWrite (12M = HIGH)
  digitalWrite (160M = LOW)
  digitalWrite (80M = LOW)
  digitalWrite (40M = LOW)  
  digitalWrite (30M = LOW)
  digitalWrite (20M= LOW)
  digitalWrite (17M= LOW)
  digitalWrite (15M = LOW)
  digitalWrite (10M = LOW)  
  digitalWrite (6M = LOW)
}
//17 METROS
if ((ValorDecimal == 6) && (3_WARC == 1))
{
  digitalWrite (12M = HIGH)
  digitalWrite (160M = LOW)
  digitalWrite (80M = LOW)
  digitalWrite (40M = LOW)  
  digitalWrite (30M = LOW)
  digitalWrite (20M= LOW)
  digitalWrite (17M= LOW)
  digitalWrite (15M = LOW)
  digitalWrite (10M = LOW)  
  digitalWrite (6M = LOW)
}

//12 METROS
if ((ValorDecimal == 6) && (3_WARC == 1))
{
  digitalWrite (12M = HIGH)
  digitalWrite (160M = LOW)
  digitalWrite (80M = LOW)
  digitalWrite (40M = LOW)  
  digitalWrite (30M = LOW)
  digitalWrite (20M= LOW)
  digitalWrite (17M= LOW)
  digitalWrite (15M = LOW)
  digitalWrite (10M = LOW)  
  digitalWrite (6M = LOW)
}

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

//20 METROS
if ((ValorDecimal == 5) && (3_BAND == 1))
{
  digitalWrite (10M = HIGH)
  digitalWrite (80M = LOW)
  digitalWrite (160M = LOW)
  digitalWrite (40M = LOW)
  digitalWrite (30M = LOW)  
  digitalWrite (20M = LOW)
  digitalWrite (17M= LOW)
  digitalWrite (15M= LOW)
  digitalWrite (12M = LOW)  
  digitalWrite (6M = LOW)
}
//15 METROS
if ((ValorDecimal == 7) && (3_BAND == 1))
{
  digitalWrite (10M = HIGH)
  digitalWrite (80M = LOW)
  digitalWrite (160M = LOW)
  digitalWrite (40M = LOW)
  digitalWrite (30M = LOW)  
  digitalWrite (20M = LOW)
  digitalWrite (17M= LOW)
  digitalWrite (15M= LOW)
  digitalWrite (12M = LOW)  
  digitalWrite (6M = LOW)
}

//10 METROS
if ((ValorDecimal == 9) && (3_BAND == 1))
{
  digitalWrite (10M = HIGH)
  digitalWrite (80M = LOW)
  digitalWrite (160M = LOW)
  digitalWrite (40M = LOW)
  digitalWrite (30M = LOW)  
  digitalWrite (20M = LOW)
  digitalWrite (17M= LOW)
  digitalWrite (15M= LOW)
  digitalWrite (12M = LOW)  
  digitalWrite (6M = LOW)
}
27/11/2015 #13


Bueno hay cosillas que estan mal escritas, luego te lo corrijo.
Un saludo
27/11/2015 #14

Avatar de alexus

Hola! Si, seguramente las haya.

Lo primero que tuve que corregir, fue el nombre de las variables, no admite que las mismas empiecen con un numero.
27/11/2015 #15


Código:
int DATAA = 8;
int DATAB = 9;
int DATAC = 10;
int DATAD = 11;
int WARC3 = 12;
int BAND3 = 13;
int AUTO   = 13;   //AQUI HAY UN PROBLEMA!!!! NO PUEDE SER EL MISMO QUE EL ANTERIOR!!! 
//-----------------------------
int M160   = A4;  
int M80    = A5;   
int M40    = 0;
int M30    = 1;
int M20    = 2;
int M17    = 3;
int M15    = 4;
int M12    = 5;
int M10    = 6;
int M6     = 7;
//-------------------------------
int valorBCD;
//----------------------------
void setup() {
  // put your setup code here, to run once:
  pinMode (DATAA, INPUT);
  pinMode (DATAB, INPUT);
  pinMode (DATAC, INPUT);
  pinMode (DATAD, INPUT);
  pinMode (WARC3, INPUT);
  pinMode (BAND3, 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(){
  
  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);
       } 
      if(valorBCD==2){
        digitalWrite(M160,LOW);
        digitalWrite(M80,HIGH);
        digitalWrite(M40,LOW);
        digitalWrite(M30,LOW);
        digitalWrite(M20,LOW);
        digitalWrite(M17,LOW);
        digitalWrite(M15,LOW);
        digitalWrite(M12,LOW);
        digitalWrite(M10,LOW);
        digitalWrite(M6,LOW);
       } 
      if(valorBCD==3){
        digitalWrite(M160,LOW);
        digitalWrite(M80,LOW);
        digitalWrite(M40,HIGH);
        digitalWrite(M30,LOW);
        digitalWrite(M20,LOW);
        digitalWrite(M17,LOW);
        digitalWrite(M15,LOW);
        digitalWrite(M12,LOW);
        digitalWrite(M10,LOW);
        digitalWrite(M6,LOW);
       } 
      if(valorBCD==4 || valorBCD==6 || valorBCD==8){
       digitalWrite(M160,LOW);
        digitalWrite(M80,LOW);
        digitalWrite(M40,LOW);
        digitalWrite(M30,LOW);
        digitalWrite(M20,LOW);
        digitalWrite(M17,LOW);
        digitalWrite(M15,LOW);
        digitalWrite(M12,HIGH);
        digitalWrite(M10,LOW);
        digitalWrite(M6,LOW);
       } 
      if(valorBCD==5 || valorBCD==7 || valorBCD==9){
       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,HIGH);
        digitalWrite(M6,LOW);
       } 
      if(valorBCD==10){
        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,HIGH);
       }  
    }
    else if(WARC3==0 && BAND3==0){
      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);
      } 
      if(valorBCD==2){
        digitalWrite(M160,LOW);
        digitalWrite(M80,HIGH);
        digitalWrite(M40,LOW);
        digitalWrite(M30,LOW);
        digitalWrite(M20,LOW);
        digitalWrite(M17,LOW);
        digitalWrite(M15,LOW);
        digitalWrite(M12,LOW);
        digitalWrite(M10,LOW);
        digitalWrite(M6,LOW);
       } 
      if(valorBCD==3){
        digitalWrite(M160,LOW);
        digitalWrite(M80,LOW);
        digitalWrite(M40,HIGH);
        digitalWrite(M30,LOW);
        digitalWrite(M20,LOW);
        digitalWrite(M17,LOW);
        digitalWrite(M15,LOW);
        digitalWrite(M12,LOW);
        digitalWrite(M10,LOW);
        digitalWrite(M6,LOW);
       } 
      if(valorBCD==4){
        digitalWrite(M160,LOW);
        digitalWrite(M80,LOW);
        digitalWrite(M40,LOW);
        digitalWrite(M30,HIGH);
        digitalWrite(M20,LOW);
        digitalWrite(M17,LOW);
        digitalWrite(M15,LOW);
        digitalWrite(M12,LOW);
        digitalWrite(M10,LOW);
        digitalWrite(M6,LOW);
       } 
      if(valorBCD==5){
        digitalWrite(M160,LOW);
        digitalWrite(M80,LOW);
        digitalWrite(M40,LOW);
        digitalWrite(M30,LOW);
        digitalWrite(M20,HIGH);
        digitalWrite(M17,LOW);
        digitalWrite(M15,LOW);
        digitalWrite(M12,LOW);
        digitalWrite(M10,LOW);
        digitalWrite(M6,LOW);
       } 
      if(valorBCD==6){
        digitalWrite(M160,LOW);
        digitalWrite(M80,LOW);
        digitalWrite(M40,LOW);
        digitalWrite(M30,LOW);
        digitalWrite(M20,LOW);
        digitalWrite(M17,HIGH);
        digitalWrite(M15,LOW);
        digitalWrite(M12,LOW);
        digitalWrite(M10,LOW);
        digitalWrite(M6,LOW);
       } 
       if(valorBCD==7){
        digitalWrite(M160,LOW);
        digitalWrite(M80,LOW);
        digitalWrite(M40,LOW);
        digitalWrite(M30,LOW);
        digitalWrite(M20,LOW);
        digitalWrite(M17,LOW);
        digitalWrite(M15,HIGH);
        digitalWrite(M12,LOW);
        digitalWrite(M10,LOW);
        digitalWrite(M6,LOW);
       } 
       if(valorBCD==8){
        digitalWrite(M160,LOW);
        digitalWrite(M80,LOW);
        digitalWrite(M40,LOW);
        digitalWrite(M30,LOW);
        digitalWrite(M20,LOW);
        digitalWrite(M17,LOW);
        digitalWrite(M15,LOW);
        digitalWrite(M12,HIGH);
        digitalWrite(M10,LOW);
        digitalWrite(M6,LOW);
       }
       if(valorBCD==8){
        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,HIGH);
        digitalWrite(M6,LOW);
       }
       if(valorBCD==8){
        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,HIGH);
       }
    }
    
  }
  else{
   //lo que quieras en manual 
  }
}


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;
   //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.
}
a ver si así lo ves, lo he dejado para hasta si quieres compiles en arduino, aunque tienes la 13 configurada dos veces, miratelo y me dices
27/11/2015 #16


Puedes usar esto para simplificar LeerBCDDecimal

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);

   ValorDecimal = DATa << 3 + DATb <<2 + DATc << 1 + DATd;
 
   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.
}
27/11/2015 #17


Si! Lo puedes simplificar asi, pero como me por lo que lei de que no manejaba los puertos he intuido que no sabe manejar bits a nivel bajo como las operaciones de desplazamiento.
Se podria simplificar mas tambien usardo los PORTS en vez de declarar el estado de cada salida.
27/11/2015 #18

Avatar de alexus

gabilodno1612 dijo: Ver Mensaje
[code]
a ver si así lo ves, lo he dejado para hasta si quieres compiles en arduino, aunque tienes la 13 configurada dos veces, miratelo y me dices
Hola Gabi, creo que no me he sabido explicar, tu pones alli:

gabilodno1612 dijo: Ver Mensaje
Código:
(WARC3) && (BAND3)
y no necesariamente tienen que estar las dos, o una u otra, o ambas, o ninguna, ya que como se ve en la tabla de verdad que subi, no influyen entre si!

---------- Actualizado después de 2 minutos ----------

gabilodno1612 dijo: Ver Mensaje
[code]
a ver si así lo ves, lo he dejado para hasta si quieres compiles en arduino, aunque tienes la 13 configurada dos veces, miratelo y me dices
Hola Gabi, creo que no me he sabido explicar, tu pones alli:

gabilodno1612 dijo: Ver Mensaje
Código:
(WARC3) && (BAND3)
y no necesariamente tienen que estar las dos, o una u otra, o ambas, o ninguna, ya que como se ve en la tabla de verdad que subi, no influyen entre si!

SURbyte dijo: Ver Mensaje
Puedes usar esto para simplificar LeerBCDDecimal

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);

   ValorDecimal = DATa << 3 + DATb <<2 + DATc << 1 + DATd;
 
   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.
}
Gracias! A que se debe el "return" ultimo?
27/11/2015 #19


vale, pues si tiene que ser la una o la otra en vez de una funcion logica AND (&&) tendrias que poner una función lógica OR (||), lo que no entiendo es si puedes ser una o la otra por que no te lo ahorras poniendo solo un interruptor ajajaja.
El return es el valor que devuelve la funcion recursiva y se almacena en el valor de llamada de esa funcion. Te recomiendo leer y estudiar algo de C y C++ si te gusta esto y quieres entender esto mas facilmente.
Espero que con esto consigas el resultado que buscas y si no, ya sabes postea otra vez sin problemas.
Ayudaria tambien saber exactamente que es lo que quieres hacer, me explico, tengo dos interruptores que quiero que enciendan unas bombillas por que en mi casa tengo... o algo asi... ya que intentar entender tu resultado buscado a modo de tablas y conecptos de bits no es facil.
Un saludo
27/11/2015 #20

Avatar de alexus

gabilodno1612 dijo: Ver Mensaje
vale, pues si tiene que ser la una o la otra en vez de una funcion logica AND (&&) tendrias que poner una función lógica OR (||), lo que no entiendo es si puedes ser una o la otra por que no te lo ahorras poniendo solo un interruptor ajajaja.
Porque manejan cosas distintas!

Código:
Ayudaria tambien saber exactamente que es lo que quieres hacer, me explico, tengo dos interruptores que quiero que enciendan unas bombillas por que en mi casa tengo... o algo asi... ya que intentar entender tu resultado buscado a modo de tablas y conecptos de bits no es facil.
Tan fea quedo mi tabla? jajaja como dije, voy a manejar reles, y mis entradas son digitales, 0 o 1.

Lo otro que acabo de ver en tu codigo, es que:

primero defines "valorBCD" (y aparece en el programa) pero al final, defines "ValorDecimal", y solo se usa en la conversion de BCD a decimal, solo alli, por lo que creo no tendria conexion "valorBCD" con "ValorDecimal".

P.D.: Lo mio en arduino es todo de autodidacta jaja
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Buscar más temas sobre:
Lupa Arduino y Raspberry Pi

Cerrar
Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos » Arduino y Raspberry Pi

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.