Páginas vistas en el último mes

martes, 31 de mayo de 2011

Convertir un número de binario a BCD

                                      COMPARA Y SUMA SEIS



Existen varios métodos para realizar esa conversión y uno de ellos es el de recorre y suma 3. Desde joven siempre me llamó la atención un método que diseñé para convertir un número de binario a BCD, y eso es sin necesidad de tener que convertir primero el número de binario a decimal, sino que de binario se convierte directamente a BCD (binario decimal codificado). A este método de conversión directa de binario a BCD lo llamaré "COMPARA Y SUMA SEIS"




¿Qué es un sistema binario?
De acuerdo a wikipedia, podemos definirlo como:  "un sistema de numeración en el que los números se representan utilizando solamente las cifras cero y uno (0 y 1). Es el que se utiliza en las computadoras, debido a que trabajan internamente con dos niveles de voltaje, por lo que su sistema de numeración natural es el sistema binario (encendido 1, apagado 0)".


En un sistema binario, a cada dígito que es representado por uno o cero, se le conoce como bit. Si escribimos 10010, este número está constituido de 5 bits y por lo tanto, con 5 bits podemos realizar en total 32 combianciones (25=2x2x2x2x2= 32) o con 5 bits podemos representar números decimales que vayan de 0 a 31 (recordemos que a 32 se le resta uno porque se está partiendo desde cero en el sistema decimal, y en consecuencia, con 5 bits podemos representar números decimales que vayan de 0 a 31). Para convertir un número binario a decimal, es muy importante mencionar que, cada bit del número binario, se multiplica por la base dos ponderada, es decir, si nuestro número binario es 10010, entonces tenemos a 1x 24 + 0x23+0x22+1x21+0x20 y esto en total es 18.


¿Qué es un sistema decimal?
"El sistema decimal es un sistema de numeración posicional en el que las cantidades se representan utilizando como base el número diez, por lo que se compone de diez cifras diferentes: cero (0); uno (1); dos (2); tres (3); cuatro (4); cinco (5); seis (6); siete (7); ocho (8) y nueve (9). Este conjunto de símbolos se denomina números árabes, y es de origen hindú.


(...)Según los antropólogos, el origen del sistema decimal está en los diez dedos que tenemos los humanos en las manos, los cuales siempre nos han servido de base para contar. El sistema decimal es un sistema de numeración posicional, por lo que el valor del dígito depende de su posición dentro del número. Así:
347 = 3 \cdot 100 + 4 \cdot 10 + 7 \cdot 1 = 3 \cdot 10^2 + 4 \cdot 10^1 + 7 \cdot 10^0 "
(Infomación recopilada de la wikipedia)
¿Qué es un sistema BCD (Binario Decimal codificado)?
En este sistema se maneja un código ponderado basado en el sistema binario y que se emplea para representar los dígitos del sistema decimal, por ejemplo, el número 27 en código BCD natural se representaría como 0010 0111. Debido a que cada dígito decimal se puede representar con cuatro bits, esa es la razón por la que el sistema BCD se utiliza comunmente para representar números decimal en código binario, en el cual sus bits se suelen agrupar de cuatro en cuatro.


El BCD natural es el que tiene la distribución 8-4-2-1 al ponderar la base 2, es decir, si el número 1001 equivale a 1x 23+0x22+0x21+1x20 , eso significa que el código BCD tiene la distribución de 2 igual a 8, 22 igual a 4, 2igual a 2, y 2igual a 1. Sin embargo, existen otras variedades de códigos BCD con diferente distribución, por ejemplo tenemos al AIKEN (2-4-2-1) y el código BCD 5-4-2-1, entre otros más:
Antes de explicar el método de conversión directa de binario a BCD, primero explicaré en qué consiste el método indirecto para convertir de binario a decimal y una vez que hemos convertido el número de binario a decimal, ahora ese número decimal se convierte a BCD.


Conversión de binario a decimal y luego convertir de decimal a BCD 8-4-2-1.


En un número binario, debemos recordar que cada bit está ponderado y por lo tanto, los bits que se encuentren más a la izquierda, tendrán un mayor valor que los que se encuentran a la derecha. Para realizar la conversión de binario a decimal, realice lo siguiente:
      1. Inicie por el lado derecho del número binario, cada cifra multipliquela por 2 elevado a la potencia consecutiva (comenzando por la potencia 20).
      2. Enseguida, después de multiplicar cada cifra o bit por cada una de las potencias de 2 consecutivas, sume todos los resultados de las multiplicaciones, y el resultado de la suma total, será el número que corresponde al sistema decimal.
    
Ejemplo: convertir el número 110001 a decimal, y una vez que se obtenga el equvialente de este número en decimal, enseguida convertirlo a BCD.

      a)Conversión de binario a decimal.
       110001 = = 1x25+1x24+0x23+0x22+0x21+1x20 =32+16+1 = 49
      b)Conversión de decimal a BCD 8-4-2-1 ó BCD natural.
      Si 4 es igual a 100 y núeve es igual a 1001, entonces 49 es igual a 0100 1001.


Nota: el equivalente de 4 y de nueve en binario, se puede obtener por divisiones sucesivas entre el número dos.


Conversión directa de binario a BCD por medio del método COMPARA Y SUMA 6.


      En este método, que puede resultar muy útil en electrónica o en computación, lo primero que se hace es comparar el número binaro con el número nueve, pero expresado en código BCD; enseguida, si el número binario que queremos convertir a BCD es mayor que el número nueve, entonces al número binario que se convertirá en BCD se le suma el número seis (expresado también en BCD). Posteriormente, vamos a incrementar el número que nos sirve para comparar (la referencia) y en lugar de nueve se convertirá en diecinueve (expresado en BCD), y si el nuevo número obtenido sigue siendo mayor al número con el cuál lo estamos comparando, nuevamente se le vuelve a sumar seis. Reiteraremos el proceso cuantas veces sea necesario, y lo que se estará realizando por medio de este método, es que después de que  se ha ido sumando el número seis consecutivamente a cada número binario que pretendemos convertir a BCD,  se compararan estos resultados con los números nueve (expresado en BCD), diecinueve (expresado en BCD), veintinueve (expresado en BCD), treinta y nueve, y así sucesivamente, hasta que el nuevo número que le hemos ido sumando sucesivamente el número seis en BCD, sea menor o igual que el número con el cual lo estamos comparando. Sólo existe una excepción en este método, pues no siempre tendremos que sumar seis a cada resultado, en algunas ocasiones tendremos que sumar sesenta y seis expresado en BCD (0110 0110), esto ocurrirá justo después de que al comparar nuestro resultado con el número noventa y nueve, ciento noventa y nueve, doscientos noventa y nueve, etc, la comparación nos indique que el número al que pretendemos convertir a BCD, sigue siendo mayor que el número con el cual lo estamos comparando.  En algunas otras ocasiones tendremos que sumar seiscientos sesenta y seis, todo depende de la cantidad de nueves concatenados con los cuales estamos comparando el resultado, es decir, si yo estoy comparando un número con el 99, 199,299,399,...sólo súmaré sesenta y seis, pero si estoy comparando con los números 999,1999,2999,3999,... en este caso sumaré seiscientos sesenta y seis.


 Ejemplo: convertir el número 110001 directamente a BCD natural por el método compara y suma seis (sin alcanzar el número noventa y nueve con el cuál se puede llegar a comparar).


             110001 es mayor que (>) 001001, entonces se le sumara el número 0110 (seis)


             110001 > 00 1001
         +     0110
             110111 >01 1001
         +     0110  
             111101 > 10 1001
         +     0110  
           1000011  > 11 1001
         +     0110  
           1001001 < 100 1001


   
   Bien, ahora pondremos otro ejemplo con un número más grande:


Convertir 1 1100 0100 que es un número binario, a código BCD natural.

            1 1100 0100    >         1001
           +             110
            1 1100 1010  >        1 1001
           +            110
            1 1101 0000  >      10 1001
           +            110
           1 1101 0110  >       11 1001
           +           110
           1 1101 1100   >     100 1001
           +            110
            1 1110 0010  >      101 1001
            +           110
            1 1110 1000   >     110 1001
            +            110 
            1 1110 1110   >     111 1001
            +            110  
            1 1111 0100  >    1000 1001
            +            110
            1 1111 1010  >    1001 1001
            +   110 0110
          10 0110 0000  >  1 0000 1001
            +            110
          10 0110 0110  >  1 0001 1001
            +            110
          10 0110 1100  >  1 0010 1001
            +            110
          10 0111 0010  >  1 0011 1001
            +            110
          10 0111 1000  >  1 0100 1001
            +            110
          10 0111 1110  >  1 0101 1001
            +            110 
          10 1000 0100  >  1 0110 1001
            +            110
          10 1000 1010  >  1 0111 1001
            +            110
          10 1001 0000  >  1 1000 1001
            +            110
          10 1001 0110  >  1 1001 1001
            +   110 0110
          10 1111 1100   > 10 0000 1001
            +            110
          11 0000 0010  >  10 0001 1001
            +            110
          11 0000 1000  >  10 0010 1001
            +            110
          11 0000 1110   > 10 0011 1001
            +            110
          11 0001 0100   >  10 0100 1001
            +            110
          11 0001 1010   >  10 0101 1001
            +            110
          11 0010 0000   >  10 0110 1001
            +            110
          11 0010 0110   >  10 0111 1001
            +            110
          11 0010 1100   >  10 1000 1001
            +            110
           11 0011 0010  >  10 1001 1001
             +   110 0110
           11 1001 1000  >  11 0000 1001
             +           110
          11 1001 1110  >   11 0001 1001
            +            110
          11 1010 0100  >   11 0010 1001
            +            110
          11 1010 1010  >   11 0011 1001
            +            110
          11 1011 0000  >   11 0100 1001
            +           110
          11 1011 0110  >   11 0101 1001
            +           110
          11 1011 1100  >   11 0110 1001
            +            110
          11 1100 0010   >  11 0111 1001
            +           110
          11 1100 1000  >   11 1000 1001
            +           110
          11 1100 1110  >   11 1001 1001
            +   110 0110
        100 0011 0100  >  100 0000 1001
           +             110
        100 0011 1010  >  100 0001 1001
           +             110
         100 0100 0000  > 100 0010 1001
           +              110
         100 0100 0110  > 100 0011 1001
           +              110
         100 0100 1100  > 100 0100 1001
           +              110
         100 0101 0010  < 100 0101 1001

  De acuerdo a este método que hemos empleado (COMPARA Y SUMA SEIS), podemos afirmar que el número binario  11100 0100  corresponde al número 100 0101 0010 en código BCD natural, y este a su vez corresponde al número 452.  


¿En dónde resulta necesaria la conversión de binario a BCD natural?


Existen muchas aplicaciones para este método, pues muchas veces resulta que es necesario conocer un método para convertir un número de binario a BCD natural, y es precisamente indispensable cuando tenemos que desplegar un dato y visualizarlo en un display. Hay algunos circuitos integrados que precisamente se encargan de convertir la información que tenemos de binario a BCD, pero ¿para qué invertir algunas cuantas monedas en un gasto adicional, si esto mismo lo podemos hacer con un microcontrolador y visualizar nuestro resultado en un LCD?.


 A continuación mostraré un extracto del programa que se le tiene que grabar en un pic, para realizar la conversión de la información que se recibe de binario a BCD natural.


;DECLaRACION_CONSTANTES Y METODO COMPARA Y SUMA 6
goto CONVERTIRaBCD
CONTINUA0      movf y_mas_9,0
                             movwf vary                                                                         
                             comf vary,0                ;comparo y_mas_9 con NUEVO4,
                             bcf STATUS,0              
                             addwf NUEVO4,0     ;si NUEVO4>y_mas_9 c=1 y           
                             btfsc STATUS,0        ;por lo tanto vete a PROCESO1.
                             return                         ;salta Si c=0                
                             bcf STATUS,2        
                             movf y_mas_9,0
                             xorwf NUEVO4,0             
                             btfss STATUS,2        ;si NUEVO4=y_mas_9 salta y continua
                             goto BCD                  ;pero si NUEVO4<y_mas_9 vete a BCD
                             bcf STATUS,0           
                             movf x_mas_9,0
                             movwf varx
                             comf varx,0                ;Compara NUEVO2 con x_mas_9
                             addwf NUEVO2,0    ;Si NUEVO2>x_mas_9 c=1 vete a
                                                               ;PROCESO1                         
                             btfss STATUS,0        ;pero si C=0 vete a BCD                     
                             goto BCD
                             return

CONVERTIRaBCD  movlw 0x09
                                  movwf x_mas_9
                                  clrf y_mas_9                                 
                                  movlw 0x09
                                  movwf var
                                  movf memory1,0
                                  movwf NUEVO2
                                  movf memory2,0
                                  movwf NUEVO4                                 
COMPARARx9        bcf STATUS,2               
                                  movf var,0        
                                  xorwf y_mas_9,0
                                  btfss STATUS,2
                                  goto continuaX9
                                  bcf STATUS,2               
                                  movlw 0x99        
                                  xorwf x_mas_9,0
                                  btfsc STATUS,2
                                  goto COMPARARx999
continuaX9                 bcf STATUS,2               
                                  movlw 0x99
                                  xorwf x_mas_9,0
                                  btfsc STATUS,2              ;si x_mas_9= 99 vete a
                                  goto COMPARARx99    ; comparax99, si no es igual salta
                                  bcf STATUS,0
                                  movlw 0x66                     ;0x66 complemento de 0x99
                                  addwf x_mas_9,0
                                  btfss STATUS,0              ;Si carry =0 x_mas_9<99 vete a continua!
                                  goto CONTINUA1         ;Si x_mas_9>99 salta para ajustarl variable            
                                  movlw 0x09                     ;y producirle un incremento a y_mas_9
                                  movwf x_mas_9
                                  incf y_mas_9,1                      
                                         bcf STATUS,0  ;rutina que convierte a y_mas_9 en
                                                                   ;BCD                      
                                         movf var,0
                                         movwf vary
                                         comf vary,0        
                                         addwf y_mas_9,0       ;compara y_mas_9 con var=x9
                                         btfss STATUS,0         ;si c=0 y_mas_9<x9 vete a CONTINUA1
                                         goto CONTINUA1    ;si c=1 salta                      
                                         movlw 0xF0
                                         andwf y_mas_9,1
                                         movlw 0x10
                                         addwf y_mas_9,1
                                         movlw 0x10
                                         addwf var,1
                                         goto COMPARARx9   
CONTINUA1      call CONTINUA0
                             bcf STATUS,0
                             movlw 0x06
                             addwf NUEVO2,1
                             btfss STATUS,0
                             goto CONTINUA2
                             incf NUEVO4,1
CONTINUA2        bcf STATUS,0
                               movlw 0x10
                               addwf x_mas_9,1
                               goto COMPARARx9
COMPARARx99    call CONTINUA0
                                bcf STATUS,0
                                movlw 0x66
                                addwf NUEVO2,1
                               btfss STATUS,0
                               goto CONTINUA2
                               incf NUEVO4,1              
                               goto CONTINUA2
COMPARARx999   call CONTINUA0
                                 bcf STATUS,0
                                 movlw 0x06
                                 addwf NUEVO4,1
                                 bcf STATUS,0
                                 movlw 0x66
                                 addwf NUEVO2,1              
                                 btfss STATUS,0
                                 goto CONTINUA2
                                 incf NUEVO4,1
                                 goto CONTINUA2 
BCD     movf NUEVO4,0
             movwf NUEVO3
             movlw 0xF0
             andwf NUEVO4,1
             swapf NUEVO4,1
             movlw 0x0F
             andwf NUEVO3,1
             movf NUEVO2,0
             movwf NUEVO1
             movlw 0xF0
             andwf NUEVO2,1
             swapf NUEVO2,1
             movlw 0x0F
             andwf NUEVO1,1                                  

A continuación lo invito a disfrutar del siguiente video:

Después de mirar el video, ahora mostraré el diagrama del diseño de un termómetro digital:
Algo que también es importante implementar, es la fuente de alimentación de voltaje para nuestro termómetro:
En el circuito anterior, el diodo zener se encarga de mantener un voltaje estable de aproximadamente 5 volts, con ese voltaje se alimentara el termómetro y podrá funcionar sin problemas. Además, debemos asegurarnos de obtener un transformador de 120 volts a 16 volts o menos, también en lugar del transformador se puede emplear una batería de 12 volts o de 9 volts, pues independientemente del voltaje con el cual energizamos al termómetro, el diodo zener y un transistor conectados en configuración seguidor de emisor, se encargaran de mantener el voltaje a un valor muy cercano a 5 volts (obviamente el voltaje de alimentación deberá ser mayor de 5 volts para que con el diodo zener se mantenga a aproximadamente 5 volts).

Ahora mostraré la lista de los materiales involucrados en la construcción de este termómetro:

1 Puente de diodos 2W
1 Transistor NPN el BC548B
1 Diodo zener de 5.6 volts
2 Presets (o potenciómetros) de 10 k
1 push botton
2 capacitores electrolíticos, uno de 330 microFaradios a 25 volts y otro de 1000 microfaradios a 16v.
2 resistencias de 10 K a 1/4 Watt y 2 resistencias de 1K a 1/4 de Watt
1 capacitor cerámico de 22 picofaradios y otro capacitor cerámico de 220 picofaradios
1 sensor de temperatura LM35

1 Display de cristal líquido de 8 dígitos (LCD de caracteres no matiicial)

Después de conseguir el material mostrado en la lista anterior, lo único que hace falta es armar el circuito y probarlo en un protoboard o también conocido como tablilla de experimentación. También será necesario contar con un grabador de pics y descargar los siguientes programas:

http://www.filedropper.com/termometrodigital

Curiosamente para convertir de BCD natural a binario se puede emplear el mismo método, sólo que esta vez en lugar de sumar seis, se resta seis o simplemente se le suma el complementeo A2 de seis.


Convertir de BCD natural a binario el número 100 1001 (49 en decimal) a binario:


Si complemento de 00000 0110 es 11111 1001
el complemento A2 corresponde a  11111 1010


                                              100 1001    =   100 1001
                                          11111 1010       
                                          00100 0011          11 1001
                                          11111 1010
                                        000011 1101          10 1001
                                          11111 1010
                                          00011 0111            1 1001
                                          11111 1010   
                                          00011 0001          00 1001

En este caso para convertir de BCD a binario es hasta que se llegue a cero y nueve
http://www.monografias.com/trabajos3/bcd/bcd.shtml


http://es.wikipedia.org/wiki/Sistema_binario

 http://es.wikipedia.org/wiki/Sistema_decimal




8 comentarios:

  1. A primera vista, qué útil tu información. La leeré con detenimiento para después implementarla con integrados, pues con el PIC no hay gran dificultad. Muchas gracias por la información.

    ResponderEliminar
    Respuestas
    1. Espero que te hayan servido los aportes de un servidor tuyo. Un saludo.

      Eliminar
  2. No se mucho de este tema. El método descrito de que libro lo sacaste?

    ResponderEliminar
    Respuestas
    1. Ese método no lo saque de ningún libro, lo inventé jejeje.

      Eliminar
    2. Trataré de publicar nuevos inventos que he realizado, por el momento me tomé unas ricas vacaciones y ya no había publicado nada pero espero tratar de seguir siendo productivo. Creo que lo más importante y lo que me motiva a publicar en este blog es que tal vez todas las locuras de un servidor, le sean de utilidad a otros más. Un saludo y, ¡que tenga una excelente semana!

      Eliminar
  3. Disculpa este es para un PIC16f84a? Lo trate de correr y me salen varios errores

    ResponderEliminar
    Respuestas
    1. Este comentario ha sido eliminado por el autor.

      Eliminar
    2. ¿Qué errores te aparecen? Creo que tendré que volver a colocar el programa fuente, pues en el sitio donde lo subí, ya lo borraron. También tengo el programa ejecutable, si gustas te lo puedo enviar, perdón que me haya demorado en responder. Un saludo

      Eliminar