Buenas tardes compañeros, primeramente les agradezco toda su ayuda de antemano
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
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:
;************************************ 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:
;**************************************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.