TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: theve en 16 de Octubre de 2004, 17:22:00
-
Hola amigos, he realizado un programa que me convierte 3 bytes en BCD (0 a 9) pero resulta que me tarda muchisimo, cerca de 0,75 segundos trabajando con un Xtal a 20Mhz, el pic es el 16f876.
El funcionamiento del programa es el siguiente: resto una unidad y se la sumo a un contador, cuando este contador pasa de nuevo le sumo 6 y asi lo voy conviertiendo.Bueno espero que alguien me pueda ayudar a como debo realizar el programa o algun programa ya hecho. Mi nick es theve, soy electronico y me gusta muchisimo diseñar circuitos utilizando tambien microcontroladores. En la medida en que mis conocimientos me lo permitan colaborare en el foro aportando mi experiencia y conocimiento. Un saludo.
-
hola,
fijate en este, es el q yo uso y funciona, de algun lado lo he sacado
la primera parte es como se hace para llamarlo y luego la rutina en si misma
claro q es para 2 bytes(16bits) , pero no debe ser muy dificil ampliarla a mas
yo la usaba para el f877 y luego creo haberla adaptado para el f452.
movfw GncH
movwf H_byte
movfw GncL
movwf L_byte
call B2_BCD
B2_BCD
bcf STATUS,0 ; clear the carry bit
movlw .16
movwf count
clrf R0
clrf R1
clrf R2
loop16
rlf L_byte, F
rlf H_byte, F
rlf R2, F
rlf R1, F
rlf R0, F
decfsz count, F
goto adjDEC
RETLW 0
adjDEC
;lfsr 0 , R2
movlw low(R2)
movwf FSR0L
movlw high(R2)
movwf FSR0H
call adjBCD
; lfsr 0 , R1
movlw low(R1)
movwf FSR0L
movlw high(R1)
movwf FSR0H
call adjBCD
; lfsr 0 , R0
movlw low(R0)
movwf FSR0L
movlw high(R0)
movwf FSR0H
call adjBCD
goto loop16
adjBCD
movlw 3
addwf INDF0,W
movwf temp
btfsc temp,3 ; test if result > 7
movwf INDF0
movlw 30
addwf INDF0,W
movwf temp
btfsc temp,7 ; test if result > 7
movwf INDF0
RETLW 0
Suerte
-
Saludos... la tabla es algo muy estatico y depende de muchos parametros en un programa y no es flexible ni reutilizable.... por otro lado todos sabemos lo q es BCD es gracioso q lo aclares.... y a parte una buena manera de hacerlo es:
BIN_BCD
btfss registro,3
return ;ya esta en bcd
btfss registro,0
return ;ya esta en bcd
movlw .6
addwf registro
retun ;ya esta en bcd
(dura unos pocos nanosegundos por registro con un resonador de 20 Mhz, no 0,75 segundos)
y esto es suponiendo q solo estas trabajando con el nibble menos significativo de cada registro ya q si no es asi entonces aclara bien q es lo q kieres hacer!!!!