Logo Hardware.com.br
ECN
ECN Novo Membro Registrado
7 Mensagens 0 Curtidas

Relógio Calendário DS1302

#1 Por ECN 04/11/2015 - 18:52
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
OfflineUser
OfflineUser General de Pijama Registrado
3.2K Mensagens 228 Curtidas
#2 Por OfflineUser
06/11/2015 - 19:42
Bem, porque você não faz em C?

Quanto ao ASM, é melhor quando tudo fica separado de forma organizada (claro isto gera mais rotinas). Veja; Como existem dois trabalhos distintos, fica mais fácil para visualizar um erro, assim podemos tomar conhecimento se o problema esta na rotina de tratamento dos dados da comunicação serial I2C, (troca de dados dos registradores internos do micro-controlador) ou, se esta na sequencia de comandos entre Master<>Slave (ou seja, a comunicação com o(s) periférico(s) externo(s)). Sem dúvida um esquema elétrico é fundamental, deve ser fiel à montagem prática, assim conseguimos eliminar esta ultima variável.
ECN
ECN Novo Membro Registrado
7 Mensagens 0 Curtidas
#3 Por ECN
07/11/2015 - 00:09
"[Daniel
, post: 7290796, member: 507495"]Bem, porque você não faz em C?

Quanto ao ASM, é melhor quando tudo fica separado de forma organizada (claro isto gera mais rotinas). Veja; Como existem dois trabalhos distintos, fica mais fácil para visualizar um erro, assim podemos tomar conhecimento se o problema esta na rotina de tratamento dos dados da comunicação serial I2C, (troca de dados dos registradores internos do micro-controlador) ou, se esta na sequencia de comandos entre Master<>Slave (ou seja, a comunicação com o(s) periférico(s) externo(s)). Sem dúvida um esquema elétrico é fundamental, deve ser fiel à montagem prática, assim conseguimos eliminar esta ultima variável.



Prezado Daniel

Primeiro agradeço por você esta respondendo.
Respondendo a sua pergunta é que eu já tenho do meu trabalho escrito em assembler e só esta faltando esta parte do calendário.
Tanto o código com o esquema são experimentais. Você vai perceber que mesmo gravando hora, minuto e segundo. Eu estou apenas lendo a Hora. E também você vai ver que essa hora lida ela apenas fica no endereço 0x10 , não é exibida em nenhum display Este código é apenas um mecanismo de enviar o dado para DS1302 e lê-lo através do microcontrolador. Em anexo esta o esquema.

Anexos

© 1999-2024 Hardware.com.br. Todos os direitos reservados.
Imagem do Modal