Autor Tema: Binario natural a BCD ayuda :(  (Leído 2671 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado Gusfavio

  • PIC12
  • **
  • Mensajes: 56
Binario natural a BCD ayuda :(
« en: 18 de Noviembre de 2013, 00:32:23 »
amigos tengo un problema, bueno supongo q todos se leyeron el libro pic16f84a no???
bueno vi el ejercicio que hay en el libro de convertir binario natural a BCD, bueno yo quise hacer mi propio algoritmo para hacer eso guiandome en la teoria del ejemplo, el problema es que me sale un resultado algo chueco, no se si mi algoritmo esta mal, o el programa, ya lo revise muchisimas veces,  el numero a convertir es 124



se los dejo los archivos incluido en proteus

PD: Estoy iniciandome en assembler con este libro
« Última modificación: 18 de Noviembre de 2013, 00:36:50 por Gusfavio »

Desconectado tapi8

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1506
Re: Binario natural a BCD ayuda :(
« Respuesta #1 en: 18 de Noviembre de 2013, 07:19:38 »
Aqui tienes un ejemplo:

Código: [Seleccionar]
;***************************
;*** Binario 8bits a BCD ***
;***************************

;<Binario>=><Centena, Decena,Unidad>

; REGISTROS
Binario

Centena
Decena
Unidad

;Rutina
Binario_BCD
movfw Binario
movwf Unidad
clrf Decena
clrf Centena
BCD_0
movlw d'10'
subwf Unidad,W
btfss STATUS,C
goto BCD_Fin
BCD_1
movwf Unidad
incf Decena,f
movlw d'10'
subwf Decena,W
btfss STATUS,C
goto BCD_0
BCD_2 clrf Decena
incf Centena,f
goto BCD_0
BCD_Fin

Esta sacado de este hilo, donde hay varias rutinas, de hecho se llama "rutinas para compartir", este ejemplo es por gentileza de Suki:

http://www.todopic.com.ar/foros/index.php?topic=23812.0

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Binario natural a BCD ayuda :(
« Respuesta #2 en: 18 de Noviembre de 2013, 14:24:53 »
Déjame decirte que para empezar la esquema que has publicado, está mal.

La pregunta debería ser Decenas = 9? y NO Decenas = 10, ya que no aparece en ningun momento el incremento de Decenas previo a la evaluación.

Si el esquema pusiese Unidades-10 y ahi mísmo Decenas++ ahí sí sería válido evaluar a Decenas = 10, pero así como está publicado, está mal.

Tu código corregido (no lo he probado):

Código: ASM
  1. ;*****************************************b-bcd****************************************************
  2. ;
  3. ;convertir un numero binario a bcd
  4. ;
  5. ;ZONA DE DATOS*************************************************************************************
  6.  
  7.       __CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
  8.       LIST p=16F84A
  9.       INCLUDE <P16F84A.INC>
  10.  
  11.       CBLOCK 0x0C
  12.       Unidades
  13.       Centenas
  14.       Decenas
  15.       ENDC
  16.  
  17. NUMERO EQU .124
  18.  
  19. ;ZONA DE CODIGOS***********************************************************************************
  20.  
  21.      ORG     0
  22. Inicio
  23.      bsf     STATUS,RP0
  24.      clrf    TRISA
  25.      clrf    TRISB
  26.      bcf     STATUS,RP0
  27. Principal
  28.      clrf    Centenas       ;Iniciamos en 0 la variable centenas  
  29.      clrf    Decenas        ;Iniciamos en 0 la variable decenas
  30.      movlw   NUMERO      
  31.      movwf   Unidades       ;asignamos valor a unidades
  32. Resta_10
  33.      movlw   .10
  34.      subwf   Unidades,W
  35.      btfss   STATUS,C       ;comprobamos si es mayor que 10
  36.      goto    BCD_Fin        ;si no es mayor se va a la ultima etapa
  37.      movwf   Unidades       ;Unidades es ahora Unidades - 10
  38. Decena_resta
  39.      movlw   .9
  40.      subwf   Decenas,W
  41.      btfss   STATUS,Z       ;Decenas == 9?
  42.      goto    Decena_resta2  ;si no es igual a 9 se va a la etapa 2
  43.      clrf    Decenas        ;vuelve a 0 Decenas
  44.      incf    Centenas,F     ;incrementa Centenas
  45.      goto    Resta_10       ;vuelve al ciclo
  46. Decena_resta2
  47.      incf    Decenas,F      ;incrementa decenas
  48.      goto    Resta_10       ;vuelve al ciclo
  49. BCD_Fin
  50.      swapf   Decenas,W      ;carga registro w con Decenas
  51.      addwf   Unidades,W
  52.      movwf   PORTB          ;mostramos resultado en el puerto B
  53.      movlw   Centenas       ;carga registro con Centenas
  54.      movwf   PORTA          ;mostramos resultado en el puerto A
  55.      END

Éxitos, vienes aprendiendo bien.
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado Gusfavio

  • PIC12
  • **
  • Mensajes: 56
Re: Binario natural a BCD ayuda :(
« Respuesta #3 en: 18 de Noviembre de 2013, 16:47:56 »
muchas gracias :) , tenes mucha razon, ahora el problema seria que las centenas no lasmuestra correctamente, pero eso lo revisare yo, lo publico si consigo arreglarlo

PD: como hago para que las direcciones como STATUS Y PORTA, etc me muestren de color verde como el ejmplo que pusiste? tengo la version 7.2, creo que por eso no puedo :/
« Última modificación: 18 de Noviembre de 2013, 17:24:43 por Gusfavio »

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Binario natural a BCD ayuda :(
« Respuesta #4 en: 18 de Noviembre de 2013, 18:04:23 »
Hola,

sí. Es verdad. No mas muestra bien porque hacías

 movlw   Centenas

en lugar de
movf Centenas,W

Los colores los hace el editor de este foro, no tiene nada que ver con el MPLAB!

Saludos.
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado Gusfavio

  • PIC12
  • **
  • Mensajes: 56
Re: Binario natural a BCD ayuda :(
« Respuesta #5 en: 18 de Noviembre de 2013, 18:12:18 »
por que no funciona movlw   Centenas?
basicamente la idea es la misma, que es lo que pasa?, si no es Centenas lo que muestra entonces que es?

PD: ok no me respondas, me confundi por que en un ejemplo usaba una constante NUMERO con esa instruccion, pero veo que con variables es si o si con la otra instruccion, pero aun asi que es lo que muestra si uso la que estaba usando en el codigo?
« Última modificación: 18 de Noviembre de 2013, 18:21:52 por Gusfavio »

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Binario natural a BCD ayuda :(
« Respuesta #6 en: 18 de Noviembre de 2013, 21:54:29 »
Hola,

si haces movlw Centenas

lo que estás haciendo es mover el valor literal (la dirección) de Centenas, que en el CBLOCK donde se la define se le asigna el valor 0x0D en este ejemplo. Así que en el PORTA veríamos el valor 0X0D siempre, independientemente del valor del contenido de la variable Centenas.
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado Gusfavio

  • PIC12
  • **
  • Mensajes: 56
Re: Binario natural a BCD ayuda :(
« Respuesta #7 en: 18 de Noviembre de 2013, 22:16:04 »
hey gracias, al principio pense que era el valor de la cadena en ASCII en binario (pero por la cantidad de caracteres, con desbordamiento) con algun tipo de error, pero es muy cierto lo que dices, quizas esa propiedad sea util en otro tipo de aplicacion

saludos

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Binario natural a BCD ayuda :(
« Respuesta #8 en: 18 de Noviembre de 2013, 23:32:25 »
[...]quizas esa propiedad sea util en otro tipo de aplicacion

Lo es, pero no es lo que buscas en este caso.

Saludos.
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5883
    • Picuino
Re: Binario natural a BCD ayuda :(
« Respuesta #9 en: 19 de Noviembre de 2013, 05:16:04 »
Otra forma de hacerlo:

Código: [Seleccionar]
   // Inicializar variables
   bin = 124
   char0 = 0
   char1 = 0
   char2 = 0

   // Convertir 8 bits
   for i = 1 to 8

      // Multiplicar por dos los numeros decimales
      char0 = char0 * 2
      char1 = char1 * 2
      char2 = char2 * 2

      // Comprobar si hay que añadir un bit a los numeros decimales
      if bin.bit8 == 1
         char0 = char0 + 1
      endif

      // Realizar el acarreo con los numeros decimales
      if char0>9
         char0 = char0 - 10
         char1 = char1 + 1
      endif

      if char1>9
         char1 = char1 - 10
         char2 = char2 + 1
      endif

      // Multiplicar por dos el número binario
      bin = bin * 2

   endfor

   // Convertir los números decimales en caracteres ASCII
   char0 = char0 + '0'
   char1 = char1 + '0'
   char2 = char2 + '0'


Las multiplicaciones por dos son desplazamientos a la izquierda (shift)
Como tiene pocas cifras (3) no he puesto un bucle. Para más cifras se puede utilizar un array para los caracteres y un bucle.

Por ejemplo para números de 6 cifras:
Código: [Seleccionar]
  bin = 124

   for i = 0 to 5:
      char[i] = 0
   endfor

   for i = 1 to 8
      for j = 0 to 5
         char[j] = char[j] * 2
      endfor

      if bin.bit8 == 1
         char[0] = char[0] + 1
      endif

      for j = 0 to 4
         if char[j] > 9
            char[j] = char[j] - 10
            char[j+1] = char[j+1] + 1
         endif
      endfor

      bin = bin * 2

   endfor

   for j = 0 to 5
      char[j] = char[j] + '0'
   endfor


Saludos.
« Última modificación: 19 de Noviembre de 2013, 05:20:03 por Picuino »


 

anything