Autor Tema: Subrutina que pase 16bits en HEXA a 24bits en BCD  (Leído 4264 veces)

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

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Subrutina que pase 16bits en HEXA a 24bits en BCD
« en: 23 de Julio de 2004, 11:28:00 »
Hola,

Podría alguien pasarme una subrutina que pase 16bits en hexadecimal a 24bits en BCD o decimal.

Es decir, si tengo ffff en HEXA que lo pase a 65535 en DECIMAL.

En el pic si hay 2 registros con:
reg1 = 0xff
reg2 = 0xff

pues que en otros 3 registros lo pase a decimal:
reg3 = 0x06
reg4 = 0x55
reg5 = 0x35

Sé que es posible hacerlo ya que tengo una subrutina que pasa 8 bits en HEXA a 16 bits en DECIMAL (0xff sería igual a 0x0255).

Gracias


Desconectado T0ni0

  • PIC16
  • ***
  • Mensajes: 196
RE: Subrutina que pase 16bits en HEXA a 24bits en BCD
« Respuesta #1 en: 24 de Julio de 2004, 03:21:00 »
Pues semejante rutina no tengo,
primero por que no sabría que hacer con ella,
segundo por que 16 bits son muchos, pero vamos a intentar esclarecer cual es el procedimiento:

lo primero, que son los numeros BCD?
http://www.monografias.com/trabajos3/bcd/bcd.shtml

Tenemos que tener muy claro el significado de numeros hexadecimales binarios y decimales primero.

Haremos el ejemplo con 8 bits ok

Pongamos por ejemplo el número decimal 74, pues bien si haces:

MOVLW D"74"

O

MOVLW 0X4A

O

MOVLW B"01001001"

O

MOVLW A"J"   ;74 ES EL CARACTER ASCII "J"

Con todas estas instrucciones SIEMPRE se va a cargar el mismo valor en el wreg,
lo que canvia es el significado que tu le des.


Bueno ahora tenemos el numero decimal 74 en el Wreg y lo queremos pasar a BCD,
este codigo es una representación directa de 0 a 10 de grupos de 4 bits ( bit 0 peso 1, bit 2 peso 2, bit 3 peso 4 y bit 4 peso 8),
asín de simple el valor de cada 4 bits separados sín sumar

si tenemos el d"74" B"0100 1001"  en BCD será 7 4   0111 0100.

Creo que ahora ta todo más claro no?

Pues ahora biene lo bueno la forma más habitual es hacer una tabla de correspondéncia

binario      BCD
0000 0000   0000 0000
0000 0001   0000 0001
.
.
.

.
.
.
0100 1001   0111 0100
.
.
.

Asín me lo enseñaron en el cole, ah! no se pueden representar todos los números ( BCD es de 0 a 10 en binario de 0 a 15)

Si alguien sabe una rutina de conversión que lo diga,por que con la tabla a 16 bits ......

Aunque por lo que posteas :

HEXA a 16 bits en DECIMAL (0xff sería igual a 0x0255)


creo que el problema no era pasar a BCD si no de comprensión, 0xff ya es 255 decimal.

O eso o yo voy muy confundido, quizas explicando para que es...
- T0ni0 -
30RCF112

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
RE: Subrutina que pase 16bits en HEXA a 24bits en BCD
« Respuesta #2 en: 24 de Julio de 2004, 10:09:00 »
No era necesaria la explicación, pero gracias.

Voy a usar la subrutina de 16bits en HEXA a 24bits en BCD para sacar datos a un LCD. EL usuario no entendería una temperatura de AF°C... es necesario ponérsela en decimal: 175°C.

La subrutina que pasa 8bits de HEXA a 16 en BCD es la siguiente:



;
;               EJEMPLO 1.9
;
;            Autor: Mikel Etxebarria
;         (c) Microsystems Engineering (Bilbao)
;
;Ejemplo para simulación
;
;Convierte el valor binario presente en posición 0x10 en BCD. El resultado se deposita
;en las variables Buffer_H y Buffer_L.
      
      List   p=16F84a      ;Tipo de procesador
      include   "P16F84a.INC"   ;Definiciones de registros internos

Binario      equ   0x10      ;Valor binario inicial
Buffer_H   equ   0x11      ;Parte alta del resultado
Buffer_L   equ   0x12      ;Parte baja del resultado
Temp_1      equ   0x13      ;Registro temporal

      org   0x00      ;Vector de Reset
      goto   Inicio

      org   0x05      ;Salva el vector de interrupción

Inicio           movf   Binario,W   ;Carga el valor binario inicial
            clrf    Buffer_L
                clrf    Buffer_H   ;Inicia registros de trabajo
                                     
BIN_BCD_1       addlw    0xf6             ;Resta 10 mediante suma de complemento a 2.
                btfss    STATUS,C          ;Hay Carry?
                goto    BIN_BCD_3       ;NO.
                movwf    Temp_1            ;SI.Guardar en registro temporal.
                incf    Buffer_L,F      ;Incrementar byte bajo, guardarlo y enviar...
                movf    Buffer_L,W      ;..copia al ==> W...
                xorlw    b"00001010"       ;..0Ah xor W.
                btfss    STATUS,Z          ;Buffer_L es igual a 10 ??
                goto    BIN_BCD_2       ;NO.
                clrf    Buffer_L        ;SI. Poner Buffer_L a 0
                incf    Buffer_H,F      ;Incrementar Buffer_H
BIN_BCD_2       movf    Temp_1,W        ;Recuperar el dato.
                goto    BIN_BCD_1       ;Continuar la operación.

BIN_BCD_3       addlw    H"0A"             ;TEMPO + 0Ah
                swapf    Buffer_L,F        ;<3:0> <==> <7:4> y ==> Buffer_L
                iorwf    Buffer_L,F        ;W OR Buffer_L ==> Buffer_L

Stop         nop            ;Poner breakpoint de parada
            nop

            end         ;Fin del programa fuente


Si pones, por ejemplo, 0xff en el registro Binario, en los registros Buffer_H y Buffer_L aparecerá 0x02 y 0x55 respectivamente.

Si quieres compila este programa y comprueba los cambios.

Si llegas a encontrar una subrutina que pase los 16 hexas a 24 decimales pues por favor avísame.

Desconectado Duende_Azul

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 908
RE: Subrutina que pase 16bits en HEXA a 24bits en BCD
« Respuesta #3 en: 24 de Julio de 2004, 18:12:00 »
MigSantiago, a ver si paseas mas por el foro, te sorprenderias de las las cosas que pueden encontrar.

http://miarroba.com/foros/ver.php?temaid=1103921&foroid=79706

Si eso no te sirve, busca en la pagina de microchip, en la parte de notas de aplicación, hay algoritmos referentes a eso que quieres.

Saludos.

Desconectado pietrodilaccua

  • PIC10
  • *
  • Mensajes: 46
RE: Subrutina que pase 16bits en HEXA a 24bits en BCD
« Respuesta #4 en: 24 de Julio de 2004, 19:29:00 »
hola mi amigo,
creo que yo tengo una rutina que hace lo que quires, ahora no estoy con mis archivos, durante la proxima semana te enviare lo que tengo.

mucha suerte a todos

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
RE: Subrutina que pase 16bits en HEXA a 24bits en BCD
« Respuesta #5 en: 25 de Julio de 2004, 11:01:00 »
Hola Duende

Tienes razón, antes debería buscar antes de preguntar.

Está excelente esa subrutina era exacto lo que buscaba, aunque ayer me puse a buscar en otros sitios y encontré una más padre.

Te pasa 24bits binarios a 32bits decimales. Si tienes 0xffffff te entrega 0x16777215.

Se las paso para que la chequen y gracias por echarme la mano:


;   Convert 24-bit binary number at <AccA> into a bcd number
;   at <bcd>. Uses Mike Keitz"s procedure for handling bcd
;   adjust; Modified Microchip AN526 for 24-bits.
;

list p=16f84a
include "p16f84a.inc"

; Registros subrutina b2bcd
COUNT   equ 0x0c
cnt      equ 0x0d
bcd      equ 0x10      ; Aquí aparece resultado
AccA   equ 0x14      ; Aquí se pone dato binario


org 0x00
goto inicio
org 0x05

inicio   call b2bcd      ; llama subrutina
      goto inicio      ; bucle

;-----------------------------------------------------
; Subrutina que convierte 24bits en binario
; a 32 bits en decimal (BCD)
b2bcd   movlw   .24      ; 24-bits
        movwf   COUNT      ; make cycle counter
        clrf    bcd+0      ; clear result area
        clrf    bcd+1
        clrf    bcd+2
        clrf    bcd+3
b2bcd2  movlw   bcd       ; make pointer
        movwf   FSR
        movlw   .4
        movwf   cnt
; Mike"s routine:
b2bcd3  movlw   0x33            
        addwf   INDF,f          ; add to both nybbles
        btfsc   INDF,3          ; test if low result > 7
        andlw   0xf0            ; low result >7 so take the 3 out
        btfsc   INDF,7          ; test if high result > 7
        andlw   0x0f            ; high result > 7 so ok
        subwf   INDF,f          ; any results <= 7, subtract back
        incf    FSR,f           ; point to next
        decfsz  cnt,f
        goto    b2bcd3      
        rlf     AccA+2,f         ; get another bit
        rlf     AccA+1,f
        rlf     AccA+0,f
        rlf     bcd+3,f         ; put it into bcd
        rlf     bcd+2,f
        rlf     bcd+1,f
        rlf     bcd+0,f
        decfsz  COUNT,f         ; all done?
        goto    b2bcd2          ; no, loop
        return                  ; yes
;--------------------------------------------------------------
end



Pietrodilaccua, ya no es necesario que me mandes la rutina, aunque si quieres la puedes publicar aquí, gracias de todas formas.

Desconectado YF-21

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 185
RE: Subrutina que pase 16bits en HEXA a 24bits en BCD
« Respuesta #6 en: 27 de Julio de 2004, 19:16:00 »
Es sorprendente todo lo que se encuentra por aqui y en la internet si se consulta con varias personas (comunmente llamados foristas) ... ahora mismo pruebo el programa  


 

anything