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
Moderadores: 51, guest2003, Renie, gpenga
;------------------------------------------------------------------------------
;
; 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;
Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante