Autor Tema: Binario a BCD, no lo entiendo  (Leído 15801 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Loudness

  • PIC16
  • ***
  • Mensajes: 147
Binario a BCD, no lo entiendo
« en: 16 de Septiembre de 2014, 04:21:05 »
Hola a todos.

Lo primero que me vais a decir al ver el titulo es que pruebe el buscador del foro, que hay mucha informacion, o que busque por google que seguro que sale algo.
Pues ya lo he hecho, y aun asi escribo este post en busca de ayuda.

Hace tiempo que busque rutinas para convertir binario a BCD y sacar numeros por una pantalla LCD.
El caso es que no consegui entender el funcionamiento de dichas rutina. Al final por el metodo de ensayo/error consegui una rutina de 16 bits (la adjunto) que, aunque no la entiendo, pero funciona.

Mi problema es que ahora necesito una rutina mayor de 16 bits (20 o 24?) pero, como no entiendo el funcionamiento, no puedo modificarla, y las que he probado no sacan nada en la pantalla LCD.

Se puede modificar la rutina adjunta?
Alguien puede darme una explicacion (sencilla) sobre este tema?.

No suelo pedir programas o rutinas hechas, pero estoy desesperado(llevo semanas con este tema). Si alguien tiene una rutina que funcione se lo agradeceria.

Gracias por adelantado por sus respuestas.
Saludos.



Desconectado vixctor

  • PIC16
  • ***
  • Mensajes: 110
Re: Binario a BCD, no lo entiendo
« Respuesta #1 en: 16 de Septiembre de 2014, 06:53:44 »
El problema (en mi opinión) de la conversión de números binarios a BCD mayores a 16 bits, radica en que la rutina funciona en base a ciclos (loops) de acumulamiento, en donde cada ciclo va haciendo la conversión por "partes" por así decirlo...

Pero dado que es un ciclo anidado, convertir valores mayores a 16 bits resulta demasiado tardado, en mi caso, opté por crear una rutina que usa sumas directas en BCD, ocupa mucho más código, pero es bastante rápida, que es lo que al final del día buscaba para un proyecto (Mis conversiones llegan a ser de 40 bits!)

Si no tienes problemas por añadir mucho más código a tu programa podría ayudarte.

Saludos

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re: Binario a BCD, no lo entiendo
« Respuesta #2 en: 16 de Septiembre de 2014, 13:43:35 »
El método es bien simple.

Primero almacenas el número binario en una variable o array (depende del tamaño). Vamos a llamarla BIN

Luego preparas otro array donde van a ir los números BCD y lo borras entero. Vamos a llamarle BCD.

A continuación el proceso es el siguiente:

   1.- Sacas un bit de la variable BIN desplazando todos los bits una posición hacia la izquierda

   2.- Metes ese bit en la variable BCD desplazando todos los bits una posición hacia la izquierda

   3.- Compruebas desde el menor al mayor, que todos los números BCD son menores que 10.
        Si alguno es mayor que 10, le restas 10 y le añades uno al siguiente número BCD

   4.- Repites el punto 1 hasta que has acabado con todos los bits.


Rápido y efectivo.

Saludos.

Desconectado sander

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 627
Re: Binario a BCD, no lo entiendo
« Respuesta #3 en: 16 de Septiembre de 2014, 18:14:18 »
Yo encontre este metodo (recorre y suma 3) lo probe con 32 y 100 y funciona, para un numero de 24 bits habria que realizarlo con 24 corrimientos.

probe tambien el metodo de picuino y no funciono.

Saludos
La electrónica es el arte de manipular señales eléctricas que transportan información
Jan Davidse

Visita mi blog
Visita mi canal de youtube

Desconectado Loudness

  • PIC16
  • ***
  • Mensajes: 147
Re: Binario a BCD, no lo entiendo
« Respuesta #4 en: 16 de Septiembre de 2014, 21:24:14 »
vixctor: Gracias por la respuesta. En principio, estoy pensando un programa muy simple (leer una entrada, contar el numero de veces que cambia de estado, sacar el numero de 5 digitos en un display).
aunque la rutina de conversion se alarge no hay problema.

Picuino: Gracias por la respuesta. Mas o menos es el sistema que he leido en muchos sitios. Pero, como dice vixctor, pasando de 16 bits parece complicado. No he coseguido hacerlo con exito.

sander: Gracias por el link. Recorre y suma 3... no lo habia oido nunca. Lo leere con detenimiento.

Desconectado Loudness

  • PIC16
  • ***
  • Mensajes: 147
Re: Binario a BCD, no lo entiendo
« Respuesta #5 en: 17 de Septiembre de 2014, 03:38:42 »
He probado la rutina de "recorre y suma 3" que propuso sander y parece que funciona para 8 bits.
Es decir, metiendo 255 en la entrada, la salida alta sale '00000010' (02 en BCD) y en la salida baja '01010101' (55 en BCD) juntos forman el 255.
Inentare modificarla para 24 bits.

Sin embargo aqui me sale otra duda: Los numeros en BCD de la salida, como se pueden pasar a un LCD?.
La rutina que os envie, directamente saca cada numero en ASCII pra apasarlo directamente al LCD, pero no se muy bien como lo consigue...

Buscando y buscando veo que este es un tema bastante recurrente y no me extrana.
Aunque parece facil pero el tema de las matematicas en los PIC es bastante complicado para mi.

Saludos

Desconectado vixctor

  • PIC16
  • ***
  • Mensajes: 110
Re: Binario a BCD, no lo entiendo
« Respuesta #6 en: 17 de Septiembre de 2014, 05:30:57 »
He probado la rutina de "recorre y suma 3" que propuso sander y parece que funciona para 8 bits.
Es decir, metiendo 255 en la entrada, la salida alta sale '00000010' (02 en BCD) y en la salida baja '01010101' (55 en BCD) juntos forman el 255.
Inentare modificarla para 24 bits.

Sin embargo aqui me sale otra duda: Los numeros en BCD de la salida, como se pueden pasar a un LCD?.
La rutina que os envie, directamente saca cada numero en ASCII pra apasarlo directamente al LCD, pero no se muy bien como lo consigue...

Buscando y buscando veo que este es un tema bastante recurrente y no me extrana.
Aunque parece facil pero el tema de las matematicas en los PIC es bastante complicado para mi.

Saludos



Antes que nada, debes de ENTENDER que está haciendo tú código, eso es una regla FUNDAMENTAL al momento de programar en ensamblador, si tú mismo no sabes como es que el código funciona, puedes imaginar que sucederá al momento de hacer algo más complejo...

Analiza el problema primero, usa papel y lápiz y razona el proceso que quieres hacer antes que sentarte a codificar o a buscar código "similar" a lo que necesitas...

Preguntate 1ro, ¿Que es el código BCD?, ¿Cual es la diferencia entre BCD y HEXADECIMAL?

Te la pongo resumida: El codigo BCD expresa en NIBBLES (4 bits) un número cuyo valor va de 0 a 9, tal que representan una numeración base 10 como la usamos los humanos.

BCD JAMAS puede valer más de 9 unidades, y al pasar su valor de 9, el nibble se hará 0 y se generara una acarreo BCD, 9 + 1 = 0 "y llevamos 1"  <== Acarreo

Por el contrario, el código hexadecimal no es más que una REPRESENTACIÓN NUMÉRICA de un valor en binario, pero usando unidades o valores más entendibles para el ser humano.

El código hexadecimal, representa un NIBBLE (4 bits de datos), tal que posee 16 valores posibles: 2 a la 4 = 16, los cuales se representan así:

DEC    BIN     HEX  BCD
     0   0000    0      0000
     1   0001    1      0001
     2   0010    2      0010
     3   0011    3      0011
     4   0100    4      0100
     5   0101    5      0101
     6   0110    6      0110
     7   0111    7      0111
     8   1000    8      1000
     9   1001    9      1001
    10  1010    A      0001  0000
    11  1011    B      0001  0001
    12  1100    C      0001  0010
    13  1101    D      0001  0011
    14  1110    E      0001  0100
    15  1111    F       0001  0101

Acá los números se representan del 0 al 9 como en el código BCD, pero a partir del número 10, se representan como LETRAS de la A a la F

Tal que el número 255 se puede representar así:

255 en decimal

11111111 en binario

0xFF  en Hexadecimal

0010 0101 0101 en BCD

Los números hexadecimales como tal NO existen, es solo una manera simplificada de escribir (usando NIBBLES) un valor en binario puro, o sea, cuando nosotros leemos o escribimos valores, es mas fácil entender el número 240 como 0xF0 que si usaramos binario puro: 11110000

Sabiendo esto, y que el código BCD se expresa en NIBBLES, las operaciones que se hacen con ellos SIEMPRE ocupan 4 bits, y un byte, es capaz de guardar 2 digitos BCD.

Ahora bien, la rutina, que no entiendes como te funciona pero funciona, lo que hace para convertir un binario a BCD es lo siguiente:

Si el número binario es mayor a 9, se le suman 6 unidades ¿Por que?

Porque BCD solo puede usar 10 unidades (0 a 9) pero un nibble puede representar 16 valores, tal que:

si tuvieras el número 10 en binario (ocupando 1 byte) = 00001010

10 = 00001010  > 9?  
Si, sumas 6 unidades:

10 + 6 = 00010000  <== BCD

00010000 es el valor en BCD, ocupando 2 nibbles, tal que si los separas tendrías: 0001  0000  lo cual significa:  1 decena, 0 unidades

Si te das cuenta, cada nibble representa una potencia de 10, es decir, el primer nibble representa las unidades y el segundo nibble las decenas...

Si tuvieras el # 100 en BCD seria:  0001 00000000  el número ocuparía 3 nibbles y necesitarias 2 bytes para guardar los 3 nibbles (Aunque el 4to nibble = 0)

0001         0000       0000

Centenas  Decenas  Unidades

Entonces lo que hace tu loop es ajustar cada nibble de cada byte en binario, a su equivalente en BCD sumando de 6 en 6 unidades cada vez que un nibble sea mayor a 9.

Sumar 6 unidades ES LO MISMO que rotar a la izquierda (LO CUAL EQUIVALE A MULTIPLICAR x 2) y sumarle 3.... (3 x 2 = 6) Aunque es lo mismo, me imagino que ese método ha de ser mas rápido que sumar 6 unidades...

Bien, ahora, debes de buscar en google lo que es el codigo ASCII, que no es mas que una serie de tablas, en donde cada letra y símbolo alfanumérico está cotejado con un valor en binario (Las computadoras entienden binario, no alfanumérico).

En las tablas ASCII, encontraras que el número 0, cuando es representado como un CARACTER, tiene un EQUIVALENTE NUMERICO = 48, es decir, cada que tu tecleas el caractér "0" en tu PC, el teclado envía el código 48 (en binario), cuando escribes "1" el teclado envía el código 49  y así para todas los números, las letras mayúsculas, las letras minúsculas, los simbolos !"#$%&/())= etc...

Lo que hace el programa que tienes, una vez que ha obtenido todos los NIBBLES BCD, es simplemente sumarles el ASCII # 48 para convertir el valor BCD en un código ASCII.

La pantalla alfanumérica que estás utilizando, recibe la información a desplegar en ASCII, es por eso que al enviar los datos al LCD, estos deberán estar convertidos en su código ASCII equivalente.

Solo que acá toca observar un tema:

La rutina que utilizas utiliza 1 variable de 1 byte por cada NIBBLE BCD generado, tal que las variables Tenk, Thou, Hund, Tens, Ones Representan:

Tenk: DECENAS de MILLAR
Thou: UNIDADES de MILLAR
Hund: CENTENAS
Tens: DECENAS
Ones: UNIDADES

Sin embargo, no es la manera más eficiente o elegante de hacerlo:

Una conversión binario a BCD te (puede) generar una combinación de nibble tal que por ejemplo, el numero 2159 quedaría convertido así:

0010 0001 0101 1001, lo cual guardado en una serie de variables, llamemosles  digit_32 y digit_10 te quedaría así:

digit_32 = 00100001   <= 2 millares, 1 centena
digit_10 = 01011001   <= 5 decenas, 9 unidades...

En una rutina así, para convertir digit_32 y digit_10 a código ASCII se haría lo siguiente:

Código: [Seleccionar]
    swapf  digit_32,w     ; Intercambio los nibbles MSB <=> LSB, ya que primero se envian los millares...
     andlw  0x0F             ; Enmascaro los bits de los millares, para eliminar los bits de las centenas...
     addlw  d'48'            ; Al sumarle 48 al WORK, el número se ha convertido a un caracter ASCII!
     movwf LCD_Value    ; LCD_Value es el registro de SALIDA de la rutina Send_LCD
     call      Send_LCD    ; Envio los millares a la pantalla LCD....

     movf   digit_32,w    ; Ahora se enviaran las centenas, no es necesario intercambiar los nibbles
     andlw  0x0F            ; Enmascaro los bits de las CENTENAS, para eliminar los bits de los MILLARES.
     addlw  d'48'            ; Al sumarle 48 al WORK, el número se ha convertido a un caracter ASCII!
     movwf LCD_Value    ; LCD_Value es el registro de SALIDA de la rutina Send_LCD
     call      Send_LCD    ; Envio los millares a la pantalla LCD....

     swapf   digit_10,w    ; Intercambio los nibbles MSB <=> LSB, ya que primero se envian las decenas
     andlw   0x0F           ; Enmascaro los bits de las decenas, para eliminar los bits de las unidades...
     addlw  d'48'            ; Al sumarle 48 al WORK, el número se ha convertido a un caracter ASCII!
     movwf LCD_Value    ; LCD_Value es el registro de SALIDA de la rutina Send_LCD
     call      Send_LCD    ; Envio los millares a la pantalla LCD....

    movf     digit_10,w    ; Ahora se enviaran las unidades, no es necesario intercambiar los nibbles
    andlw    0x0F           ; Enmascaro los bits de las unidades, para eliminar los bits de las decenas
     addlw  d'48'            ; Al sumarle 48 al WORK, el número se ha convertido a un caracter ASCII!
     movwf LCD_Value    ; LCD_Value es el registro de SALIDA de la rutina Send_LCD
     call      Send_LCD    ; Envio los millares a la pantalla LCD....

Listo, eso sería todo, por favor toma en cuenta que una parte CRUCIAL en ensamblador, es DOCUMENTAR el código que haces.

Documentar NO es TRADUCIR los nemotécnicos o lo que estas haciendo:  movf   var,w   ; Muevo la variable var a W   (Si el lector NO es tonto, ya se sabe lo que hace movf)

Documentar es escribir en tus propias palabras, lo que ESTAS haciendo o PORQUE lo estas haciendo, tal que algún día, cuando necesites algún código para otro programa, y haya pasado el tiempo, te sea muy fácil saber que hace cada rutina, por que lo hace, cuales son sus variables de entrada, cuales las de salida etc...

Documentar, te ayuda a entender lo que estas haciendo e inclusive es una manera rápida y segura de poder encontrar algún bug durante la programación.

Documentar es un HABITO que a todos nos cuesta al principio, pero es la manera PROFESIONAL de hacerlo:  Si algún día vendes un proyecto a una empresa, entregarle un archivo ASM sin documentar es como darles el HEX y dejarlos que se hagan pelotas en saber que demonios hace el programa que te COMPRARON!.

Saludos y ojala te sea de ayuda.
« Última modificación: 17 de Septiembre de 2014, 06:52:07 por vixctor »

Desconectado vixctor

  • PIC16
  • ***
  • Mensajes: 110
Re: Binario a BCD, no lo entiendo
« Respuesta #7 en: 17 de Septiembre de 2014, 05:42:35 »
Por cierto, algún día, cuando domines completamente el manejo de caracteres y el uso del LCD alfanumérico, podrás hacerte de algo así:


Eso se hace fácilmente en el LCD alfanumérico ya que puedes crear tus propios "caracteres ASCII"

Saludos.

PD: Imagina un programa así, de unas 6000 lineas de código (aprox), si no estuviera documentado... sería un dolor de cabeza  8)

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re: Binario a BCD, no lo entiendo
« Respuesta #8 en: 17 de Septiembre de 2014, 05:57:00 »

probe tambien el metodo de picuino y no funciono.

Saludos

En lenguaje normal es difícil expresar la rutina. Luego hay que tener en cuenta detalles como el acarreo, etc.
Yo tengo una rutina propia que me funciona con el método que puse, que está tomado de la mayoría de los programas que aparecen en esta página:

http://www.piclist.com/techref/microchip/math/radix/index.htm

Ahí está el código fuente con todos los detalles para que funcione.

Saludos.

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re: Binario a BCD, no lo entiendo
« Respuesta #9 en: 17 de Septiembre de 2014, 06:44:25 »
Este funciona:

Código: [Seleccionar]
/*
   Programa para convertir Binario a BCD
*/

#include <stdio.h>


#define  BIN_DIGITS  32
#define  BCD_DIGITS  10


void main(void) {
   unsigned long bin = 987654321;
   char bcd[BCD_DIGITS];
   char carry;
   int bin_dig, bcd_dig;

   // Borra dígitos BCD
   for(bcd_dig = 0; bcd_dig < BCD_DIGITS; bcd_dig++)
      bcd[bcd_dig] = 0;

   // Convierte BIN to BCD
   for(bin_dig = 0; bin_dig < BIN_DIGITS; bin_dig++) {

      // Extraer último bit binario de la derecha
      if ((bin & (1<<(BIN_DIGITS-1))) > 0)
         carry = 1;
      else
         carry = 0;
      bin = bin << 1;

      // Añadir bit binario por la derecha en número BCD
      for(bcd_dig = 0; bcd_dig < BCD_DIGITS; bcd_dig++) {
         bcd[bcd_dig] = (bcd[bcd_dig] << 1) + carry;
         carry = 0;
         if (bcd[bcd_dig] >= 10) {
            bcd[bcd_dig] -= 10;
            carry = 1;
         }
      }
   }

   // Convierte BCD a ASCII e imprime
   for(bcd_dig = BCD_DIGITS - 1; bcd_dig >= 0; bcd_dig--) {
      bcd[bcd_dig] += '0';
      printf("%c", bcd[i]);
   }
   printf("\n");

}

Saludos.

P.D.:
Sustituyo la variable i por la variable bcd_dig, más expresiva.
« Última modificación: 17 de Septiembre de 2014, 08:59:42 por Picuino »

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re: Binario a BCD, no lo entiendo
« Respuesta #10 en: 17 de Septiembre de 2014, 09:01:18 »
Para ejecutarlo sin compilar, se puede utilizar este diminuto y potente intérprete de código C:
 
   http://bellard.org/tcc

Descargas:

   http://download.savannah.gnu.org/releases/tinycc


Ejecutar:

   tcc.exe -run programa.c


Saludos.

Desconectado Loudness

  • PIC16
  • ***
  • Mensajes: 147
Re: Binario a BCD, no lo entiendo
« Respuesta #11 en: 17 de Septiembre de 2014, 11:46:00 »
Lo primero agradecer a vixctor su explicacion.
He buscado por la web incontables horas sobre este tema pero, esta es sin duda la mejor explicacion que he recibido.
Ahora solo me queda aplicarla por mi mismo para crear una rutina que se ajuste a mis necesidades, algo que para mi nivel puede llevarme lustros.

Tambien acepto el enfado, deberia conocer lo que estoy utilizando y no copiarlo simplemente. Tengo que admitir, que todavia no estoy al nivel de hacer cosas grandes y por eso, con su ayuda, sigo estudiando y aprendiendo. Hace unos meses ni siquiera podria copiar nada porque no tenia ni idea de como adaptarlo, asi que, quiero pensar que voy evolucionando.

En cuanto al video del medidor de nivel, es impresionante. Hacer algo asi he implementarlo en un amplificador de audio es mi sueno... pero de momento vuelvo al bcd...

He visitado la pagina que recomienda Picuino y he probado una rutina de 24bit to bcd 8 digits (by Oliver Broad).
El caso es que al implementarla, metiendo las tres entradas a 255(decimal), en la salidas sale lo siguiente:

R0 => 0000 0010
R1 => 1000 1111
R2 => 0101 1100
R3 => 0001 0101

Segun la explicacion, en BCD no hay por encima de 10. Sin embargo, en R1 sale 1111 (15 en decimal), o en R2 sale 1100 (12 en decimal).
No es la primera vez que me pasa esto al probar rutinas ya hechas y, a pesar de la explicacion, no entiendo el significado.

Hay que pensar directamente que la rutina esta mal?. Hay algo que se me escapa?.

Para Picuino:  Gracias por el codigo que me envias, pero, me da verguenza decirlo, pero no tengo ni idea de c. Sin embargo, la pagina web que me envias esta en ensambaldor asi que creo que me sera de ayuda.
« Última modificación: 17 de Septiembre de 2014, 11:48:02 por Loudness »

Desconectado Loudness

  • PIC16
  • ***
  • Mensajes: 147
Re: Binario a BCD, no lo entiendo
« Respuesta #12 en: 17 de Septiembre de 2014, 11:50:24 »
Os envio la rutina de la que hablo arriba. OS envio la original de la pagina web, aunque yo la modifique para un pic16f877a.
Esa modificacion  tiene algo que ver con el resultado???.



     LIST P=16C73
        INCLUDE P16C73.INC
        CBLOCK  20H
        R3,R2,R1,R0        ;MUST START ON BINARY XXXXX000.
        COUNT, LBYTE, MBYTE, HBYTE
        ENDC
        ORG     0
MAIN    MOVFW   PORTB
        MOVWF   LBYTE
        MOVFW PORTB
        MOVWF MBYTE
        MOVFW   PORTB
        MOVWF   HBYTE
        CALL    BIN2BCD
        GOTO    MAIN
BIN2BCD MOVLW   18H
        MOVWF   COUNT
        CLRF    R0
        CLRF    R1
        CLRF    R2
        CLRF    R3
        BCF     STATUS,C
        GOTO    BIN2BC2
BIN2L   MOVLW   R3
        MOVWF   FSR
BCDADJ  MOVLW   03H
        ADDWF   INDF,F
        BTFSS   INDF,3
        SUBWF   INDF,F
        MOVLW   30H
        ADDWF   INDF,F
        BTFSS   INDF,7
        SUBWF   INDF,F
        INCF    FSR,F
        BTFSS   FSR,2
        GOTO    BCDADJ
BIN2BC2 RLF     LBYTE,F
        RLF  MBYTE,F
        RLF     HBYTE,F
        RLF R3,F
        RLF     R2,F
        RLF     R1,F
        RLF     R0,F
        DECFSZ  COUNT,F
        GOTO    BIN2L
        RETLW   0
        END

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re: Binario a BCD, no lo entiendo
« Respuesta #13 en: 17 de Septiembre de 2014, 13:37:48 »
Para Picuino:  Gracias por el codigo que me envias, pero, me da verguenza decirlo, pero no tengo ni idea de c. Sin embargo, la pagina web que me envias esta en ensambaldor asi que creo que me sera de ayuda.

Aprender el c que he escrito es más fácil que entender esas rutinas en ensamblador. Merece la pena dedicarle un poco de tiempo al c.


Te adapto el código c a código python para 24 bits.
Es fácil de entender incluso sin saber python (otro lenguaje de programación que suelo utilizar para probar rutinas de este tipo porque parece pseudocódigo):

Código: Python
  1. binary = 123456
  2. bcd = [0, 0, 0, 0, 0, 0, 0, 0]
  3.  
  4. for i in range(0, 24):
  5.    
  6.     carry = 0
  7.     if (binary & 0x800000) > 0:      # Si el bit 24 vale uno
  8.         carry = 1
  9.     binary = binary * 2
  10.  
  11.     for j in range(0, 8):
  12.        bcd[j] = bcd[j] * 2 + carry
  13.        carry = 0
  14.        if (bcd[j] >= 10):
  15.            bcd[j] = bcd[j] - 10
  16.            carry = 1
  17.  
  18.  
  19. print bcd

Saludos.
« Última modificación: 17 de Septiembre de 2014, 13:41:51 por Picuino »

Desconectado Loudness

  • PIC16
  • ***
  • Mensajes: 147
Re: Binario a BCD, no lo entiendo
« Respuesta #14 en: 17 de Septiembre de 2014, 21:10:28 »
Gracias por su tiempo.

Todo el mundo me dice que debo pasarme al c, que es mas facil, pero ahora mismo no dispongo de tiempo para ponerme a estudiar de nuevo. Seguire intentandolo con el ensamblador.

En cuanto al python, es bastante intuitivo, pero aun asi no se muy bien como pasarlo al ensamblador...



He visitado la pagina que recomienda Picuino y he probado una rutina de 24bit to bcd 8 digits (by Oliver Broad).
El caso es que al implementarla, metiendo las tres entradas a 255(decimal), en la salidas sale lo siguiente:

R0 => 0000 0010
R1 => 1000 1111
R2 => 0101 1100
R3 => 0001 0101

Segun la explicacion, en BCD no hay por encima de 10. Sin embargo, en R1 sale 1111 (15 en decimal), o en R2 sale 1100 (12 en decimal).
No es la primera vez que me pasa esto al probar rutinas ya hechas y, a pesar de la explicacion, no entiendo el significado.

Hay que pensar directamente que la rutina esta mal?. Hay algo que se me escapa?.

Para Picuino:  Gracias por el codigo que me envias, pero, me da verguenza decirlo, pero no tengo ni idea de c. Sin embargo, la pagina web que me envias esta en ensambaldor asi que creo que me sera de ayuda.

Alguien puede explicarme el porque de la pregunta de arriba? Mirando el codigo con detenimiento deberia funcionar (o eso creo) pero sin embargo sale un resultado mayor que 9 en BCD...
Se que no debo pedir demasiado, pero todavia estoy bastante confundido con este tema.

Saludos