Haz una pregunta
  Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

14/03/2013 #1

Avatar de jjcordoba

Convertir binario a bcd
Buenas, estoy tratando de hacer un convertir un numero binario a bcd (0-255) utilizando el pic 16f883. el codigo que estoy utilizando es el siguiente:

Código:
__CONFIG _CONFIG1,_CP_OFF & _WDT_OFF & _PWRTE_ON & _LVP_OFF

LIST		P=16F883
#INCLUDE	P16F883.INC	 

CBLOCK		0X20	;DECLARA VARIABLES EN LA MEMORIA RAM APARTIR DE LA DIRECCION 20
BCDH				;GUARDO LAS CENTENAS
BCDL				;GURADO UNIDADES Y DECENAS
BIN					;ALMACENO NUMERO BINARIO
ENDC

ORG			0X00			;DIRECION DE LA MEMORIA FLAHS
GOTO		CONFIGURACION	;SALTAR A LA ETIQUETA INICIO
ORG			0X05			;VOY A LA DIRECCION 5

CONFIGURACION

	NOP
;PARA EL PUERTO A LO CONFIGURO COMO DIGITAL
	BANKSEL ANSEL		;ESTA INSTRUCION VA AL BANCO DONDE ESTA ANSEL
	MOVLW	0X00		;CARGO EL REGISTRO DE TRABAJO (W) DE CEROS
	MOVWF	ANSEL		;LLEVO LO DE W A  ANSEL

;PARA EL PUERTO B LO CONFIGURO COMO DIGITAL
	MOVWF	ANSELH		;LLEVO LO DE W A ANSELH
	
;CONFIGURAR CRSITAL INTERNO
	BANKSEL	OSCCON		;VA AL BANCO DONDE ESTA OSCCON 
	MOVLW	0X61		;CRSITAL INTERNO Y A 4MHZ
	MOVWF	OSCCON		;LLEVO LO DE W A OSCCON
	
	MOVLW	0XFF		;CARGO W COMO ENTRADA
	ANDLW	B'11111111'	;HACE UNA OPERACION AND ENTRE W Y LO ESCRITO
	MOVWF	TRISA		;LLEVO LO DE W A TRISA
	MOVLW   B'00000000'	;CARGO EL REGISTRO DE TRABAJO (W) DE CEROS
  	MOVWF   TRISB		;LLEVO LO DE W A TRISB
  	MOVLW   B'00000000'	;CARGO EL REGISTRO DE TRABAJO (W) DE CEROS
  	MOVWF   TRISC		;LLEVO LO DE W A TRISC
	BANKSEL	PORTA		;VUELVO AL BANCO 0
	CLRF	PORTB		;DESATIVO TODOS LOS DISPLAYS
	CLRF	PORTC
		
INICIO
	MOVF	PORTA,W		;CAPTURO LO DEL PUERTO A Y GUARDO EN W
	MOVWF	BIN			;LLEVO LO DE W A BIN
	GOTO	BIN8_BCD3 	;VOY A BIN8_BCD3
 	MOVLW	BCDL		;CARGO A W CON UNIDADES Y DECENAS
	MOVWF	PORTB		;LLEVO W A PORTB
	MOVLW	BCDH		;CARGO A W CON CENTENAS
	MOVWF	PORTC		;LLEVO W A PORTC
  	GOTO 	INICIO 		;VOY A INICIO
 	 	

BIN8_BCD3
        CLRF	BCDH		;BORRO BCDH
        CLRF    BCDL		;BORRO BCDL
BCD_HIGH
        MOVLW   .100		;CARGO W CON 100
        SUBWF   BIN,F		;RESTO A BIN CON W
        BTFSS   STATUS,C	;
        GOTO    SUMA_100	;VOY A SUMA_100
        INCF    BCDH,F		;INCREMENTE A BCDH
        GOTO    BCD_HIGH	;VOY A BCD_HIGH
        
SUMA_100
        MOVLW   .100		;CARGO W CON 100
        ADDWF   BIN,F		;SUMO A BIN CON W
        MOVLW   0x0F		;CARGO W CON
        MOVWF   BCDL		;LLEVO W A BCDL
BCD_LOW 
		MOVLW   .10			;CARGO A W CON 10
        SUBWF   BIN,F		;RESTO A BIN W
        BTFSS   STATUS,C	;
        GOTO    SUMA_10		;VOYA SUMA_10
        INCF    BCDL		;INCREMENTO BCDL
        MOVLW   0x0F		;CARGO A W CON 
        IORWF   BCDL		;OR DE W CON LO ESCRITO
        GOTO    BCD_LOW		;VOY A BCD_LOW
SUMA_10 
		MOVLW   .10			;CARGO A W CON 10
        ADDWF   BIN,F		;SUMO A BIN CON W
        MOVLW   0xF0		;CARGO A W CON
        ANDWF   BCDL,F		;AND ENTRE W Y BCDL
        MOVF    BIN,W		;GUARDO BIN EN W
        IORWF   BCDL,F		;OR ENTRE BCDL Y W
        RETURN
       
END
el programa me compila pero no funciona, agradecería mucho su ayuda
14/03/2013 #2
Moderador

Avatar de D@rkbytes

No sé si tu código llegue a funcionar, pero por ahora haz lo siguiente...
Cambia tu palabra de configuración por esta.
Código:
    __CONFIG    _CONFIG1, _INTRC_OSC_NOCLKOUT & _LVP_OFF & _FCMEN_OFF & _IESO_OFF & _BOREN_OFF & _WDTE_OFF
    __CONFIG    _CONFIG2, _WRT_OFF & _BOR21V
Y no hagas un GOTO al ir a BIN8_BCD3, haz un CALL BIN8_BCD3

Suerte.
17/03/2013 #3


Hola Chango Cordoba, Ché mira, corri tu código en el "Debug" del MPLAB X IDE 1.3
por cierto solo la parte de la rutina que hace la conversión con unos cuantos valores y esta funcionando bien, ¿que es lo que te falla?.

Vos, ¿tenés en cuenta que el resultado de tus operaciones es una parte en BCD y la otra en BCD "empaquetado", al momento de "leer"/interpretar el resultado?

Adjunto parte de tu código que fue lo que corri en mi MPLAB, tambien adjunto una rutina que es la empleada por Mí para hacer esa conversión, la saque de:

http://piclist.com/techref/microchip...h-8b3d-jsv.htm

sitio con cantidad de cosas útiles en assembler para los PIC, visitala, no te pongas a inventar la rueda, si la rueda ya se invento.

Alguno me desburra, que demonios es el _CONFIG1, y el _CONFIG2, de:

__CONFIG _CONFIG1, _INTRC_OSC_NOCLKOUT & _LVP_OFF & _FCMEN_OFF & _IESO_OFF & _BOREN_OFF & _WDTE_OFF

__CONFIG _CONFIG2, _WRT_OFF & _BOR21V

que proponen en el encabezado de este micro, y esa "coma" ¿tiene que ir?, el ensamblador me la rechazo, solo compilo cuando puse un "&".
Archivos Adjuntos
Tipo de Archivo: txt Byte2BCD.asm.txt (3,1 KB (Kilobytes), 53 visitas)
Tipo de Archivo: txt rutina.CORDOBA.asm.txt (2,8 KB (Kilobytes), 25 visitas)
17/03/2013 #4

Avatar de jjcordoba

gracias por ambas respuestas, con respeto a psicodelico se que el valor esta guardado en bcd y bcd empaquetado, lo que quiero mostrar atravez de 3 display 7 segmentos uno por el puerto C (bcd) y los otro 2 por el puerto B (empaquetado). obteniendo el numero de 8 bits atravez del puerto A.
en cuanto al codigo no se como lograr mostrarlos. utulizo lo siguiente y es donde creo esta el error

GOTO BIN8_BCD3 ;VOY A BIN8_BCD3
MOVLW BCDL ;CARGO A W CON UNIDADES Y DECENAS
MOVWF PORTB ;LLEVO W A PORTB
MOVLW BCDH ;CARGO A W CON CENTENAS
MOVWF PORTC ;LLEVO W A PORTC
17/03/2013 #5


Che JJ, hay algún error en esa parte de tu código posteado...
Primero imagino que ya lo cazaste, es el asunto del Goto por el Call como te indicaron (y solo lo ponés para que mirando el código original uno no me pierda...).
Después:
MOVLW BCDL ;CARGO A W CON UNIDADES Y DECENAS
Eso no carga el valor de la variable, sino su dirección, debería ser:
MOVFW BCDL ;CARGO A W CON UNIDADES Y DECENAS
Idéntica situación se sucede con:
MOVLW BCDH ;CARGO A W CON CENTENAS
¿comprendes?

Mucho ojo y cuidado, a no confunfir las operaciones de mover registros. variables, metete en la cabeza

movlw 'literal' ;mueve un literal a W.
movwf var1 ;mueve W a la variable var1.
movfw var1 ;mueve variable var1 a W;

esto último no existe como una instruccion del PIC, el ensamblador lo traduce por:
movf var1,W

El asunto de MOVLW BCDL cuando BCDL se declaro como variable, es obtener su posición en la memoria RAM, ese truco se emplea cuando estás trabajando con direccionamiento indirecto (registros FSR & INDF).
¿capizca?
17/03/2013 #6

Avatar de jjcordoba

Muchas gracias el código ya me funciona bien, creéme que no había tenido en cuenta lo que me dices,
y de ahora en adelante muy presente estará. Gracias por la explicación y la ayuda dada.
Respuesta
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.