TODOPIC

Microcontroladores PIC => Almacén del Assembler => Mensaje iniciado por: BrunoF en 09 de Mayo de 2006, 20:26:26

Título: Aprendiendo a pasar valores entre los distintos Sistemas
Publicado 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!

Título: Re: Aprendiendo a pasar valores entre los distintos Sistemas
Publicado por: Chaly29 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.

Título: Re: Aprendiendo a pasar valores entre los distintos Sistemas
Publicado por: BrunoF 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!
Título: Re: Aprendiendo a pasar valores entre los distintos Sistemas
Publicado por: Chaly29 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.

Título: Re: Aprendiendo a pasar valores entre los distintos Sistemas
Publicado por: pibe 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 :)
Título: Re: Aprendiendo a pasar valores entre los distintos Sistemas
Publicado por: maunix 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.

;)
Título: Re: Aprendiendo a pasar valores entre los distintos Sistemas
Publicado por: pibe en 12 de Mayo de 2006, 09:03:56
Aps... mil disculpas  :oops:
Título: Re: Aprendiendo a pasar valores entre los distintos Sistemas
Publicado por: ma-tec 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.
Título: Re: Aprendiendo a pasar valores entre los distintos Sistemas
Publicado por: maunix 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.

Título: Re: Aprendiendo a pasar valores entre los distintos Sistemas
Publicado por: ma-tec 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:
Título: Re: Aprendiendo a pasar valores entre los distintos Sistemas
Publicado por: MGLSOFT 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:
Título: Re: Aprendiendo a pasar valores entre los distintos Sistemas
Publicado por: maunix 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.
Título: Re: Aprendiendo a pasar valores entre los distintos Sistemas
Publicado por: aamoros79 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
Título: Re: Aprendiendo a pasar valores entre los distintos Sistemas
Publicado por: ma-tec 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.
Título: Re: Aprendiendo a pasar valores entre los distintos Sistemas
Publicado por: ma-tec 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
Título: Re: Aprendiendo a pasar valores entre los distintos Sistemas
Publicado por: maunix en 19 de Mayo de 2006, 19:01:11
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