TODOPIC
Microcontroladores PIC => Almacén del Assembler => Mensaje iniciado por: BrunoF en 09 de Mayo de 2006, 20:26:26
-
Buenas. Aqui les dejo una pequeña guía que he escrito para aquellas personas que quieren aprender a convertir valores entre los distintos Sistemas(Decimal, Hexadecimal y Binario).
Espero les sea de utilidad.
Saludos!
-
Hola Bruno, te a faltado el octal :D :D :D :D :D
Un saludo.
Atte. CARLOS.
-
Hola Charly! :lol: :lol:...Bueno...es verdad que no está. Pero sí pense en ponerlo cuando lo escribí. Sólo que como tiene poca popularidad, no pensé que valiera la pena...Pero no tengo problemas en agregarlo también.
Edito: La escribí a esta guía, porque cada vez veo que más gente tiene problemas para pasar valores entre los sistemas, o bien, se lanzan a programar sin saber esto, que resulta IMPORTANTE a la hora de escribir un programa, y FUNDAMENTAL a la hora de leer uno ajeno.Entonces, ahora en lugar de andar explicando en cada post por ejemplo que 0x09 = b'00001001' = .9, pueden postear el link a este post...
Un saludo!
-
Hola BrunoF, en realidad lo mio solo hiba de broma tal como ya te imaguinaste, no creo que sea necesario que expliques el octal :D, pero me parece muy buena tu idea para este tema, y que el interesado lo pueda consultar sin que para eso tenga que realizar un post.
Un saludo.
Atte. CARLOS.
-
Yo uso la calculadora que viene en el windows XP. Incluso la tengo en la barra de tareas.
Convierte todo lo que quieras. La unica pega es que si le metes binario (00110111) , no te pone los 0 del principio del byte (110111), pero es digerible :)
-
Yo uso la calculadora que viene en el windows XP. Incluso la tengo en la barra de tareas.
Convierte todo lo que quieras. La unica pega es que si le metes binario (00110111) , no te pone los 0 del principio del byte (110111), pero es digerible :)
Si pibe , la calculadora de Windows sirve para pasar de sistemas pero lo que expuso BrunoF es para pasar de sistema 'dentro del pic' durante la ejecución de un programa.
;)
-
Aps... mil disculpas :oops:
-
hola a todos
en estos monentos me encuentro con este problemita.
necesito pasar de DEC a HEX
ejemplo
12 35 -------04 D3
si es posible en ASM aun no aprendo C
pero esto en eso.
de antemano muchas gracias.
-
hola a todos
en estos monentos me encuentro con este problemita.
necesito pasar de DEC a HEX
ejemplo
12 35 -------04 D3
si es posible en ASM aun no aprendo C
pero esto en eso.
de antemano muchas gracias.
ma-tec te refieres a que tienes el dato en BCD y lo quieres pasar a HEXA?
Si lo tienes en decimal (dec) o en hexa es lo mismo. En la memoria se almacena binariamente y tu lo interpretas como te plazca (bin, hexa, dec).
Para pasar a BCD, OCTAL y ASCII sí hace falta una conversión.
Espero haberte entendido, sino por favor vuelve a preguntar.
-
mira el dato lo obtengo de otro dispositivo
y este lo entrega en bcd empaquetado
osea cuenta entre 0-9 nunca muestra a,b,c,d,e,f
y para poder procesar este dato "dividir" hay que hacerlo
en hex y el resultado que esta en hex se pasa sin problemas
a bcd
recibo el dato:
12 34 en decimal y 4d2 en hex
gracias:
-
Perdon, BrunoF (un abrazo de Marcos para vos), pero creo que hay un error en tu texto:
Pasaje entre sistemas:
1) Pasaje de Sistema decimal a Sistema binario:
Se realiza dividiendo por 2 al número decimal sucesivas veces. El valor correspondiente en Sistema Binario se obtiene
uniendo el resultado de la ultima división seguido de los RESTOS de la divisiones anteriores.
Ejemplo: .45 <-- esto es 45 en Sistema Decimal
Pasaje: 45/2 = 22 RESTO: 1
22/2 = 11 RESTO: 0
11/2 = 5 RESTO: 1
5/2 = 2 RESTO: 1
2/2 = 1 RESTO: 1
Como el dividendo(1) es menor al divisor(2), no dividímos más.
Ahora, para obtener el valor binario.Como ya he dicho, unímos el último resultado de la división seguído de los restos de las divisiones anteriores.
Comenzando por el resultado de la última división obtenemos: 1 (notese: 2/2 = 1)
Ahora, colocamos el RESTO de la última división DETRAS.Nos queda: 11
Seguido a esto, colocamos todos los RESTOS restantes DETRAS.
Siguendo esta logica, obtenemos: 111101
Entonces el valor binario correspondiente es: 111101
He allí el binario buscado.
NOTA: El valor obtenido posee un largo de 6. Un Byte contiene 8 bits. Por lo tanto, para pasar este valor a un byte
debemos anteponer tantos ceros como sea necesario para completar el largo de 8.
Por lo tanto: 111101
Lo pasamos a: 00111101
En asm, el valor se declararía así: b'00111101'
En realidad debe ser asi:
Pasaje: 45/2 = 22 RESTO: 1
22/2 = 11 RESTO: 0
11/2 = 5 RESTO: 1
5/2 = 2 RESTO: 1
2/2 = 1 RESTO: 0
Como el dividendo(1) es menor al divisor(2), no dividímos más.
Ahora, para obtener el valor binario.Como ya he dicho, unímos el último resultado de la división seguído de los restos de las divisiones anteriores.
Comenzando por el resultado de la última división obtenemos: 1 (notese: 2/2 = 1)
Ahora, colocamos el RESTO de la última división DETRAS.Nos queda: 11
Seguido a esto, colocamos todos los RESTOS restantes DETRAS.
Siguendo esta logica, obtenemos: 101101
Entonces el valor binario correspondiente es: 101101
Ese es en realidad el binario de 45 dec. :lol: :lol: :lol:
-
mira el dato lo obtengo de otro dispositivo
y este lo entrega en bcd empaquetado
osea cuenta entre 0-9 nunca muestra a,b,c,d,e,f
y para poder procesar este dato "dividir" hay que hacerlo
en hex y el resultado que esta en hex se pasa sin problemas
a bcd
recibo el dato:
12 34 en decimal y 4d2 en hex
gracias:
Bien ma-tec ahora te he comprendido , quieres pasar de BCD a HEX.
Lo hice hace tiempo y tendría que buscar la rutina (si me acuerdo donde está) pero básicamente lo que hacia era algo bastante manual.
Cargaba un registro con el dato de las unidades (siempre será un valor de 0 a 9). Luego llamaba a una rutina que me sumaba 'decenas' veces 10, a continuación otra rutina que me sumaba 'cien' centenas veces.
De esta forma, hacia esto (yo lo hacía en ensamblador pero lo escribo en notación humana para que se comprenda los pasos)
unidad = 4
decena = 3
centena = 2
miles = 1
A es una variable de 2 bytes o 16 bits.
A = 4
A = A + 10*decena // sumaba decenas veces 10
A = A + 100*centena // sumaba centenas veces 100
A = A + 1000*miles // sumaba miles veces 1000
Suena tonto pero era así lo que hacia (en ensamblador) y en realidad la rutina no debe ocupar mas de unos 20 o 30 lineas.
Si me das un tiempo la puedo buscar y la subo, para los 16F no?
/Edit:
PD: Al guardarlo en la memoria de esa forma se guarda en modo binario, es decir HEX o como lo quieras representar luego.
-
hola
mis preguntas son de novata novata.
estoy haciendo un proyecto que metiendole una señal analogica me la convierta a digital y me la envie por el puerto serie al ordenador y me salgan los numeros por el hyperterminal. el pic que uso es 16f876A.
mi pregunta es: cuando me hace la conversion a digital, el elnguaje es binario? en el ordenador me tendria que salir ceros y unos? porque menos ceros y unos me sale de todo. tendria que convertir el dato de binario a ascci? como lo hago?
yo solo quiero que me salga el valor de la tension que le meto en decimal (ej:2.3)
gracias
-
encontre una rutina la probe y
funciona.....aca la dejo.
; ++++++++++++++++++
; + DE BCD A BINARY +
; + BCDtoH +
; ++++++++++++++++++
cblock 20
H_byte
L_byte
R0
R1
R2
H_temp
L_temp
endc
;bcd 12 34
inicio movlw 34h
movwf R2
movlw 12h
movwf R1
clrf R0
CALL BCDtoB
;resultado
H_byte,0 ;04
L_byte,0 ;d2
end
mpy10b andlw 0Fh
addwf L_byte,f
btfsc STATUS,C
incf H_byte,f
mpy10a bcf STATUS,C
rlf L_byte,w
movwf L_temp
rlf H_byte,w
movwf H_temp
bcf STATUS,C
rlf L_byte,f
rlf H_byte,f
bcf STATUS,C
rlf L_byte,f
rlf H_byte,f
bcf STATUS,C
rlf L_byte,f
rlf H_byte,f
movf L_temp,w
addwf L_byte,f
btfsc STATUS,C
incf H_byte,f
movf H_temp,w
addwf H_byte,f
retlw 00h
BCDtoB clrf H_byte
movf R0,w
andlw 0fh
movwf L_byte
call mpy10a
swapf R1,w
call mpy10b
movf R1,w
call mpy10b
swapf R2,w
call mpy10b
movf R2,w
andlw 0fh
addwf L_byte,f
btfsc STATUS,C
incf H_byte,f
retlw 00h
a todos muchas gracias.
-
otra rutina de bin a bcd
; MONBRE ARCHIV0 : 40 BIN A BCD.asm
; MODIFICADO : 11/11/2002
; ARCHIVO BASICO : P16F874.inc
; FUNCION : CONVERSION 40 BITS A BCD
list p=16f874 ; Definicion de Procesador
#include <p16f874.inc> ; Definicion de Registros del Procesador
; Definicion de Variables locales
cblock 20
ibin
fm_outl
fm_outh
fm_outu
fm_outf
fm_outt
fm_in1l
fm_in1h
fm_in1u
fm_in1f
fm_in1t
endc
org 00
goto start
bin_bcd
movlw .40
movwf ibin ; Inicializa contador de bits
clrf fm_outl ; dato BCD = 0
clrf fm_outh
clrf fm_outu
clrf fm_outf
clrf fm_outt
goto inc_bcd ; Ve a incrementar BCD
badj
movlw 0x33 ; BCD = BCD+333333H
addwf fm_outl,f
addwf fm_outh,f
addwf fm_outu,f
addwf fm_outf,f
addwf fm_outt,f
movlw 0x03
btfss fm_outl,3 ; BCD(0:3)>=8?
subwf fm_outl,f ; else: BCD(LSB) = BCD(LSB)-3
btfss fm_outh,3 ; then: BCD(HSB)>=8?
subwf fm_outh,f ; else: BCD(HSB) = BCD(HSB)-3
btfss fm_outu,3
subwf fm_outu,f ; then: BCD(USB)>=8?
btfss fm_outf,3
subwf fm_outf,f ; else: BCD(USB) = BCD(USB)-3
btfss fm_outt,3
subwf fm_outt,f
movlw 0x30 ; then:
btfss fm_outl,7 ; BCD(4:7)>=8?
subwf fm_outl,f ; else: BCD(LSB) = BCD(LSB)-30
btfss fm_outh,7 ; then:BCD(8:15)>=8?
subwf fm_outh,f ; else: BCD(HSB) = BCD(HSB)-30
btfss fm_outu,7 ; then: BCD(20:23)>=8?
subwf fm_outu,f
btfss fm_outf,7
subwf fm_outf,f ; else: BCD(USB) = BCD(USB)-30
btfss fm_outt,7
subwf fm_outt,f
inc_bcd ; then:
rlf fm_in1l,f ; ls bit de BCD = ms bit de bin
rlf fm_in1h,f
rlf fm_in1u,f
rlf fm_in1f,f
rlf fm_in1t,f
rlf fm_outl,f
rlf fm_outh,f
rlf fm_outu,f
rlf fm_outf,f
rlf fm_outt,f
decfsz ibin,f ; contador = contador -1 = 0 ?
goto badj ; else: repite el ciclo
retlw 0 ; then: fin
start movlw 0
movwf fm_in1t
movlw 05
movwf fm_in1f
movlw 05b
movwf fm_in1u
movlw 093
movwf fm_in1h
movlw 0a2
movwf fm_in1l
;RESULTADO 89887650
call bin_bcd
dre goto dre
END ; Fin de Codigo
-
hola
mis preguntas son de novata novata.
estoy haciendo un proyecto que metiendole una señal analogica me la convierta a digital y me la envie por el puerto serie al ordenador y me salgan los numeros por el hyperterminal. el pic que uso es 16f876A.
mi pregunta es: cuando me hace la conversion a digital, el elnguaje es binario? en el ordenador me tendria que salir ceros y unos? porque menos ceros y unos me sale de todo. tendria que convertir el dato de binario a ascci? como lo hago?
yo solo quiero que me salga el valor de la tension que le meto en decimal (ej:2.3)
gracias
Hola aamoros79 te paso a responder.
1) La señal que te convierte el PIC se almacena SIEMPRE en una memoria en formato binario. Eso es como se almacena en la memoria luego tu lo lees como HEXA o BINARIO, pero eso lo haces a nivel de código y es tu 'forma' de representarlo. El dato en la memoria no cambiará. Si está almacenado un b'00100011' lo puedes ver así o como un 23h
2) El Hyperterminal trabaja con textos en ASCII, si tu mandas el dato tal cual lo lees estarás mandando un byte cuya representación ASCII pudiera ser cualquier cosa. Si mandas un 0x41 estarás mandando una A .
3) Para tener el valor de voltaje , tu pic debiera hacer una pequeña multiplicación que dependerá de la presición. Si trabajas con 8 bits será
Vtension = Vref * ( ValorAD / 255)
Si trabajas con 10 bits será
Vtension = Vref * (ValorAD / 1023)
Donde Vref es tu voltaje de referencia, gralmente 5V.
Esto te devolverá un resultado en coma flotante o float. (ojo si trabajas con ensamblador!!)
También hay formas de que trabajes con numeros solamente enteros pero no te quiero confundir con eso ahora.
4) Para tener por ej 3.2 tendrías que usar algun código que te permita pasar de float a ASCII. En C la instrucción printf suele hacer esto.
Ya que eres novata , como tu dices, te aconsejo que uses C o basic para codificar tu software.
Saludos