Olá
Estou fazendo um relógio calendário utilizando o componente DS1302 e um microcontrolador 16F877 da microchip. Quando mando ler a Hora/Data só vem zero.
Estou disponibilizando o código para darem uma olhada, e se alguém pode me dar um auxilio.
Obrigado
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; RELOGIO CALENDARIO
;
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
LIST P=16F877, n=66
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
INCLUDE
errorlevel -302,-305
__CONFIG _CP_OFF & _DEBUG_ON & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _HS_OSC & _LVP_OFF & _CPD_OFF
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
[HASHTAG]#DEFINE[/HASHTAG] ENHrelogio PORTA,0
[HASHTAG]#DEFINE[/HASHTAG] SDA PORTA,2
[HASHTAG]#DEFINE[/HASHTAG] SCK PORTA,1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Variaveis utilizadas com endereço não transcendente
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
cBLOCK 0X50
Counter
Counter1
EnderecoI2C
DadoI2C
endc
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;.
; Programa Pirncipal
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
start
movlw 0x00 ;ajuste para os bits INTCON
movwf INTCON
bsf STATUS,RP0 ;seleciona banco 1 para options e tris
movlw b'00000000' ;ajusta os bits em IO (RA2) , SCLK (RA1) e RST (RA0) como saidas
movwf TRISA
bcf STATUS,RP0 ;volta ao banco 0... (padrão do reset)
call IniRelogio
bsf ENHrelogio
movlw b'10000000' ;Endereço Secundos ( o bit a esquerda é LSB e o da direita MSB
movwf DadoI2C
call EscreverRelogio
movlw b'00000000' ;Dado Secundo
movwf DadoI2C
call EscreverRelogio
call IniRelogio
bsf ENHrelogio
movlw b'10000010' ;Endereço Minutos ( o bit a esquerda é LSB e o da direita MSB
movwf DadoI2C
call EscreverRelogio
movlw b'00011110' ;Dado Minuto (30 Minutos)
movwf DadoI2C
call EscreverRelogio
call IniRelogio
bsf ENHrelogio
movlw b'10000100' ;Endereço Horas ( o bit a esquerda é LSB e o da direita MSB
movwf DadoI2C
call EscreverRelogio
movlw b'00001001' ;Dado Hora (9 Horas da manhã)
movwf DadoI2C
call EscreverRelogio
nop
nop
nop
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Ler Horas
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
movlw b'10000101' ;Endereço Horas
call LeChipRelogio
nop
nop
goto Fim
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; ROTINAS DO RELÓGIO
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
LeChipRelogio
movwf DadoI2C ;w traz primeiro byte
bsf ENHrelogio
call Delay4
call EscreverRelogio
call Delay4
bsf STATUS, RP0
movlw b'00000100' ;RA2 entrada
movwf TRISA
bcf STATUS, RP0
movlw .8
movwf Counter1
call LeRelogio ;Retorna com dado lido em DadoI2C
call Delay4
bsf STATUS, RP0
movlw b'00000000' ;Restaura porta todas saidas
movwf TRISA
bcf STATUS, RP0
return
LeRelogio
bcf SCK
call Delay4
nop
nop
nop
btfsc SDA
goto CarregaUm
goto CarregaZero
Outrobitleitura
bsf SCK
decfsz Counter1,F
goto LeRelogio
bcf SCK
call Delay4
bcf ENHrelogio
return
CarregaUm
bsf STATUS,C
rrf DadoI2C,F
goto Outrobitleitura
CarregaZero
bcf STATUS,C
rrf DadoI2C,F
goto Outrobitleitura
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Inicializa o relogio
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
IniRelogio
bcf ENHrelogio
nop
nop
bcf SCK
call Delay4
bsf ENHrelogio
movlw h'8E' ;Registro de controle
movwf DadoI2C
call EscreverRelogio
movlw b'00000100' ;Dado Registro de Controle (WP=0, bit2=1 tira 1Hz)
movwf DadoI2C
call EscreverRelogio
bcf ENHrelogio
call Delay4
bcf SCK
call Delay4
;Outro comando
bsf ENHrelogio
movlw h'90' ;Endereço TRICKLE
movwf DadoI2C
call EscreverRelogio
movlw b'10100101' ;Habilita carregador, seleciona um só diodo e R1=2K
movwf DadoI2C
call EscreverRelogio
bcf ENHrelogio
call Delay4
bcf SCK
call Delay4
return
EscreverRelogio
movlw .8
movwf Counter1
EscreverRelogioCiclo
bcf SCK
call Delay4
rrf DadoI2C,F
btfsc STATUS,C
goto BitUm
goto BitZero
Escreveoutrobit
decfsz Counter1,F
goto EscreverRelogioCiclo
return
BitZero
bcf SDA
call Delay4
bsf SCK
call Delay4
goto Escreveoutrobit
BitUm
bsf SDA
call Delay4
bsf SCK
call Delay4
goto Escreveoutrobit
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; FIM DE ROTINA DO RELOGIO
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Delay
call Delay16 ;Atraso
decfsz Counter,F
goto Delay
return
Delay16
call Delay4
Delay12
call Delay4
Delay8
call Delay4
Delay4
return
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Fim
end
ECN
Novo Membro
Registrado
7 Mensagens
0 Curtidas
Relógio Calendário DS1302
#1 Por ECN
04/11/2015 - 18:52