TODOPIC
Microcontroladores PIC => Almacén del Assembler => Mensaje iniciado por: julio_med en 21 de Septiembre de 2007, 03:56:26
-
buenas
la cuestion es esta:
tengo en dos registros dos numeros en ascii
ej:
reg1=3 en ascii
reg2=5 en ascii
lo que necesito es cojer estos registros y sumarlo (me imagino que sumarlos) para que queden asi: 35, y luego pasar este nuevo numero a binario b'00100011'.
gracias
-
Que tal Julio_med,
Primero que nada un saludo. Se entiende lo que necesitas hacer, pero si sumas dos numeros como en tu caso, no tiene sentido qeu si sumo 3 + 5 = 35??????
3+5 = 8, o no?. Sin animos de ofender, pero pienso que se te barrio.
El numero ascii 3 realmente es un 33 hexadecimal (0x33,$33,33h, segun la representacion que uses) y para el numero 5 ascii es un 35 hexadecimal. Ahora bien tienes estos dos registros, lo primero que tienes que hacer es convertir el registro reg1 que contiene el 33h, que representa para ti 3 decenas, esto quiere decir que representa el numero 30 decimal. Ahora bien como haces el proceso.
1.- Primero restale 30h al reg1, esto es reg1 = reg1 - 30h. Ejemplo: reg1 = $33 - $30 = $03, esto lo convierte a su valor en binario
2.- Ahora bien como este registro representa las decenas, quiere decir que lo tienes que multiplicar por 10, correcto?, esto es: reg1 = reg1 * 10
Ejemplo: reg1 = $03 * $0A = $1E
3.- ahora convierte las unidades en binario, que en tu caso es el registro2, esto es restale $30 a reg2.
reg2 = reg2 - $30. Ejemplo: reg2 = $35 - $30 = $05
4.- Ahora si, realizas la suma de los dos registros y obtienes el resultado que necesitas. binario = reg1 + reg1
Ejemplo: binario = $1E + $05 = $23
Este es un procedimiento, pero pueden exister otros.
Saludos y espero que te sirva.
Elreypic
-
ELREYPPIC
amigo gracias.
con la info pude hacer un programa que me funciona y pasa de ascii a binario
MOVLW 30H
SUBWF NUM1,F ;valor de las decenas
MOVLW 30H ;le resto 30h a cada numero ascii
SUBWF NUM2,F ;valor de las unidades
MOVLW .9
MOVWF COUNT
MOVF NUM1,W
MOVWF TEMP ;la forma de multiplicar *10 las decenas fue esta
TT MOVF TEMP,W
ADDWF NUM1,F
DECFSZ COUNT,F
GOTO TT
MOVF NUM2,W
ADDWF NUM1,F
esta forma; a mi poarecer, es poco elegante. si depronto sabes como hacerlo de otra forma me prodrias decir como? o vos que sos EL REY PIC te parece que esta bien :D
suerte y gracias
-
Que tal Julio,
Ahora si, "limosnero y con garrote" :D
Por que no solamente quieres la solucion sino que sea "elegante". Pues yo te recomiendo que le vistas de etiqueta. :D
Bueno menos bromas y mas accion.
A mi parecer el programa que hiscte es bueno y el codigo es relativamente sencillo. Existe una manera de hacer la multiplicacion un tanto mas sencilla y esta se realiza rotando a la izquierda el valor contenido en una variable. Esto hace que el valor se multiplique en 2. Ejemplo, si queremos multiplicar digamos 3 X 2, hacemos esto:
MOVLW 03H
MOVWF NUM
RLF NUM,F
Ahora bien si lo rotamos a la izquierda una vez mas el valor de NUM, entonces estariamos multiplicando 3 X 4, si la rotas una vez mas, seria 3X8.
Pero la pregunta es, como le hago para multiplicar NUM por 10. Lo hacemos asi (suponiendo que NUM = 3 dec)
RLF NUM,W ;W = NUM *2, esto es W = 6
MOVWF NUM ;NUM = 6
MOVWF AUX ;AUX = 6
RLF NUM,F ;NUM = NUM*2, esto es NUM =12
RLF NUM,W ;W = NUM*2, esto es W =24
ADDWF AUX,W ; W = 24 + 6, esto es W = 30
y entonces para obtener el binario del ascii, simplemente realizamos la suma de NUM2 con W, esto es
ADDWF NUM2,F ;NUM2 = NUM2 + 30
Asi de simple puedes hacerlo, esta es una forma mucho mas elegante, simple y mas eficiente.
Saludos y espero haber respondido tu duda. Perdon por no hacerlos antes, pero es muy dificil ingresar al foro como colaborador, ya que esta un poco enfermo el foro.
Elreypic.
-
Otra forma sería hacer un bucle nVeces que vaya sumando de 10 en 10 donde n es el número a multiplicar por 10.
El código sería mas o menos este:
clrw ;borra el registro w
movf numero,f ;mueve el número a si mismo para saber
btfsc status,z ;si el número es cero
goto salir ;sale del bucle
suma10
addlw .10 ;le suma 10 a w
decfsz numero,f ;decrementa número si es cero sale del bucle
goto suma10 ;sigue el bucle
salir
mowf decena ;guarda el resultado en el registro decena
espero te sirva, saludos!!
-
solo un apunte que creo que no teneis en cuenta en las rotaciones es que en esta operacion interviene el carry y si no lo borras te ensucia la operocion y te da resultados incorrectos.
es decir despues de cada RRF hay que hacer un BCF STATUS,C para garantizar que el bit que va a ingresar por la derecha es 0.
saludos