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

Temas similares

05/11/2010 #1


rutina de convercion binario a ascii.
Hola Amigos FELEC escribo por lo siguiente estoy contruyendo unas rutinas para lograr hacer un voltimetro de 0 a 24 volt .e comenzado de la siguiente forma . pase la entrada anloga a digital A/D luego con otra rutina tome ese valor binario y lo pase a bcd para luego supuestamente pasarlo a ascii pero tengo la siguiente duda no se como tomar los valores depositados en BCDL y RASCL (Al finalizar la rutina el numero BCD estara almacenado
en las variables BCDH y BCDL BCDH tendra el numero BCD mas significativo mientras que en BCDL se encontraran los dos numeros restantes, siendo el nibble alto de BCDL el mas significativo de los dos y el nibble bajo de BCDL el menos significativo.) entonces como encontre una rutina que transforma lo que esta en W a ascii no se como pasar el contenido que tengo en BCDH y BCDL a un solo registro asi tomarlo con esta rutina y posteriormente pasarlo a ASCCI para despues hacer algun arreglo y representar en el lcd .Adjunto rutina en construccion y esquema en proteus.Gracias.

Nota :Tengo varias experiencias efectuadas con micro 16f877a cuando termine este semestre subire cada una de ellas junto a sus respectivas simulaciones en proteus para qu asi le sirva a mas de alguno .
05/11/2010 #2

Avatar de ByAxel

Si son realmente solo números en BCD, tienes que sumar el ASCII cero "0" o da lo mismo el valor 48 a los resultados de las variables BCDH, BCDL, de ese modo los conviertes a ASCII.

saludos.
07/11/2010 #3


Gracias byAxel por tu respuesta pero sigo en la duda en la parte que tengo 2 valores uno en BCDH y el otro en BCDL en la rutina de Binario a BCD . ahora en la rutina de ascii que tengo necesito tener los dos registro en W para que asi esta la tome y la combierta en ascii como hago eso por lo que entiento no se si estare quivocado es que debo juntar el BCDH yBCDL para pasarlo a W para que asi lo tome la rutina de conversion a ASCII .ahora mi circuito es de 8 bit.si estoy equivocado en lo que estoy pensando como puedo hacer lo corecto.dejo la rutina a ascii.Gracias.

"ASCII"
;Esta subrutina convierte en código ASCII el byte existente en W.
;La conversión del cuarteto mayor se deposita en el registro RASCH
;y la del menor en RASCL.
;El tiempo máximo de subrutina es de 32 us, incluido el call.
;************************************************* *******************


ASCII: movwf TASC1 ;Guarda el número original.
call AJASC ;Ajusta cuarteto menor. Valor en W.
movwf RASCL ;Guarda ajuste de cuarteto menor.
swapf TASC1,W ;Permuta cuartetos para ajuste del mayor.
call AJASC ;Ajusta cuarteto mayor.
movwf RASCH ;Guarda conversión de cuarteto mayor.
return

AJASC: andlw B'00001111' ;Borra cuarteto mayor.
movwf TASC2 ;Salva valor.
sublw 9 ;Compara el número con 9.
btfss STATUS,C ;¿Número > 9? ¿Cifra o letra?
goto AJLET ;Si número > 9 (letra) salta a ajustarla.
movf TASC2,W ;Si W < ó = 9 (cifra) recupera valor.
addlw 0x30 ;Suma 30 para ajustar la cifra.
return

AJLET: movf TASC2,W ;Recupera valor.
addlw 0x37 ;Suma para ajuste en ASCII de letra.
return

END
07/11/2010 #4

Avatar de ByAxel

mmmm ya, entonces con la rutina ASCII que tienes debes de juntar BCDH y BCDL en uno solo?, en ese caso es algo así:

Por ejemplo si el valor es 18, luego de la rutina BinToBcd queda así:
Código:
BCDH = b'00000001' ; Es el 1
BCDL = b'00001000' ; Es el 8
Luego para unirlos en un solo registro y dejar el resultado en W:
Código:
swapf   BCDH, W  ; b'00010000'
iorwf   BCDL, W  ; b'00011000'
call    ASCII
...
-----------
Veo que tu rutina es completa ya que incluso lo usa para texto, pero me quedan mis dudas... supongo que estás usando fragmentos de código y los estás uniendo ya que pasar de BCD a ASCII solo para números es algo así:

Código:
movlw  BCDL ; BCDL = b'00000111'
addlw   .48 ; Luego de la suma = b'00110111' que es el "7" en ASCII.
48 decimal = 0x30 hexadecimal = "0" ascii

saludos.
08/11/2010 #5


Hola compañero gracias nuevamente por tu tiempo dentro de lo que me explicaste justo hice lo de la suma ayer en la noche segui tu recomendacion dentro de tu primera respuesta de sumarle el 48 decimal a cada bcdh y bcdl realice lo que esta en la rutina que te dejo acontinuacion para que le puedas hechar un vistazo primero es la conversion de BIN a BCD .en donde trabajo con la variable BIN el numero en binario el cual es convertido en BCDH yBCDL respectivamente luego dentro de esta rutina llamo a ASCIIH rutina que suma el .48 al BCDH y la rutina ASCIIL que suma el .48 al BCDL. bueno despues de efectuar la suma cada resultado los deposite en RESH (LO SUMADO A BCDH) y en en RESL(Lo sumado en BCDL).dentro de las rutinas sumas tengo la duda sobre el desbordamiento ya que hice algo corto al principio y despues por la red vi varias rutinas de sumas pero con BTFSC yINCF no se si vendra al caso hacer esto no se realmente .por lo que me decias efectivamente estoy uniendo rutinas de ejercicios que habia hecho a principios de semestre .bueno ByAxel gracias nuevamente que estes bien.Gracias.









;************************************************* **
;Rutina de conversion BINARIO A BCD
;************************************************* **


BIN8_BCD3
clrf BCDH
clrf BCDL
BCD_HIGH
movlw .100
subwf BIN,f
btfss STATUS,C
goto SUMA_100
incf BCDH,f
goto BCD_HIGH
SUMA_100
movlw .100
addwf BIN,f
movlw 0x0F
movwf BCDL
BCD_LOW
movlw .10
subwf BIN,f
btfss STATUS,C
goto SUMA_10
incf BCDL
movlw 0x0F
iorwf BCDL
goto BCD_LOW
SUMA_10
movlw .10
addwf BIN,f
movlw 0xF0
andwf BCDL,f
movf BIN,w
iorwf BCDL,f
clrf SUMH ;borra el valor del regitro SUMH
clrf SUML ;BORRA EL valor en SUML
movf BCDH,W
movwf SUMH ;SE GUARDA EL VALOR DE BCDH EN SUMH
movf BCDL,W
movwf SUML ;SE GUARDA EL VALOR DE BCDL EN SUML
CALL ASCIIH
CALL ASCIIL
CALL INICIAR_LCD

return







;************************************************* *******************
; "ASCII"
;************************************************* *******************
;El contenido de los registros SUMH y SUML, les sumo .48 o bien d'48'
;y colocar el resultado en RESH(alto) y RESL (bajo).
;************************************************* *******************

ASCIIH



movlw d'48'
movwf SUM48
movf SUMH,W ;Carga en W el contenido del registro.
addwf SUM48,W ;Suma W con contenido del registro SUM48.
movwf RESH ;Guarda W (resultado) en registro resh.
;btfsc STATUS,C ;¿Hay desbordamiento en la suma?
;incf SUMH,F ;Sí: incrementa resultado alto.
RETURN



ASCIIL



movlw d'48'
movwf SUM48
movf SUML,W ;Carga en W el contenido del registro.
addwf SUM48,W ;Suma W con contenido del registro SUM48.
movwf RESL ;Guarda W (resultado) en registro 41h.
btfsc STATUS,C ;¿Hay desbordamiento en la suma?
incf SUML,F ;Sí: incrementa resultado alto.
RETURN
08/11/2010 #6

Avatar de ByAxel

Si efectivamente que para convertir de binario a bcd requiere de ajustes pero para convertir de BCD a ASCII no es necesario -siempre que sean solo números de 0 al 9 en BCD- no existe desborde cuando se suma d'48'.
Me parece que el código que pones ya es parte de un contador cuyo resultado es en ASCII -el autor mezcla dos cosas en esa rutina- y para el caso, btfsc e incf no son necesarios.

saludos
08/11/2010 #7


hOLA ByAxel bueno quede claro con esos detalles pero sabes tengo la siguiente inconveniente pasa que probe mi programa con la rutina ascii pasando el BCDH y BCDL a un solo registro como lo indicaste en donde el registro Tasc1 toma el valor (BCDH+BCDL) en la rutina del ASCII en donde despues este me entrega 2 valores uno es RASCL y el otro el RASCH bueno despues pase a la etapa de tomar estos valores para presentarlos a un lcd .parace que no te conte pero INTENTO HACER UN un voltimetro. Bueno entonces como el trabajo anterior fue escribir en el LCD con 4 bit de entrada yo ocupe lo trabajado anteriormente pero lo pase a 8 bit pero tengo problemas en la parte de que se me veaN los valores del RASCL y RASCH .en el adjunto n°1 junte estos 2 valores en la rutina ASCII haciendo algo similar a la rutina BCD para luego tomar el valor completo del ASCCI y enviarlo al LCD pero no me sale ningun valor despues trabaje con la extraccion de estos dos valores por separado mostrados segun la intencion mia separados por coma y uno en la posicion 12 (RASCH) EN LA 13 ( LA ACOMA) Y EN LA 14 EL (RASCL) despues pense si el numero de salida es un 23 y si el 2 es el RASCH y el 3 es el RASCL y le pongo una coma sera 2,3 y estará malo entonces que de pegado en eso. tengo creo yo el inconveniente fianl bueno dentro de tu tiempo si puedes ver en que estoy chocando te adjuntare las 2 rutinas completas ademas del programa que tengo en el proteus en el cual los estoy simulando para que veas mi error.Gracias y sorry por tantas preguntas pero me dio cuenta que cuanto mas esto avanza con mas obstaculos me encuentro.Gracias nuevamente
Archivos Adjuntos
Tipo de Archivo: txt Copia de ASCII SOLO de BBCD.txt (8,9 KB (Kilobytes), 34 visitas)
Tipo de Archivo: txt Copia de separado con comas BBCD.txt (10,3 KB (Kilobytes), 18 visitas)
Tipo de Archivo: rar exp.n°6 voltimetro in 8 bit.rar (19,2 KB (Kilobytes), 27 visitas)
08/11/2010 #8

Avatar de ByAxel

Que tal...
le di una leida rápida y en la rutina del LCD en el bloque "SEGUNDA_LINEA" no pones para mostrar el dato en el LCD y te has equivocado ya que el PIC pierde el control luego de
Código:
movlw '=' 
call DATOS1
veo que el procedimiento no tiene mucha lógica (desorden) y en cierto modo el stack (pila) se va a desbordar con el tiempo.

Convertir de BinToBCD luego de BCDtoASCII lo hace bien, el problema es al mostrar; te pongo una forma rápida:

Código:
SEGUNDA_LINEA

		MOVLW b'11000000'		; COLOCA EL CURSOR EN LA SEGUNDA LINEA	
		CALL COMANDO

		movlw 'V' 	;coloco el dato que quiero escribir en la lcd en W
		call DATOS1	;y llamo a subrutina que lo va a desplegar en la pantalla
		movlw 'C' 
		call DATOS1
		movlw 'D' 
		call DATOS1
		movlw '=' 
		call DATOS1
		;call INICIAR_LCD3	
		;call conteo1
		movfw	RASCH
		call 	DATOS1
		movfw	RASCL
		call 	DATOS1
		return   ; Return te hace falta, sin esto pierde el control
de ese modo muestra dos dígitos en el LCD de RASCH y RASCL...

PD: El cblock lo cambie a CBLOCK 0x25

saludos
12/11/2010 #9


Hola amigo pasaba a darte las gracias por tu ayuda te contare que todavia estoy en este voltimetro me percate de algo que estaba hacien mal asi que tratare de probarlo nuevamente de ahi te contare como me fue .
Saludos
12/11/2010 #10


Hola compañero sabes al parecer tengo problemas en la conversion de BCD a ASCII ya que al ir variando el voltage de entrada por RA0 este valor de tension no se me refleja en el LCD aunque sea un valor aproximado al valor que estoy midiendo.Bueno la rutinade BINARIO a BCD la saque de la sgte direccion (http://micropic.wordpress.com/2007/0...corre-y-suma3/) la cual tiene una explicacion de como hace la conversion entonces segun lo que entendi en el BCDH esta el valor que le corresponde a la centena el que esta en nibble bajo de BCDH por lo que adjuntare mi codigo para que puedas verlo dentro de tu tiempo lo que intente hacer.Bueno despues al BCDH le sume directo el .48 ya que por lo que entendi en el nibble bajo de este esta el valor decimal a tomar cuyo valor final lo guarde en RESH luego trabaje con el BCDL cuyo valor los envie a RESLH y a RESLL para posteriormente trabajar en la rutina ASCIIM y la rutina ASCIIL respectivamente en el comentario del adjunto explico como supuestamente yo pienso que pueda ser pero al parecer tengo algun tipo de error ya que me sale una v .8 en el lcd y aunque varie la entrada este no cambia.Pasando a otro punto con dudas sobre el Vref+ que ajuste es de 2.56 v para obtener (2.56/256) 10mv por Bit.con el divisor de tension que hice con un voltaje de entrada de 24 volt. ahora entonces la idea es que al variar la entrada se vean estas variaciones en mi lcd Ej. si en la entrada ingreso 3.4 volt en la salida obtenga algo parecido unos 3.5 o lo mas cercano entonces mi duda es que si mi rutina de binario a bcd esta bien respecto a lo que pienso obtener al final o la rutina de BCD a ASCII es como pienso que es porque en realidad nome queda muy claro el calculo de las centenas ,decenas y unidades he leido la de divisiones mediante restas sucesivas y Numero Binario de 8 bits a BCD mediante el algoritmo Recorre y Suma+3 y todavia me siento debil en esta parte de la conversion ya que no me quedan muy claras esta rutinas como funcionan para separar centenas decenas y unidades.bueno amigo esas son mis dudas hasta hora y gracias nuevamente .adjunto la rutina completa.
Saludos
Archivos Adjuntos
Tipo de Archivo: txt fff de ASCII SOLO de BBCD.txt (8,7 KB (Kilobytes), 34 visitas)
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.