Conversor Decimal BCD Decimal FREE

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

Conversor Decimal BCD Decimal FREE

Mensagempor Vonnilmam » 06 Out 2008 12:27

Eu estou desenvolvendo um novo produto que utiliza o DS1302 para marcar as horas e me deparei com uma coisa muito simples que as vezes confunde a cabeça da gente...Eu necessita de um conversor DECIMAL para BCD e vice versa....Daí fiz essa rotina bem simples e que funciona muito bem, Criticas e sugestões por favor.

Muito obrigado
Von,


Rotina do conversor em Assembler, graças a Deus:

Conversor_Dec_Bcd:

Goto TableBCD
;-----------
Conversor_Bcd_Dec:

Movwf Conversor ; Carrega o valor BCD na variável "CONVERSOR"
Clrf ContadorBCD ; Reinicializa ponteiro do contador de ventos
LoopBCD:
Movf ContadorBCD, w ; Carrega o ponteiro da tabela
Call TableBCD ; Chama os dados contidos na tabela BCD
Subwf Conversor, w ; Verifica se "CONVERSOR" é igual ao dado
;da tabela BCD
Btfsc Status, z ; Faz a comparação!
Goto SaiLoopBcd ; Identificação do valor BCD
;
Incf ContadorBCD, f ; Contador de eventos (0 à 59 = 60 steps)
Movf ContadorBCD, w ; Efetua a verificação de overflon
Sublw .60 ; Se for maior que 59 overflon
Btfsc Status, z ; Efetua comparação
Return ; Houve overflon, retornar sem
; nenhuma ação, mantendo o ultimo dado valido
Goto LoopBCD ; Não é igual continua verificando
SaiLoopBcd:
Movf ContadorBCD, w ; Fim da conversão o resultado esta no
;acumulador no formato Decimal
Return
;-----------

TableBCD:

Addwf Pcl

; MSB LSB
; BCD 4bit ----|----

Retlw B'00000000' ; 00 BCD
Retlw B'00000001' ; 01 BCD
Retlw B'00000010' ; 02 BCD
Retlw B'00000011' ; 03 BCD
Retlw B'00000100' ; 04 BCD
Retlw B'00000101' ; 05 BCD
Retlw B'00000110' ; 06 BCD
Retlw B'00000111' ; 07 BCD
Retlw B'00001000' ; 08 BCD
Retlw B'00001001' ; 09 BCD
Retlw B'00010000' ; 10 BCD
Retlw B'00010001' ; 11 BCD
Retlw B'00010010' ; 12 BCD
Retlw B'00010011' ; 13 BCD
Retlw B'00010100' ; 14 BCD
Retlw B'00010101' ; 15 BCD
Retlw B'00010110' ; 16 BCD
Retlw B'00010111' ; 17 BCD
Retlw B'00011000' ; 18 BCD
Retlw B'00011001' ; 19 BCD
Retlw B'00100000' ; 20 BCD
Retlw B'00100001' ; 21 BCD
Retlw B'00100010' ; 22 BCD
Retlw B'00100011' ; 23 BCD
Retlw B'00100100' ; 24 BCD
Retlw B'00100101' ; 25 BCD
Retlw B'00100110' ; 26 BCD
Retlw B'00100111' ; 27 BCD
Retlw B'00101000' ; 28 BCD
Retlw B'00101001' ; 29 BCD
Retlw B'00110000' ; 30 BCD
Retlw B'00110001' ; 31 BCD
Retlw B'00110010' ; 32 BCD
Retlw B'00110011' ; 33 BCD
Retlw B'00110100' ; 34 BCD
Retlw B'00110101' ; 35 BCD
Retlw B'00110110' ; 36 BCD
Retlw B'00110111' ; 37 BCD
Retlw B'00111000' ; 38 BCD
Retlw B'00111001' ; 39 BCD
Retlw B'01000000' ; 40 BCD
Retlw B'01000001' ; 41 BCD
Retlw B'01000010' ; 42 BCD
Retlw B'01000011' ; 43 BCD
Retlw B'01000100' ; 44 BCD
Retlw B'01000101' ; 45 BCD
Retlw B'01000110' ; 46 BCD
Retlw B'01000111' ; 47 BCD
Retlw B'01001000' ; 48 BCD
Retlw B'01001001' ; 49 BCD
Retlw B'01010000' ; 50 BCD
Retlw B'01010001' ; 51 BCD
Retlw B'01010010' ; 52 BCD
Retlw B'01010011' ; 53 BCD
Retlw B'01010100' ; 54 BCD
Retlw B'01010101' ; 55 BCD
Retlw B'01010110' ; 56 BCD
Retlw B'01010111' ; 57 BCD
Retlw B'01011000' ; 58 BCD
Retlw B'01011001' ; 59 BCD
VonNilmam "Assembler" e agora "C"
Avatar do usuário
Vonnilmam
Byte
 
Mensagens: 446
Registrado em: 19 Out 2006 14:25
Localização: espacial

Mensagempor ze » 06 Out 2008 13:05

+ opcionais em C com a mesma Graça: e 1/2 100 graça:
#define BCD2BYTE( b ) ( ( ( ( ( b ) >> 4 ) & 0x0F ) * 10 ) + ( ( b ) & 0x0f ) )
#define BYTE2BCD( b ) ( ( ( ( b ) / 10 ) << 4 ) + ( ( b ) % 10 ) )
abs
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Re: Conversor Decimal BCD Decimal FREE

Mensagempor FLUGEL » 06 Out 2008 13:39

Ai vai uma dica para 18F em assembler, não é muito diferente para 16F. Amanhã posto as rotinas para 16F.

;********************************************************
;*ROTINA QUE CONVERTE VALORES BCD PARA DECIMAL *
;*USADA TODA VEZ QUE SE LE O CI DE RELOGIO *
;********************************************************
RotConverteParaDecimal:

movlw .09
cpfsgt Rtemp1
goto FimConversaoDecimal

movlw .16
subwf Rtemp1,F
incf Rtemp,F
goto RotConverteParaDecimal

FimConversaoDecimal:

movlw .10
mulwf Rtemp
movff PRODL,Rtemp
movf Rtemp1,W
addwf Rtemp,F

return
;********************************************************
;*ROTINA QUE CONVERTE VALORES DECIMAL PARA BCD *
;*USADA TODA VEZ QUE SE ATUALIZA A DATA E HORA *
;********************************************************
RotConverteParaBcd:

movlw .09
cpfsgt Rtemp1
goto FimConversaoBcd

movlw .10
subwf Rtemp1,F
incf Rtemp,F
goto RotConverteParaBcd

FimConversaoBcd:

movlw .16
mulwf Rtemp
movff PRODL,Rtemp
movf Rtemp1,W
addwf Rtemp,F

return
FLUGEL
Bit
 
Mensagens: 9
Registrado em: 22 Nov 2006 11:39

Preciso de ajuda

Mensagempor Vonnilmam » 08 Out 2008 00:45

Eu estou fazendo um novo produto como havia dito aos amigos, já esta quase tudo Ok no programa, mas estou me deparando com problemas no ds1302, minha rotina é essa aquí:
Por favor me ajudem, muito obrigado meu email: mcupicc@hotmail.com


; Essa rotina trata todas as funções do DS 1302:
; ***********************************
; * Rotina leitora de dados no DS1302 *
; ***********************************
;
SendMinutoHora:
Movf Minuto, w
Call Conversor_Dec_Bcd
Movwf CLOCK_SEC;Clock_Min
Call Set_Sec;SET_MIN
; Movf Hora, w
; Call Conversor_Dec_Bcd
; Movwf Clock_Hrs
; Call Set_Hour
Return
;
ReadMinutoHora:
Call Read_Sec;Read_Min
Movf Buffer1, w
Call Conversor_Bcd_Dec
Movwf Minuto
; Call Read_Hour
; Movf Buffer1, w
; Call Conversor_Bcd_Dec
; Movwf Hora
Return
;-----------
READ_SEC ; DS1302 read seconds register
BSF IO_RST ; take IO reset high to initiate transfer
MOVLW B'10000001' ; binary is 10000001 read seconds command
MOVWF BUFFER1 ; store it in the buffer
CALL SHIFT_OUT ; and send to DS 1320
CALL SHIFT_IN ; read a bite from DS1320
BCF IO_RST ; IO_RST low
RETURN
;-----------
READ_MIN ; DS1302 read minutes register
BSF IO_RST ; take IO reset high to initiate transfer
MOVLW B'1000011' ; binary is 10000011 read minutes command
MOVWF BUFFER1 ; store it in the buffer
CALL SHIFT_OUT ; and send to DS 1320
CALL SHIFT_IN ; read a bite from DS1320
BCF IO_RST ; IO_RST low
RETURN
;-----------
READ_HOUR ; DS1302 read hour register
BSF IO_RST
MOVLW B'10000101'
MOVWF BUFFER1
CALL SHIFT_OUT
CALL SHIFT_IN
BCF IO_RST ; IO_RST low
RETURN
;-----------
READ_DAY ; DS1302 read day register
BSF IO_RST
MOVLW B'10000111'
MOVWF BUFFER1
CALL SHIFT_OUT
CALL SHIFT_IN
BCF IO_RST ; IO_RST low
RETURN
;-----------
READ_MONTH ; DS1302 read month register
BSF IO_RST
MOVLW B'10001001'
MOVWF BUFFER1
CALL SHIFT_OUT
CALL SHIFT_IN
BCF IO_RST ; IO_RST low
RETURN
;-----------
READ_YEAR ; DS1302 read year register
BSF IO_RST
MOVLW B'10001101'
MOVWF BUFFER1
CALL SHIFT_OUT
CALL SHIFT_IN
BCF IO_RST
RETURN
;-----------
DS1302_INIT_RTN
SET_SEC ; Set seconds on DS1302
BSF IO_RST ; take IO reset high to init transfer

MOVLW B'10001110' ; Write protect off bin 10001110
MOVWF BUFFER1 ; send to ds 1320
CALL SHIFT_OUT

MOVLW B'00000000' ; Write protect on
MOVWF BUFFER1 ; send to ds 1320
CALL SHIFT_OUT

BCF IO_RST ; toggle IO reset
BSF IO_RST ; IO_RST high

MOVLW B'10000000' ; Select second register
MOVWF BUFFER1 ; send to ds 1320
CALL SHIFT_OUT

MOVF CLOCK_SEC, W ; ***! UPDATED !***
MOVWF BUFFER1 ; send to ds 1320
CALL SHIFT_OUT
BCF IO_RST ; IO_RST low
RETURN
;-----------
SET_MIN ; Set minutes on DS1302
BSF IO_RST ; take IO reset high to init transfer

MOVLW B'10001110' ; Write protect off
MOVWF BUFFER1 ; send to ds 1320
CALL SHIFT_OUT

MOVLW B'00000000' ; Write protect on
MOVWF BUFFER1 ; send to ds 1320
CALL SHIFT_OUT

BCF IO_RST ; toggle IO reset
BSF IO_RST

MOVLW B'10000010' ; b'10000010' is write minutes command
MOVWF BUFFER1 ; send to ds 1320
CALL SHIFT_OUT

MOVF CLOCK_MIN, W ; ***! UPDATED !***
MOVWF BUFFER1 ; send to ds 1320
CALL SHIFT_OUT
BCF IO_RST ; IO_RST low
RETURN
;-----------
SET_HOUR ; Set hours on DS1302
BSF IO_RST ; take IO reset high to init transfer

MOVLW B'10001110' ; Write protect off
MOVWF BUFFER1 ; send to ds 1320
CALL SHIFT_OUT

MOVLW B'00000000' ; Write protect on
MOVWF BUFFER1 ; send to ds 1320
CALL SHIFT_OUT

BCF IO_RST ; toggle IO reset
BSF IO_RST

MOVLW B'10000100' ; b'10000100' is write hour command.
MOVWF BUFFER1 ; send to ds 1320
CALL SHIFT_OUT

MOVF CLOCK_HRS, W ; ***! UPDATED !***
; working here the time is set before entering the routine, so look for all calls to set_hour!

MOVWF BUFFER1 ; send to ds 1320
CALL SHIFT_OUT
BCF IO_RST
RETURN
;-----------
SET_DAY ; Set days on DS1302
BSF IO_RST ; take IO reset high to init transfer

MOVLW B'10001110' ; Write protect off
MOVWF BUFFER1 ; send to ds 1320
CALL SHIFT_OUT

MOVLW B'00000000'
MOVWF BUFFER1
CALL SHIFT_OUT

BCF IO_RST ; toggle IO reset
BSF IO_RST

MOVLW B'10000110' ; b'10000110' is write date command.
MOVWF BUFFER1 ; send to ds 1320
CALL SHIFT_OUT

MOVLW B'00110001' ; This is the value that is set.
MOVWF BUFFER1 ; send to ds 1320
CALL SHIFT_OUT
BCF IO_RST
RETURN
;-----------
SET_MONTH ; Set months on DS1302
BSF IO_RST ; take IO reset high to init transfer

MOVLW B'10001110' ; Write protect off
MOVWF BUFFER1 ; send to ds 1320
CALL SHIFT_OUT

MOVLW B'00000000'
MOVWF BUFFER1 ; send to ds 1320
CALL SHIFT_OUT

BCF IO_RST ; toggle IO reset
BSF IO_RST

MOVLW B'10001000' ; '10001000' is write month command.
MOVWF BUFFER1 ; send to ds 1320
CALL SHIFT_OUT

MOVLW B'00010010' ; This is the value that is set.
MOVWF BUFFER1 ; send to ds 1320
CALL SHIFT_OUT
BCF IO_RST
RETURN
;-----------
SET_YEAR ; Set years on DS1302
BSF IO_RST ; take IO reset high to init transfer

MOVLW B'10001110' ; Write protect off
MOVWF BUFFER1 ; send to ds 1320
CALL SHIFT_OUT

MOVLW B'00000000'
MOVWF BUFFER1 ; send to ds 1320
CALL SHIFT_OUT

BCF IO_RST ; toggle IO reset
BSF IO_RST

MOVLW B'10001100' ; b'10001100' is write year command.
MOVWF BUFFER1 ; send to ds 1320
CALL SHIFT_OUT

MOVLW B'00000001' ; This is the value that is set.
MOVWF BUFFER1 ; send to ds 1320
CALL SHIFT_OUT
BCF IO_RST
RETURN
;-----------
; *********************************
; * Driver entrada e Saida de dados *
; *********************************
;SHIFT_IN: ; Read a byte from the DS1302 and store it in BUFFER1
Bank1
Bsf Trisc, 4
Bank0

MOVLW .8
MOVWF LOOP_CNT1 ; initialize loop counter for 8 bits of data
CLRF BUFFER1 ; clear the buffer
BcF IO_CLK
SH_2:
BsF IO_CLK
BCF STATUS,C
BTFSC IO_DATA
BSF STATUS,C
BcF IO_CLK
RRF BUFFER1, F ; rotate the buffer
DECFSZ LOOP_CNT1, F
GOTO SH_2

Bank1
Bcf Trisc, 4
Bank0
RETURN
;-----------
; ************************************
; * Rotina que escreve dados no DS1302 *
; ************************************
SHIFT_OUT: ; DS1302 serial out routine
MOVWF BUFFER1
MOVLW .8
MOVWF LOOP_CNT1
BcF IO_CLK
SH_1:
BTFSC BUFFER1,0
BSF IO_DATA
BTFSS BUFFER1,0
BCF IO_DATA
BsF IO_CLK
RRF BUFFER1, F
BcF IO_CLK
DECFSZ LOOP_CNT1, F
GOTO SH_1
RETURN
VonNilmam "Assembler" e agora "C"
Avatar do usuário
Vonnilmam
Byte
 
Mensagens: 446
Registrado em: 19 Out 2006 14:25
Localização: espacial


Voltar para PIC

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

x