Autor Tema: [Ayuda] Binario a BCD.  (Leído 2444 veces)

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

Desconectado NicaUnlock

  • PIC10
  • *
  • Mensajes: 20
[Ayuda] Binario a BCD.
« en: 27 de Marzo de 2016, 09:37:33 »
Buenas tardes compañeros, primeramente les agradezco toda su ayuda de antemano  :mrgreen: el inconveniente que tengo es con el siguiente código el cual es sacado del libro MICROCONTROLADOR PIC 16F84A. En el ejemplo a continuación el numero a convertir es 124 yo lo hice el mismo pero con el numero "147" me hice un colocho pero al final logre compilar aunque con algunos pasos de mas pues soy muy nuevo en esto  :shock: veran en el ejemplo del libro la salida en los LEDS ya simulado en proteus es 24 --> 0010 0100(En codigo BCD). Pues mis salidas deberian de ser 47--> 0100 0111(En codigo BCD) Pues resluta que si obtengo esas salidas pero al revés y no se por que??  :? yo obtengo a la salida lo siguiente: 1110 0010 Como pueden ver es el mismo numero pero visto de atras para adelante... Es algo como ver el numero 147 representado de la siguiente forma 741 osea de derecha a izquierda  :(

Codigo del libro:

Código: [Seleccionar]
;************************************ BCD_01.asm ****************************************
;
; ===================================================================
;   Del libro "MICROCONTROLADOR PIC16F84. DESARROLLO DE PROYECTOS"
;   E. Palacios, F. Remiro y L. López. www.pic16f84a.com
;   Editorial Ra-Ma.  www.ra-ma.es
; ===================================================================
;
; Un número binario de 8 bits es convertido a BCD. El resultado se guarda en tres posiciones
; de memorias llamadas Centenas, Decenas y Unidades. Además al final las unidades estarán en el
; nibble bajo del registro W y las decenas en el nibble alto. En los diodos LEDs conectados al
; puerto de salida se visualizarán las decenas y las unidades.
;
; El máximo número a convertir será el 255 que es el máximo valor que puede adquirir el
; número binario de entrada de 8 bits.
;
; El procedimiento utilizado es mediante restas de 10 tal como se explica en el siguiente
; ejemplo que trata de la conversión del número 124 a BCD:
;
; (Centenas) (Decenas) (Unidades) ¿(Unidades)<10?       ¿(Decenas)=10?
; ---------- --------- ---------- -------------- -------------------------
;
;    0     0    124 NO, resta 10 Incrementa (Decenas).
;    0     1    114 NO, resta 10 NO. Incrementa (Decenas).
;    0     2    104 NO, resta 10 NO. Incrementa (Decenas).
;    0       3     94 NO, resta 10 NO. Incrementa (Decenas).
;    0     4     84 NO, resta 10 NO. Incrementa (Decenas).
;    0     5     74 NO, resta 10 NO. Incrementa (Decenas).
;    0     6     64 NO, resta 10 NO. Incrementa (Decenas).
;    0     7     54 NO, resta 10 NO. Incrementa (Decenas).
;    0     8     44 NO, resta 10 NO. Incrementa (Decenas).
;    0     9     34 NO, resta 10 NO. Incrementa (Decenas).
;    1     0     24 NO, resta 10 Sí. (Decenas)=0, y además
;         incrementa (Centenas)
;    1     1     14 NO, resta 10 NO. Incrementa (Decenas)
;    1     2      4 SÍ, se acabó.
;
; El número a convertir será la constante NUMERO.
;
; ZONA DE DATOS **********************************************************************

LIST P=16F84A
INCLUDE <P16F84A.INC>
__CONFIG _CP_OFF &  _WDT_OFF & _PWRTE_ON & _XT_OSC

CBLOCK 0x0C ; La zona de memoria de usuario comienza en esta
Centenas ; dirección de memoria RAM de datos.
Decenas ; Posición 0x0D de RAM.
Unidades ; Posición 0x0E de RAM.
ENDC

NUMERO EQU .124 ; Por ejemplo.

; ZONA DE CÓDIGOS ********************************************************************

ORG 0         ; El programa comienza en la dirección 0.
Inicio
bsf         STATUS,RP0 ; Acceso al Banco 1.
clrf         TRISB ; Las líneas del Puerto B se configuran como salida.
bcf         STATUS,RP0 ; Acceso al Banco 0.
Principal
clrf         Centenas         ; Carga los registros con el resultado inicial.
clrf         Decenas ; En principio (Centenas)=0 y (Decenas)=0.
movlw NUMERO
movwf Unidades         ; Se carga el número binario a convertir.
BCD_Resta10
movlw .10         ; A las unidades se les va restando 10 en cada
subwf Unidades,W         ; pasada. (W)=(Unidades)-10.
btfss  STATUS,C         ; ¿(C)=1?, ¿(W) positivo?, ¿(Unidades)>=10?.
goto BIN_BCD_Fin        ; No, es menor de 10. Se acabó.
BCD_Incrementa  Decenas
movwf     Unidades ; Recupera lo que queda por restar.
incf             Decenas,F ; Incrementa las decenas y comprueba si llega a
movlw     .10 ; 10. Lo hace mediante una resta.
subwf     Decenas,W ; (W)= (Decenas)-10.
btfss            STATUS,C ;  ¿(C)=1?, ¿(W) positivo?, ¿(Decenas)>=10?.
goto BCD_Resta10 ; No. Vuelve a dar otra pasada, restándole 10.
BCD_IncrementaCentenas
clrf Decenas ; Pone a cero las decenas
incf Centenas,F ; e incrementa las centenas.
goto BCD_Resta10 ; Otra pasada, resta 10 al número a convertir.
BIN_BCD_Fin
swapf Decenas,W ; En el nibble alto de W también las decenas.
addwf Unidades,W ; Las unidades están en el nibble bajo de W.
movwf PORTB ; Se visualiza por el puerto de salida.
sleep ; Queda permanentemente en reposo.

END         ; Fin del programa.

; ===================================================================
;   Del libro "MICROCONTROLADOR PIC16F84. DESARROLLO DE PROYECTOS"
;   E. Palacios, F. Remiro y L. López. www.pic16f84a.com
;   Editorial Ra-Ma.  www.ra-ma.es
; ===================================================================



Aqui tienen mi codigo:

Código: [Seleccionar]
;**************************************TABLA_BCD******************************************************
; Un número binario de 8 bits es convertido a BCD. El resultado se guarda en tres posiciones
; de memorias llamadas Centenas, Decenas y Unidades. Además al final las unidades estarán en el
; nibble bajo del registro W y las decenas en el nibble alto. En los diodos LEDs conectados al
; puerto de salida se visualizarán las decenas y las unidades.
;
; El máximo número a convertir será el 255 que es el máximo valor que puede adquirir el
; número binario de entrada de 8 bits.
;
; El procedimiento utilizado es mediante restas de 10 tal como se explica en el siguiente
; ejemplo que trata de la conversión del número 147 a BCD:
;
; (Centenas) (Decenas)   (Unidades) ¿(Unidades)<10?     ¿(Decenas)=10?
; ----------   ---------     ---------- ----------------         -------------------------
;         0     0         147         No, Restamos 10     NO, Incrementa (Decenas).
;         0     1         137         No, Restamos 10     No, Incrementa (Decenas).
;         0     2         127        No, Restamos 10     No, Incrementa (Decenas).
;         0     3         117         No, Restamos 10     No, Incrementa (Decenas).
;         0     4         107         No, Restamos 10     No, Incrementa (Decenas).
;         0     5           97        No, Restamos 10     No, Incrementa (Decenas).
;         0     6           87        No, Restamos 10     No, Incrementa (Decenas).
;         0     7           77         No, Restamos 10     No, Incremetna (Decenas).
;         0     8           67        No, Restamos 10     NO, Incrementa (Decenas).
;         0     9           57        No, Restamos 10     No, Incrementa (Decenas).
;         1     0           47         No, restamos 10     Si, y ademas de eso incrementa
;                                             Centenas.
;         1     1          37        No, Restamos 10     No, Incrementa (Decenas).
;         1     2          27        No, Restamos 10     No, Incrementa (Decenas).
;         1     3          17        No, Restamos 10     No, Incrementa (Decenas).
;         1     4            7        Si, aqui Se acabó.        Se Incrementa (Decenas por ultima vez).
;
;*********************************************BCD_147*************************************************

   
LIST     P=16F84A                                                ;Procesador a utilizar.
INCLUDE     <P16F84A.INC>                                        ;Librerias del PIC16F84A.
__CONFIG    _CP_OFF &_WDT_OFF &_PWRTE_ON &_XT_OSC      ;Grabador seleccionado.

CBLOCK  0X0C ;Inicia en la posicion de memoria OX0C(12).
CENTENAS ;Posicion 13 de memoria de los GPR.
DECENAS ;Posicion 14 de memoria de los GPR.
UNIDADES ;Posicion 15 de memoria de los GPR.
ENDC ;Finaliza la instruccion CBLOCK.
   
NUMERO EQU            d'147'

;*****************************************INICIO_DEL_PROGRAMA*****************************************

ORG 0

INCIO bsf STATUS,RP0                         ;Ingreso al BANCO,1.
        clrf TRISB                         ;PORTB configurado como salida.
        bcf STATUS,RP0                         ;Ingreso al BANCO,0.

PRINCIPAL clrf         CENTENAS                 ;Centenas inicia en valor 0.
        clrf    DECENAS                 ;Decenas inicia en valor 0.
        movlw      NUMERO                 ;Mueve la constante NUMERO al registo W.
        movwf      UNIDADES                 ;Carga W en UNIDADES. Osea UNIDADES=147.    

RESTA.UNIDADES          movlw d'10'         ;Carga el registro W con el valor en decimal 10.
                         subwf UNIDADES,W ;Realiza la resta UNIDADES-W.
                         btfss STATUS,C ;Si el resultado de la resta es positivo salta. C=1.
                         goto FINAL_SALIDA ;Se acabó C=0 UNIDADES<10.  

INC.DECENAS                  movwf UNIDADES ;Recupera el resultado d la resta y lo guarda en UNIDADES.
                         movlw d'10'         ;Carga el litera d'10' en W.
                         subwf DECENAS,W ;Resta DECENAS-W.
                         btfss STATUS,Z ;Z=1? DECENAS=10?.
                         btfsc STATUS,C ;C=0? resultado negativo? Salta.
                         goto INC.CENTENAS ;Z=1 resultado de la resta "0" => incrementa CENTENAS.
                         incf         DECENAS,F ;C=0 resultado resta negativo => incrementa DECENAS.
                         goto RESTA.UNIDADES ;UNIDADES<10 y tambien DECENAS<10 => repite la resta.

INC.CENTENAS          Incf         CENTENAS,F ;Incrementa CENTENAS en 1na unidad.
                         clrf         DECENAS ;Al incrementar CENTENAS, DECENAS vuelve a "0".
                         incf         DECENAS,F ;DECENAS toma el valor de 1.
                         goto RESTA.UNIDADES ;Vuelte a restar hasta obtener UNIDADES<10.

FINAL_SALIDA          swapf DECENAS,W ;0100 0000 ->SWAP DECENAS.
                        addwf UNIDADES,W ;Suma UNIDADES + DECENAS.
                        movwf PORTB ;El resultado se manda a la salida "PORTB".
                        END                 ;FIN del programa.

Caber recalcar que en el codigo del libro reemplace el numero 124 por 147 y da exactamente la misma salida-->    1110 0010 Entonces me viene la interrogante, que esta mal aqui?? El ckto de proteus lo dejo como archivo adjunto para que solo compilen el codigo y lo monten en proteus.

De antemano les vuelo a agradecer mucho su ayuda pues al final obtuve el resultado pero al revez y no se si es problema mia, del proteus o de que??. Mil gracias!!

Saludos.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:[Ayuda] Binario a BCD.
« Respuesta #1 en: 27 de Marzo de 2016, 09:59:41 »
Tu problema esta aca:

Código: ASM
  1. INC.DECENAS                  movwf      UNIDADES                ;Recupera el resultado d la resta y lo guarda en UNIDADES.
  2.                                          movlw  d'10'                           ;Carga el litera d'10' en W.
  3.                                          subwf  DECENAS,W               ;Resta DECENAS-W.
  4.                                          btfss  STATUS,Z                ;Z=1? DECENAS=10?.
  5.                                          btfsc  STATUS,C                ;C=0? resultado negativo? Salta.
  6.                                          goto   INC.CENTENAS    ;Z=1 resultado de la resta "0" => incrementa CENTENAS.
  7.                                          incf           DECENAS,F               ;C=0 resultado resta negativo => incrementa DECENAS.
  8.                                          goto   RESTA.UNIDADES  ;UNIDADES<10 y tambien DECENAS<10 => repite la resta.

Esta mal, primero que no incrementaste decenas antes sino que luego tenes 2 BTFSS/BTFSC no se para que realmente.

Explico brevemente el como funciona el codigo. Lo que hace es Restar 10 en 10 a Unidades, si resta y el numero es positivo, o mejor dicho Unidades es mayor o igual que 10. Entonces deberias guardar el valor de unidades e incrementar en 1 las decenas. Luego preguntas si las decenas llego a 10, si es asi entonces la pones a 0 e incrementas las centenas.

Ademas no tenes creado un loop infinito. Todo programa tiene que estar encerrado en un solo loop infinito.

Tu programa, como debiera ser:

Código: ASM
  1. RESTA.UNIDADES           
  2.         movlw   d'10'
  3.         subwf   UNIDADES,W
  4.         btfss   STATUS,C
  5.         goto    FINAL_SALIDA
  6.                
  7. INC.DECENAS                  
  8.         movwf   UNIDADES
  9.         INCF    DECENAS, F              ; Incremento decenas por que pude restar 10 antes
  10.         movlw   d'10'
  11.         subwf   DECENAS,W
  12.         btfss   STATUS,Z
  13.         goto    RESTA.UNIDADES          ; Linea modificada
  14.         CLRF    DECENAS                 ; LLego a 10, entonce pongo decenas a 0 y aumento centenas
  15.         incf    CENTENAS,F              ; Linea modificada
  16.         goto    RESTA.UNIDADES
  17.                
  18. FINAL_SALIDA           
  19.         swapf   DECENAS,W
  20.         addwf   UNIDADES,W
  21.         movwf   PORTB
  22.         GOTO    PRINCIPAL
  23.         END

Centenas no tiene ningun control ya que en 8 bits podes pasar solo de 0 a 255, lo cual como maximo va a valer 2.

Desconectado NicaUnlock

  • PIC10
  • *
  • Mensajes: 20
Re:[Ayuda] Binario a BCD.
« Respuesta #2 en: 27 de Marzo de 2016, 11:34:48 »
Sos un barbaroKILLERJC gracias por la ayuda en verdad q hice cosas de mas y no acomodo bien las cosas aun.  :(

Muchas gracias por la pronta ayuda q me diste.  :)

Saludos!!