Autor Tema: Aprendiendo a pasar valores entre los distintos Sistemas  (Leído 6800 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Aprendiendo a pasar valores entre los distintos Sistemas
« 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!

"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado Chaly29

  • Moderador Global
  • DsPIC33
  • *****
  • Mensajes: 4315
Re: Aprendiendo a pasar valores entre los distintos Sistemas
« Respuesta #1 en: 09 de Mayo de 2006, 22:54:34 »
Hola Bruno, te a faltado el octal  :D  :D  :D  :D  :D

Un saludo.

Atte. CARLOS.

La teoría es cuando se sabe todo y nada funciona. La práctica es cuando todo funciona y nadie sabe por qué.

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Aprendiendo a pasar valores entre los distintos Sistemas
« Respuesta #2 en: 10 de Mayo de 2006, 00:58:06 »
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!
« Última modificación: 10 de Mayo de 2006, 01:04:54 por BrunoF »
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado Chaly29

  • Moderador Global
  • DsPIC33
  • *****
  • Mensajes: 4315
Re: Aprendiendo a pasar valores entre los distintos Sistemas
« Respuesta #3 en: 10 de Mayo de 2006, 10:31:06 »
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.

La teoría es cuando se sabe todo y nada funciona. La práctica es cuando todo funciona y nadie sabe por qué.

Desconectado pibe

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 635
Re: Aprendiendo a pasar valores entre los distintos Sistemas
« Respuesta #4 en: 12 de Mayo de 2006, 06:52:29 »
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 :)
Mi jefe mirando el prototipo que estoy creando: "Y eso va a funcionar?"

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: Aprendiendo a pasar valores entre los distintos Sistemas
« Respuesta #5 en: 12 de Mayo de 2006, 07:44:12 »
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.

;)
- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado pibe

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 635
Re: Aprendiendo a pasar valores entre los distintos Sistemas
« Respuesta #6 en: 12 de Mayo de 2006, 09:03:56 »
Aps... mil disculpas  :oops:
Mi jefe mirando el prototipo que estoy creando: "Y eso va a funcionar?"

Desconectado ma-tec

  • Colaborador
  • PIC12
  • *****
  • Mensajes: 76
    • www.matec.es.tl
Re: Aprendiendo a pasar valores entre los distintos Sistemas
« Respuesta #7 en: 17 de Mayo de 2006, 09:36:40 »
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.
LA CLAVE DEL EXITO ES SABER
PARA DONDE VA LA GENTE Y
LLEGAR PRIMERO.

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: Aprendiendo a pasar valores entre los distintos Sistemas
« Respuesta #8 en: 17 de Mayo de 2006, 12:59:36 »
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.

- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado ma-tec

  • Colaborador
  • PIC12
  • *****
  • Mensajes: 76
    • www.matec.es.tl
Re: Aprendiendo a pasar valores entre los distintos Sistemas
« Respuesta #9 en: 17 de Mayo de 2006, 13:40:18 »
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:
LA CLAVE DEL EXITO ES SABER
PARA DONDE VA LA GENTE Y
LLEGAR PRIMERO.

Desconectado MGLSOFT

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 7912
Re: Aprendiendo a pasar valores entre los distintos Sistemas
« Respuesta #10 en: 17 de Mayo de 2006, 14:22:50 »
Perdon, BrunoF (un abrazo de Marcos para vos), pero creo que hay un error en tu texto:

Citar
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:
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: Aprendiendo a pasar valores entre los distintos Sistemas
« Respuesta #11 en: 17 de Mayo de 2006, 15:50:12 »
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.
- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado aamoros79

  • PIC10
  • *
  • Mensajes: 46
Re: Aprendiendo a pasar valores entre los distintos Sistemas
« Respuesta #12 en: 18 de Mayo de 2006, 05:24:41 »
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

Desconectado ma-tec

  • Colaborador
  • PIC12
  • *****
  • Mensajes: 76
    • www.matec.es.tl
Re: Aprendiendo a pasar valores entre los distintos Sistemas
« Respuesta #13 en: 18 de Mayo de 2006, 11:34:18 »
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.
LA CLAVE DEL EXITO ES SABER
PARA DONDE VA LA GENTE Y
LLEGAR PRIMERO.

Desconectado ma-tec

  • Colaborador
  • PIC12
  • *****
  • Mensajes: 76
    • www.matec.es.tl
Re: Aprendiendo a pasar valores entre los distintos Sistemas
« Respuesta #14 en: 18 de Mayo de 2006, 11:51:57 »
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
LA CLAVE DEL EXITO ES SABER
PARA DONDE VA LA GENTE Y
LLEGAR PRIMERO.


 

anything