Go Down

Topic: Decodificador BCD a Decimal (Especial) (Read 6627 times) previous topic - next topic

surbyte

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.

Code: [Select]
//                     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;
}

PeterKantTropus

#16
Feb 26, 2016, 11:51 am Last Edit: Feb 26, 2016, 11:55 am by PeterKantTropus
Yo utilizaría una matriz de 10x30 y correría el índice entre BCD+10*pin5+20*pin6
"Si no entra como tornillo, entra como clavo"

surbyte

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.


CX6DRA

¿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.

Code: [Select]

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 :(

CX6DRA

#19
Feb 27, 2016, 12:26 am Last Edit: Feb 27, 2016, 12:41 am by CX6DRA
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!

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.

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.

Me queda claro que es un selector de Antes de HF de 160metros a 6 metros.
Exactamente eso, mas conocido como BAND DECODER.

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.


surbyte

La tabla de verdad qeu has publicado hasta ahroa tiene entradas irrelevantes. Eso es básico en lógica booleana.
Se simplfican 4 de tus entradas en una sola por ahora.
hasta que presentes una tabla de verdad mas compleja, lo que veo hasta ahora esta resuelto con lo el código que te puse.
Si buscas en GOOGLE: Arduino Band decoder encontraras soluciones terminadas muy bien hechas.

CX6DRA

La tabla de verdad qeu has publicado hasta ahroa tiene entradas irrelevantes. Eso es básico en lógica booleana.
Se simplfican 4 de tus entradas en una sola por ahora.
hasta que presentes una tabla de verdad mas compleja, lo que veo hasta ahora esta resuelto con lo el código que te puse.
Si es asi, no me doy cuenta.

Si buscas en GOOGLE: Arduino Band decoder encontraras soluciones terminadas muy bien hechas.
Eso es justamente lo que no queria, copiar algo ya hecho, tambien podria comprar uno y no romperme la cabeza jaja :)

surbyte

Cuando estudias lógica digital te enseñan a simplificar tablas.
Tu tabla tiene 4 entradas que se simplifican en 1 sola, las otras 4 entradas BCD no admiten simplificación. Eso es sabido.

Por ahora 
BAND
WARC = BAND
3_W=!BAND
3_B=!BAND
Aca te muestro las simplificaciones pero cualquiera de estas supuestas entradas puede servir para expresar las otras.

Asi que si no le encuentras cambios a las salidas respecto de estas 4 entradas, con tener a BAND y las 4 entradas BCD tendras la salida que buscas.
AUTO funcionará como expuse en el código que te presenté y MANUAL tu dirás.
Prueba a ver si satisface tu necesidad.

CX6DRA

#23
Feb 27, 2016, 11:47 pm Last Edit: Feb 27, 2016, 11:55 pm by CX6DRA
Hola Surbyte!

Acabo de probar el codigo, responde al bcd de entrada sin problemas, el unico detalle que le veo, es que cuando la entrada es 0000, las salidas deben estar todas apagadas, por lo tanto la salida 160 corresponde a la entrada 0001.

Aqui hice un video, se ve un poco mal porque lo grabe a baja calidad.

Gracias.

https://youtu.be/xcfRSORhvas

surbyte

Esta corrida la tabla que definí entonces?

Code: [Select]
//                        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[11][10] = {
                     {  0,  0,   0,  0,  0,  0,  0,  0,  0,  0},   // 0                   
                     {  1,  0,   0,  0,  0,  0,  0,  0,  0,  0},   // 1
                     {  0,  1,   0,  0,  0,  0,  0,  0,  0,  0},   // 2
                     {  0,  0,   1,  0,  0,  0,  0,  0,  0,  0},   // 3
                     {  0,  0,   0,  1,  0,  0,  0,  0,  0,  0},   // 4
                     {  0,  0,   0,  0,  1,  0,  0,  0,  0,  0},   // 5
                     {  0,  0,   0,  0,  0,  1,  0,  0,  0,  0},   // 6
                     {  0,  0,   0,  0,  0,  0,  1,  0,  0,  0},   // 7
                     {  0,  0,   0,  0,  0,  0,  0,  1,  0,  0},   // 8
                     {  0,  0,   0,  0,  0,  0,  0,  0,  1,  0},   // 9
                     {  0,  0,   0,  0,  0,  0,  0,  0,  0,  1}};  // 10


Mira a ver si asi funciona correctamente.

CX6DRA

Hola Surbyte, como estas?

Probe la nueva matriz, en 11x10 el resultado es el mismo, probe de hacerla de 11x11 agregando un pin mas de salida, y ahi si funciona, ahora estoy probando de cambiar ese pin que agregue por alguna variable interna, para no desperdiciarlo.

Gracias.

surbyte

No necesitas ninguna variable interna. Te estoy diciendo que de las 4 variables que pusiste en la tabla 3 estan de mas y quieres agregar otra?
Con BCD y una variable por ahora estas bien.

CX6DRA

No necesitas ninguna variable interna. Te estoy diciendo que de las 4 variables que pusiste en la tabla 3 estan de mas y quieres agregar otra?
Con BCD y una variable por ahora estas bien.

Hola! Creo que no me he sabido explicar, o tu no me has entendido :)

La matriz que tu me propusiste al principio, era de 10x10, luego fue de 11x10, con lo cual obtuve el mismo resultado, por lo cual, agregue una salida mas, para confeccionar una matriz de 11x11, y alli SI funciono, el tema es que ese pin (salida) es innecesario.

Gracias.

surbyte

No se que decirte.
No veo la matriz. No entiendo a que salida te refieres.
Yo el programa lo simulé y funcionaba pero claro tu eres quien sabe como debe responder.
Dijiste que cuando ponías BCD 0000 encendía la respuesta 160m o sea salida 1
Al agregar una fila mas con todas las salidas en 0 hice que con entrada BCD 0000 tuvieras salida 0000000000 10 0s
Asi que no veo porque necesitas otra salida?

Porque no pones tu matriz modificada y hablamos el mismo idioma?

CX6DRA


Code: [Select]
//                        160m 80m 40m 30m 20m 17m 15m 12m 10m  6m
const byte Salidas[11] = {A1,  A5, A4,  A3, A2, 2,  3,  4,  5,  6,  7};
const byte matrix[11][11] = {
                     {  0,  0,   0,  0,  0,  0,  0,  0,  0,  0},   // 0                   
                     {  1,  0,   0,  0,  0,  0,  0,  0,  0,  0},   // 1
                     {  0,  1,   0,  0,  0,  0,  0,  0,  0,  0},   // 2
                     {  0,  0,   1,  0,  0,  0,  0,  0,  0,  0},   // 3
                     {  0,  0,   0,  1,  0,  0,  0,  0,  0,  0},   // 4
                     {  0,  0,   0,  0,  1,  0,  0,  0,  0,  0},   // 5
                     {  0,  0,   0,  0,  0,  1,  0,  0,  0,  0},   // 6
                     {  0,  0,   0,  0,  0,  0,  1,  0,  0,  0},   // 7
                     {  0,  0,   0,  0,  0,  0,  0,  1,  0,  0},   // 8
                     {  0,  0,   0,  0,  0,  0,  0,  0,  1,  0},   // 9
                     {  0,  0,   0,  0,  0,  0,  0,  0,  0,  1}};  // 10


Hola Surbyte, buenos dias, esa fue la modificación que funciono correctamente.

Go Up