TODOPIC
Microcontroladores PIC => Almacén del Assembler => Mensaje iniciado por: dioskamisama en 04 de Febrero de 2006, 21:42:00
-
Hola, esta es una pregunta que ya hice... pero quiza no aclare lo suficiente la cuestion. Lo que quiero es poder recibir en hyperterminal (por ejemplo) un numero de 3 cifras que represente el valor de 8 bits del PIC
Por ejemplo si estoy contando quiero enviar el valor del contador via RS232 a la PC. Hasta ahora se me ocurrio este macro, pero creo que debe haber una forma mas sencilla en ASM
bin2decmacro macro _asus, _pato1, _pato2, _pato3
;(Probe usar Local, pero no lo sabre usar
movf _asus, w ;Copio el valor original para cuando
movwf bkconstante ;me paso con la resta restaurarlo
NIVEL1
movf _asus, w ;Lo mismo, lo que pasa que lo puse
movwf bkconstante ;despues, haciendo arreglos
movlw d"100"
subwf _asus,1 ;Decremento en 100
btfsc STATUS,C ;Saltar si no hay carry=Negativo
incf _pato1,1 ;Hay una centena!!!
btfsc STATUS,C ;Saltar si no hay carry=Negativo
goto NIVEL1 ;volver a revisar si puedo sacar 100
movfw bkconstante ;Si me pase=negativo
movwf _asus ;apurarse a restaurar el valor anterior
movlw 0Ah
movwf aux1 ;Cuento las decenas
Nivel2
decfsz _asus,f ;Decrementar saltar si termino
goto Nivel3 ;me voy fijando si llego a la decena
Goto Nivel4 ;Fin del calculo
Nivel3
decfsz aux1,1 ;decrementar Aux1 10-1
goto Nivel2 ;Sigo decrementando nro ppal
incf _pato2,1 ;Complete una decena!!!!
movlw 0Ah ;Recarlo las decenas para decrementar
movwf aux1
goto Nivel2
Nivel4
decf aux1,1 ;Como sali antes de llegar decremento
comf aux1,1 ;Calculo el complemento(uso dec no inc)
movlw d"245" ;Y pongo el complemento de una decena
subwf aux1,W ;Hago la resta
movwf _pato3 ;y paso las unidades
endm
Espero alguna idea ingeniosa... saludos
-
Hola dioskamisama, si mal no entiendo lo que tu estas haciendo en esa macro es tomar el byts y convertirlo en BCD, ¿es así?
Bueno, si es así lo que te esta faltando es que a cada digito del BCD le sumes D"48", con esto convertís los valores del BCD a ASCII, luego de lo anterior, realizas la transmisión de la manera convencional.
El Hyperterminal interpreta caracteres ASCII, por ese motivo debes sumarle 48 (en decimal) de esta forma los representara correctamente.
Con lo anterior serán indicados todos los valores uno detrás del otro.
Si tú deseas que el Hyperterminal te indique cada valor leído uno debajo del otro (en columna) deberás enviar seguidamente de lo anterior los datos:
H"0D" = retorno del carro
H"0A" = línea siguiente
Entonces, envías los 3 byts (sumándole 48) correspondientes a los caracteres BCD, enseguida envías H"0D" el cursor regresa al principio, y por ultimo envías H"0A" el cursor pasa a la línea inferior.
De esta ultima forma que te explico cada dato leído y convertido a BCD será indicado en el Hyperterminal uno debajo del otro por orden de llegada.
Espero esto sea lo que andás necesitando, suerte.
Un saludo
Atte. CARLOS