rtc ds1305

Software e Hardware para linha x51

Moderadores: 51, guest2003, Renie, gpenga

rtc ds1305

Mensagempor leandrosilva » 19 Dez 2006 14:30

Olá gostaria de saber se alguém tem conhecimento com o rtc ds1305 e se alguem tiver conhecimento e poder me ajudar, pois tento escrever os dados e depois ler mais não consigo.
Obrigado
leandrosilva
Bit
 
Mensagens: 39
Registrado em: 04 Dez 2006 21:51

Mensagempor ijftec » 22 Dez 2006 08:36

Ola Leandro, procura por ds 1302, que são parecidos, tem uma terceira linha que deve ser habilitada para se comunicar.

Visite www.ijftec.com.br
Inácio
ijftec
Bit
 
Mensagens: 33
Registrado em: 21 Out 2006 06:24
Localização: Santa Cruz do Sul

Mensagempor brasilma » 22 Dez 2006 09:28

Dá uma pesquisada tbe aqui no forum por tópicos antigos, com certeza isso já foi discutido.
" A Teoria orienta e a Prática decide" ;-)
Avatar do usuário
brasilma
Dword
 
Mensagens: 3621
Registrado em: 11 Out 2006 15:39
Localização: Planeta Terra

Rotinas DS1307

Mensagempor zachary » 27 Dez 2006 10:19

Olá Amigo!

Essas rotinas eu adaptei das originais publicadas pela DALLAS e espero que lhe ajudem.

Código: Selecionar todos
;------------------------------------------------------------------------------
;
;       MAPA I/O PORTAS
;
;
SDA     EQU     P3.3            ; I2C DATA
SCL     EQU     P3.4            ; I2C CLOCK
;
;------------------------------------------------------------------------------
;
;       CONSTANTES E TABELAS
;
DS1307W EQU     0D0H            ; ENDEREÇO I2C DE ESCRITA NO RTC
DS1307R EQU     0D1H            ; ENDEREÇO I2C DE LEITURA NO RTC
;
;------------------------------------------------------------------------------
;
;       MAPA RAM INTERNA
;
BITCNT  EQU     99              ; CONTADOR I2C (BIT)
BYTCNT  EQU     98              ; CONTADOR I2C (BYTE)
RTCCON  EQU     97              ; CONTROLE DO RTC
ANO     EQU     96              ; ANO      (00-99)
MES     EQU     95              ; MES      (01-12)
DIA     EQU     94              ; DIA      (01-31)
SEM     EQU     93              ; SEMANA   (01-07)
HOR     EQU     92              ; HORAS    (01-12) B6=1 B5=AM/PM  (00-23)B6=0
MIN     EQU     91              ; MINUTOS  (00-59)
SEG     EQU     90              ; SEGUNDOS (00-59) B7=1 PARA RELOGIO
;
;------------------------------------------------------------------------------
;
FLAGS     EQU     36            ; FLAGS DO RTC
;
LASTREAD  EQU     FLAGS.0
_12_24    EQU     FLAGS.1
PM_AM     EQU     FLAGS.2
OSC       EQU     FLAGS.3
SQW       EQU     FLAGS.4
ACK       EQU     FLAGS.5
BUS_FAULT EQU     FLAGS.6
_2W_BUSY  EQU     FLAGS.7
;
;------------------------------------------------------------------------------
;
; INICIALIZAÇÃO DAS PORTAS I2C
;
          ORG     0100H
;
          SETB    SDO           ; SDO = 1
          SETB    SDI           ; SDI = 1
.
.
.
.
.
;
;------------------------------------------------------------------------------
;
;-------- ROTINAS SPI DS1307 - By DALLAS

I2C_INIT: SETB    SDA                     ; GARANTE SDA ALTO
          LCALL   SCL_HIGH                ; GARANTE SCL ALTO
          CLR     ACK                     ; LIMPA STATUS FLAGS
          CLR     BUS_FAULT               ;
          CLR     _2W_BUSY                ;
          RET                             ;

;-----------------------------------------------------------------------
; THIS SUB SENDS THE START CONDITION

SEND_START:
          SETB    _2W_BUSY                ; INDICATE THAT 2WIRE
                                          ; OPERATION IN PROGRESS
          CLR     ACK                     ; CLEAR STATUS FLAGS
          CLR     BUS_FAULT
          JNB     SCL,FAULT               ; CHECK FOR BUS CLEAR
          JNB     SDA,FAULT               ; BEGIN START CONDITION
          SETB    SDA
          LCALL   SCL_HIGH                ; SDA
          CLR     SDA
          LCALL   DELAY_1                 ; SCL ^START CONDITION
          CLR     SCL
          RET
FAULT:
          SETB    BUS_FAULT               ; SET FAULT STATUS
          RET                             ; AND RETURN
;-----------------------------------------------------------------------
; THIS SUB SENDS THE STOP CONDITION

SEND_STOP:
          CLR     SDA                     ; SDA
          LCALL   SCL_HIGH
          SETB    SDA                     ; SCL ^STOP CONDITION
          CLR     _2W_BUSY
          RET
;-----------------------------------------------------------------------
; THIS SUB SENDS ONE BYTE OF DATA TO THE DS1307

SEND_BYTE:
          MOV     BITCNT,#08H             ; SET COUNTER FOR 8 BITS
SB_LOOP:
          JNB     ACC.7,NOTONE            ; CHECK TO SEE IF BIT 7 OF
                                          ; ACC IS A 1
          SETB    SDA                     ; SET SDA HIGH (1)
          JMP     ONE
NOTONE:
          CLR     SDA                     ; CLR SDA LOW (0)
ONE:
          LCALL   SCL_HIGH                ; TRANSITION SCL LOW-TO-HIGH
          RL      A                       ; ROTATE ACC LEFT ONE BIT
          CLR     SCL                     ; TRANSITION SCL HIGH-TO-LOW
          DJNZ    BITCNT,SB_LOOP          ; LOOP FOR 8 BITS
          SETB    SDA                     ; SET SDA HIGH TO LOOK
                                          ; FOR ACKNOWLEDGE PULSE
          LCALL   SCL_HIGH                ; TRASITION SCL LOW-TO-HIGH
          CLR     ACK                     ; CLEAR ACKNOWLEDGE FLAG
          JNB     SDA,SB_EX               ; CHECK FOR ACK OR NOT ACK
          SETB    ACK                     ; SET ACKNOWLEDGE FLAG FOR
                                          ; NOT ACK
SB_EX:
          LCALL   DELAY_1                 ; DELAY FOR AN OPERATION
          CLR     SCL                     ; TRANSITION SCL
                                          ; HIGH-TO-LOW
          LCALL   DELAY_1                 ; DELAY FOR AN OPERATION
          RET
;-----------------------------------------------------------------------
; THIS SUB READS ONE BYTE OF DATA FROM THE DS1307

READ_BYTE:
          MOV     BITCNT,#008H            ; SET COUNTER FOR 8 BITS OF
                                          ; DATA
          MOV     A,#00H
          SETB    SDA                     ; SET SDA HIGH TO ENSURE LINE
                                          ; FREE
READ_BITS:
          LCALL   SCL_HIGH                ; TRANSITION SCL LOW-TO-HIGH
          MOV     C,SDA                   ; MOVE DATA BIT INTO CARRY
                                          ; BIT \
          RLC     A                       ; ROTATE CARRY BIT INTO ACC.0
          CLR     SCL                     ; TRANSITION SCL HIGH-TO-LOW
          DJNZ    BITCNT,READ_BITS        ; LOOP FOR 8 BITS
          JB      LASTREAD,ACKN           ; CHECK TO SEE IF THIS IS THE
                                          ; LAST READ
          CLR     SDA                     ; IF NOT LAST READ SEND
                                          ; ACKNOWLEDGE BIT
ACKN:
          LCALL   SCL_HIGH                ; PULSE SCL TO TRANSIMIT
                                          ; ACKNOWLEDGE
          CLR     SCL                     ; OR NOT ACKNOWLEDGE BIT
          RET
;-----------------------------------------------------------------------
; THIS SUB SETS THE CLOCK LINE HIGH

SCL_HIGH:
          SETB    SCL                     ; SET SCL HIGH
          JNB     SCL,$                   ; LOOP UNTIL STRONG 1 ON SCL
          RET

;-----------------------------------------------------------------------
; THIS SUB DELAY THE BUS

DELAY_1:
;          MOV    R7,#010d         ;
          MOV    R7,#020d         ;
          DJNZ   R7,$             ;
          RET                     ;

;-----------------------------------------------------------------------
; THIS SUB DELAYS 4 CYCLES

DELAY_4:
;          MOV    R7,#040d         ;
          MOV    R7,#080d         ;
          DJNZ   R7,$             ;
          RET                     ;

;-----------------------------------------------------------------------
; THIS SUB SETS THE CLOCK (MANUAL)

RTC_W:    MOV     R1,#SEG                 ; POINT TO BEGINNING OF CLOCK
                                          ; DATA IN SCRATCHPAD MEMORY
          LCALL   SEND_START              ; SEND 2WIRE START CONDITION
          MOV     A,#DS1307W              ; SEND DS1307 WRITE COMMAND
          LCALL   SEND_BYTE
          MOV     A,#00H                  ; SET DATA POINTER TO
                                          ; REGISTER 00H ON
          LCALL   SEND_BYTE               ; THE DS1307
SEND_LOOP:
          MOV     A,@R1                   ; MOVE THE FIRST BYTE OF DATA
                                          ; TO ACC
          LCALL   SEND_BYTE               ; SEND DATA ON 2WIRE BUT
          INC     R1
          CJNE    R1,#SEG+8,SEND_LOOP     ; LOOP UNTIL CLOCK DATA SENT
                                          ; TO DS1307
          LCALL   SEND_STOP               ; SEND 2WIRE STOP CONDITION
          RET

;-----------------------------------------------------------------------
; THIS SUB READS THE CLOCK AND WRITES IT TO THE SCRATCH PAD MEMORY ;

RTC_R:    MOV     R1,#SEG                 ; INICIO DO RTC BUFFER
          MOV     BYTCNT,#00H             ; CONTADOR DE BYTES
          CLR     LASTREAD                ; CONTROLE DE ULTIMA LEITURA
          LCALL   SEND_START              ; ENVIA UMA CONDIÇÃO 'START'
          MOV     A,#DS1307W              ; COMANDO DE ESCRITA NO DS1307
          LCALL   SEND_BYTE               ; ENVIA COMANDO
          MOV     A,#00H                  ; APONTA PARA ENDEREÇO 00H
          LCALL   SEND_BYTE               ; ENVIA ENDEREÇO
          LCALL   SEND_STOP               ; ENVIA UMA CONDIÇÃO 'STOP'
          LCALL   SEND_START              ; ENVIA UMA CONDIÇÃO 'START'
          MOV     A,#DS1307R              ; COMANDO DE LEITURA DO DS1307
          LCALL   SEND_BYTE               ; ENVIA COMANDO
READ_LOOP:
          MOV     A,BYTCNT                ; CHECA SE ULTIMA LEITURA
          CJNE    A,#07H,NOT_LAST         ;
          SETB    LASTREAD                ; SET FLAG DE ULTIMA LEITURA
NOT_LAST:
          LCALL   READ_BYTE               ; READ A BYTE OF DATA
          MOV     @R1,A                   ; MOVE DATA IN SCRATCHPAD
                                          ; MEMORY
          MOV     A,BYTCNT                ; CHECK TO SEE IF READING
                                          ; SECONDS REG
          CJNE    A,#00H,NOT_FIRST
          CLR     OSC                     ; CLR OSC FLAG
          MOV     A,@R1                   ; MOVE SECONDS REG INTO ACC
          JNB     ACC.7,NO_OSC            ; JUMP IF BIT 7 OF IS A 0
          SETB    OSC                     ; SET OSC FLAG, BIT 7 IS A 1
          CLR     ACC.7                   ; CLEAR BIT 7 FOR DISPLAY
                                          ; PURPOSES
          MOV     @R1,A                   ; MOVE DATA BACK TO SCRATCHPAD
NO_OSC:
NOT_FIRST:
          INC     R1                      ; INC COUNTERS
          INC     BYTCNT
          MOV     A,BYTCNT
          CJNE    A,#08H,READ_LOOP        ; LOOP FOR ENTIRE CLOCK
                                          ; REGISTERS
          LCALL   SEND_STOP               ; SEND 2WIRE STOP CONDITION
          RET
;
;------------------------------------------------------------------------------
;
          END;


ALTERADA FORMATAÇÃO DO CÓDIGO
Editado pela última vez por zachary em 08 Jan 2007 15:54, em um total de 1 vez.
Avatar do usuário
zachary
Nibble
 
Mensagens: 87
Registrado em: 08 Dez 2006 12:22
Localização: Porto Alegre - RS

DS1305

Mensagempor zachary » 27 Dez 2006 10:46

A comunicação parece ser igual a do DS1307, rotinas post anterior, desde que seja selecionado o modo 3-wire conectando-se SERMODE ao GND e utilizando-se SDI e SDO ligados juntos.

Uma coisa importante a observar é que quando você escreve em um registro, você tem que setar o bit7 do endereço.

Para acessar o registro dos segundos, endereço 00H:

Quando escreve usa 80H e quando le usa 00H.

Note que o registro de controle está em um endereço diferente do DS1307 e também seus bits tem funções diferentes.

Mas para testar a leitura/escrita dos registros que é o seu problema acredito que as rotinas que postei anteriormente funcione com o DS1305.

Espero ter ajudado

Zac
Avatar do usuário
zachary
Nibble
 
Mensagens: 87
Registrado em: 08 Dez 2006 12:22
Localização: Porto Alegre - RS


Voltar para 8051

Quem está online

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

x