TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: migsantiago 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
-
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...
-
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.
-
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.
-
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
-
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.
-
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