hello,
i'm interfacing ds1621 with at89c52 schematic is attached and code is as follows but its giving the temp which is very high meance its not correct where i'm doing wrong pls point me out my fault code is like this:
code:
$MOD51
SCL BIT P1.0
SDA BIT P1.1
FLAGS DATA 20H
LASTREAD BIT FLAGS.0
ACK BIT FLAGS.5
BUS_FLT BIT FLAGS.6
_2W_BUSY BIT FLAGS.7
BITCNT DATA 21H
BYTECNT DATA 22H
TMSB DATA 24H ; ' SECONDS STORAGE RAM
TLSB DATA 25H ; ' MINUTES ' '
CHOICE DATA 035H ; USED TO STORE TH OR TL COMMAND BYTE
; ***LCD CONTROL***
LCD_DATA EQU 090H
LCD_DB4 EQU 094H ; P1.4 HIGH NIBBLE OF PORT 1 IS USED FOR DATA
LCD_DB5 EQU 095H ; P1.5 HIGH NIBBLE OF PORT 1 IS USED FOR DATA
LCD_DB6 EQU 096H ; P1.6 HIGH NIBBLE OF PORT 1 IS USED FOR DATA
LCD_DB7 EQU 097H ; P1.7 HIGH NIBBLE OF PORT 1 IS USED FOR DATA
LCD_RS EQU 0B3H ; P3.3 LCD REGISTER SELECT LINE
LCD_RW EQU 0B4H ; P3.4 LCD READ / WRITE LINE
LCD_E EQU 0B5H ; P3.5 LCD ENABLE LINE
; ***USER INPUT KEYS***
; ***SYSTEM INSTRUCTIONS***
CONFIG EQU 28H ; 4-BIT DATA,2 LINES,5X7 MATRIX LCD
ENTRYMODE EQU 6 ; INCREMENT CURSOR DON'T SHIFT DISPLAY
; ***CURSOR CONTROL INSTRUCTIONS***
OFFCUR EQU 0CH
BLINKCUR EQU 0DH
; ***DISPLAY CONTROL INSTRUCTIONS***
CLRDSP EQU 01H
ONDSP EQU 0EH
; ***MACRO'S***
SCL_HIGH MACRO
SETB SCL ; SET SCL HIGH
JNB SCL,$ ; LOOP UNTIL STRONG 1 ON SCL
ENDM
CSEG AT 0 ; RESET VECTOR
; JNB ENTER,INIT_YEAR
AJMP START
INIT_YEAR:
; JNB ENTER,INIT_YEAR
MOV YEAR,#97H; INITIALIZE YEAR IF NEW 1307 TO 1997
; ACALL SET_CLOCK; ELSE GO ON.
; **********************************************************
; RESET GOES HERE TO START PROGRAM
; **********************************************************
START:
MOV YEAR,#97H ; SET YEAR TO 1997 ON BOOT
ACALL OFF ; ALARM OFF ON BOOT
MOV SP,#2FH ; POSITION STACK ABOVE BUFFER
MOV IE,#0 ; DISABLE INTERUPTS
SETB SDA ; ENSURE SDA HIGH
SCL_HIGH ; ENSURE SCL HIGH
CLR ACK ; CLEAR STATUS FLAGS
CLR BUS_FLT
CLR _2W_BUSY
LCALL CONFIG_WRITE
; **********************************************************
; INIT LCD
; **********************************************************
ACALL BEGIN
; **********************************************************
; TEMP ROUTINE, GET & DISPLAY TLSB/TMSB/
; **********************************************************
GET_TEMP:
LCALL START_CONVERT ;MOV CHOICE,#0AAH ;READ TEMP REGISTER
LCALL THL_READ
MOV A,#2
MOV B,#0
ACALL PLACECUR4
MOV A,TMSB
ACALL WRITE_BCD
MOV A,#2
MOV B,#2
ACALL PLACECUR4
MOV A,TLSB
ACALL WRITE_BCD
LCALL STOP_CONVERT
LCALL BIG_DELAY
SJMP GET_TEMP
START_CONVERT:
LCALL SEND_START
MOV A,#10010000B ; CONFIGRATION REGISTER IS BEEN
; INITIALISED
LCALL SEND_BYTE
;LCALL READ_ACK
MOV A,#0EEH ; START CONVERT T COMMAND BYTE
LCALL SEND_BYTE
;LCALL READ_ACK
LCALL SEND_STOP
;LCALL MDELAY
RET
;-----------------------------------------------------------------------------------------
;WORKING
THL_READ:
MOV R1,#24H
MOV BYTECNT,#00H ; COUNTER UP TO 8 BYTES FOR CLOCK
CLR LASTREAD ; FLAG TO CHECK FOR LAST READ
LCALL SEND_START
MOV A,#10010000B
LCALL SEND_BYTE
;LCALL READ_ACK
MOV A,#10101010B;CHOICE ;EITHER TH/TL COMMAND BYTE
LCALL SEND_BYTE
;LCALL SEND_STOP ;STOP CONDITION
;LCALL READ_ACK
LCALL SEND_START ;REPEATED START COMMAND
MOV A,#10010001B ;READ BIT HIGH
LCALL SEND_BYTE
;LCALL READ_ACK
READ_LOOP1:
MOV A,BYTECNT ; CHECK TO SEE OF DOING LAST READ
CJNE A,#01H,NOT_LAST1
SETB LASTREAD ; SET LASTREAD FLAG
NOT_LAST1:
LCALL READ_BYTE ; READ A BYTE OF DATA
MOV @R1,A ; MOVE DATA IN SCRATCHPAD MEMORY
MOV A,BYTECNT ; CHECK TO SEE IF READING SECONDS REG
INC R1 ; INC 8051 RAM MEMORY
INC BYTECNT ;FOR CHECKING THE END VALUE
MOV A,BYTECNT
CJNE A,#02H,READ_LOOP1 ; LOOP FOR ENTIRE CLOCK REGISTERS
LCALL SEND_STOP ; SEND 2WIRE STOP CONDITION
RET
STOP_CONVERT:
LCALL SEND_START
MOV A,#10010000B ; CONFIGRATION REGISTER IS BEEN INITIALISED
LCALL SEND_BYTE
;LCALL READ_ACK
MOV A,#022H ; STOP CONVERT T COMMAND BYTE
LCALL SEND_BYTE
;LCALL READ_ACK
LCALL SEND_STOP
RET
CONFIG_WRITE:
LCALL SEND_START
MOV A,#10010000B ;CONFIGRATION REGISTER IS BEEN
; INITIALISED
LCALL SEND_BYTE
;LCALL READ_ACK
MOV A,#0ACH ;COMMAND BYTE
LCALL SEND_BYTE
;LCALL READ_ACK
MOV A,#01H
LCALL SEND_BYTE
;LCALL READ_ACK ; 0000 0001B CONFIG REGISTER
LCALL SEND_STOP
LCALL MDELAY
RET
; **********************************************************
; BCD CONVERSION ROUTINE
; ACC CONTAINS TEMP DATA FROM RAM WHEN ROUTINE IS CALLED.
; **********************************************************
WRITE_BCD:
PUSH ACC ; DECODE HIGH DIGIT
SWAP A
ANL A,#0FH
ACALL FIND ; LOOK IT UP & THEN PRINT IT.
POP ACC ; DECODE LOW DIGIT
ANL A,#0FH
ACALL FIND
RET
BEGIN:
ACALL RESETLCD4
ACALL INITLCD4
MOV A,#2
MOV B,#0
ACALL PLACECUR4
ACALL PRTLCD4
DB ' TEMP ',0
MOV R4,#OFFCUR ; TURN OFF CURSOR
ACALL WRLCDCOM4
RET
BEGIN3:
MOV A,#2
MOV B,#0
ACALL PLACECUR4
ACALL PRTLCD4
DB '* : *',0
MOV R4,#OFFCUR ; TURN OFF CURSOR
ACALL WRLCDCOM4
RET
; **********************************************************
; LOOKUP TABLE USED BY WRITE_BCD.
; **********************************************************
FIND:
SJMP LOOK_UP
ST:
RET
LOOK_UP:
CJNE A,#0000000B,m1
LCALL PRTLCD4
DB '0',0
LJMP ST
m1:
CJNE A,#00000001B,m2
LCALL PRTLCD4
DB '1',0
LJMP ST
m2:
CJNE A,#00000010B,m3
LCALL PRTLCD4
DB '2',0
LJMP ST
m3:
CJNE A,#00000011B,m4
LCALL PRTLCD4
DB '3',0
LJMP ST
m4:
CJNE A,#00000100B,m5
LCALL PRTLCD4
DB '4',0
LJMP ST
m5:
CJNE A,#00000101B,m6
LCALL PRTLCD4
DB '5',0
LJMP ST
m6:
CJNE A,#00000110B,m7
LCALL PRTLCD4
DB '6',0
LJMP ST
m7:
CJNE A,#00000111B,m8
LCALL PRTLCD4
DB '7',0
LJMP ST
m8:
CJNE A,#00001000B,m9
LCALL PRTLCD4
DB '8',0
LJMP ST
m9:
CJNE A,#00001001B,m10
LCALL PRTLCD4
DB '9',0
LJMP ST
m10:
LJMP ST
READ_BYTE:
MOV BITCNT,#08H; SET COUNTER FOR 8-BITS DATA
MOV A,#00H
SETB SDA ; SET SDA HIGH TO ENSURE LINE
; FREE
READ_BITS:
SCL_HIGH ; TRANSITION SCL LOW-TO-HIGH
MOV C,SDA ; MOVE DATA BIT INTO CARRY
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 ACK-BIT
ACKN:
SCL_HIGH ; PULSE SCL TO TRANSMIT ACKNOWLEDGE
CLR SCL ; OR NOT ACKNOWLEDGE BIT
RET
; **********************************************************
; SUB SENDS START CONDITION
; **********************************************************
SEND_START:
SETB _2W_BUSY ; INDICATE THAT 2-WIRE
CLR ACK ; OPERATION IS IN PROGRESS
CLR BUS_FLT ; CLEAR STATUS FLAGS
JNB SCL,FAULT
JNB SDA,FAULT
SETB SDA ; BEGIN START CODITION
SCL_HIGH
CLR SDA
ACALL DELAY
CLR SCL
RET
FAULT:
SETB BUS_FLT
RET
; **********************************************************
; SUB SENDS STOP CONDITION
; **********************************************************
SEND_STOP:
CLR SDA
SCL_HIGH
SETB SDA
CLR _2W_BUSY
RET
; **********************************************************
; SUB DELAYS THE BUS
; **********************************************************
DELAY:
NOP ; DELAY FOR BUS TIMING
RET
; **********************************************************
; THIS SUB SENDS 1 BYTE OF DATA TO THE DS1307
; CALL THIS FOR EACH REGISTER SECONDS TO YEAR
; ACC MUST CONTAIN DATA TO BE SENT TO CLOCK
; **********************************************************
SEND_BYTE:
MOV BITCNT,#08H; SET COUNTER FOR 8-BITS
SB_LOOP:
JNB ACC.7,NOTONE; CHECK TO SEE IF BIT-7 OF
SETB SDA ; ACC IS A 1, AND SET SDA HIGH
JMP ONE
NOTONE:
CLR SDA ; CLR SDA LOW
ONE:
SCL_HIGH ; TRANSITION SCL LOW-TO-HIGH
RL A ; ROTATE ACC LEFT 1-BIT
CLR SCL ; TRANSITION SCL LOW-TO-HIGH
DJNZ BITCNT,SB_LOOP; LOOP FOR 8-BITS
SETB SDA ; SET SDA HIGH TO LOOK FOR
SCL_HIGH ; ACKNOWLEDGE PULSE
CLR ACK
JNB SDA,SB_EX ; CHECK FOR ACK OR NOT ACK
SETB ACK ; SET ACKNOWLEDGE FLAG FOR
; NOT ACK
SB_EX:
ACALL DELAY ; DELAY FOR AN OPERATION
CLR SCL ; TRANSITION SCL HIGH-TO-LOW
ACALL DELAY ; DELAY FOR AN OPERATION
RET
; **********************************************************
; END OF PROGRAM
; **********************************************************
END
i'm interfacing ds1621 with at89c52 schematic is attached and code is as follows but its giving the temp which is very high meance its not correct where i'm doing wrong pls point me out my fault code is like this:
code:
$MOD51
SCL BIT P1.0
SDA BIT P1.1
FLAGS DATA 20H
LASTREAD BIT FLAGS.0
ACK BIT FLAGS.5
BUS_FLT BIT FLAGS.6
_2W_BUSY BIT FLAGS.7
BITCNT DATA 21H
BYTECNT DATA 22H
TMSB DATA 24H ; ' SECONDS STORAGE RAM
TLSB DATA 25H ; ' MINUTES ' '
CHOICE DATA 035H ; USED TO STORE TH OR TL COMMAND BYTE
; ***LCD CONTROL***
LCD_DATA EQU 090H
LCD_DB4 EQU 094H ; P1.4 HIGH NIBBLE OF PORT 1 IS USED FOR DATA
LCD_DB5 EQU 095H ; P1.5 HIGH NIBBLE OF PORT 1 IS USED FOR DATA
LCD_DB6 EQU 096H ; P1.6 HIGH NIBBLE OF PORT 1 IS USED FOR DATA
LCD_DB7 EQU 097H ; P1.7 HIGH NIBBLE OF PORT 1 IS USED FOR DATA
LCD_RS EQU 0B3H ; P3.3 LCD REGISTER SELECT LINE
LCD_RW EQU 0B4H ; P3.4 LCD READ / WRITE LINE
LCD_E EQU 0B5H ; P3.5 LCD ENABLE LINE
; ***USER INPUT KEYS***
; ***SYSTEM INSTRUCTIONS***
CONFIG EQU 28H ; 4-BIT DATA,2 LINES,5X7 MATRIX LCD
ENTRYMODE EQU 6 ; INCREMENT CURSOR DON'T SHIFT DISPLAY
; ***CURSOR CONTROL INSTRUCTIONS***
OFFCUR EQU 0CH
BLINKCUR EQU 0DH
; ***DISPLAY CONTROL INSTRUCTIONS***
CLRDSP EQU 01H
ONDSP EQU 0EH
; ***MACRO'S***
SCL_HIGH MACRO
SETB SCL ; SET SCL HIGH
JNB SCL,$ ; LOOP UNTIL STRONG 1 ON SCL
ENDM
CSEG AT 0 ; RESET VECTOR
; JNB ENTER,INIT_YEAR
AJMP START
INIT_YEAR:
; JNB ENTER,INIT_YEAR
MOV YEAR,#97H; INITIALIZE YEAR IF NEW 1307 TO 1997
; ACALL SET_CLOCK; ELSE GO ON.
; **********************************************************
; RESET GOES HERE TO START PROGRAM
; **********************************************************
START:
MOV YEAR,#97H ; SET YEAR TO 1997 ON BOOT
ACALL OFF ; ALARM OFF ON BOOT
MOV SP,#2FH ; POSITION STACK ABOVE BUFFER
MOV IE,#0 ; DISABLE INTERUPTS
SETB SDA ; ENSURE SDA HIGH
SCL_HIGH ; ENSURE SCL HIGH
CLR ACK ; CLEAR STATUS FLAGS
CLR BUS_FLT
CLR _2W_BUSY
LCALL CONFIG_WRITE
; **********************************************************
; INIT LCD
; **********************************************************
ACALL BEGIN
; **********************************************************
; TEMP ROUTINE, GET & DISPLAY TLSB/TMSB/
; **********************************************************
GET_TEMP:
LCALL START_CONVERT ;MOV CHOICE,#0AAH ;READ TEMP REGISTER
LCALL THL_READ
MOV A,#2
MOV B,#0
ACALL PLACECUR4
MOV A,TMSB
ACALL WRITE_BCD
MOV A,#2
MOV B,#2
ACALL PLACECUR4
MOV A,TLSB
ACALL WRITE_BCD
LCALL STOP_CONVERT
LCALL BIG_DELAY
SJMP GET_TEMP
START_CONVERT:
LCALL SEND_START
MOV A,#10010000B ; CONFIGRATION REGISTER IS BEEN
; INITIALISED
LCALL SEND_BYTE
;LCALL READ_ACK
MOV A,#0EEH ; START CONVERT T COMMAND BYTE
LCALL SEND_BYTE
;LCALL READ_ACK
LCALL SEND_STOP
;LCALL MDELAY
RET
;-----------------------------------------------------------------------------------------
;WORKING
THL_READ:
MOV R1,#24H
MOV BYTECNT,#00H ; COUNTER UP TO 8 BYTES FOR CLOCK
CLR LASTREAD ; FLAG TO CHECK FOR LAST READ
LCALL SEND_START
MOV A,#10010000B
LCALL SEND_BYTE
;LCALL READ_ACK
MOV A,#10101010B;CHOICE ;EITHER TH/TL COMMAND BYTE
LCALL SEND_BYTE
;LCALL SEND_STOP ;STOP CONDITION
;LCALL READ_ACK
LCALL SEND_START ;REPEATED START COMMAND
MOV A,#10010001B ;READ BIT HIGH
LCALL SEND_BYTE
;LCALL READ_ACK
READ_LOOP1:
MOV A,BYTECNT ; CHECK TO SEE OF DOING LAST READ
CJNE A,#01H,NOT_LAST1
SETB LASTREAD ; SET LASTREAD FLAG
NOT_LAST1:
LCALL READ_BYTE ; READ A BYTE OF DATA
MOV @R1,A ; MOVE DATA IN SCRATCHPAD MEMORY
MOV A,BYTECNT ; CHECK TO SEE IF READING SECONDS REG
INC R1 ; INC 8051 RAM MEMORY
INC BYTECNT ;FOR CHECKING THE END VALUE
MOV A,BYTECNT
CJNE A,#02H,READ_LOOP1 ; LOOP FOR ENTIRE CLOCK REGISTERS
LCALL SEND_STOP ; SEND 2WIRE STOP CONDITION
RET
STOP_CONVERT:
LCALL SEND_START
MOV A,#10010000B ; CONFIGRATION REGISTER IS BEEN INITIALISED
LCALL SEND_BYTE
;LCALL READ_ACK
MOV A,#022H ; STOP CONVERT T COMMAND BYTE
LCALL SEND_BYTE
;LCALL READ_ACK
LCALL SEND_STOP
RET
CONFIG_WRITE:
LCALL SEND_START
MOV A,#10010000B ;CONFIGRATION REGISTER IS BEEN
; INITIALISED
LCALL SEND_BYTE
;LCALL READ_ACK
MOV A,#0ACH ;COMMAND BYTE
LCALL SEND_BYTE
;LCALL READ_ACK
MOV A,#01H
LCALL SEND_BYTE
;LCALL READ_ACK ; 0000 0001B CONFIG REGISTER
LCALL SEND_STOP
LCALL MDELAY
RET
; **********************************************************
; BCD CONVERSION ROUTINE
; ACC CONTAINS TEMP DATA FROM RAM WHEN ROUTINE IS CALLED.
; **********************************************************
WRITE_BCD:
PUSH ACC ; DECODE HIGH DIGIT
SWAP A
ANL A,#0FH
ACALL FIND ; LOOK IT UP & THEN PRINT IT.
POP ACC ; DECODE LOW DIGIT
ANL A,#0FH
ACALL FIND
RET
BEGIN:
ACALL RESETLCD4
ACALL INITLCD4
MOV A,#2
MOV B,#0
ACALL PLACECUR4
ACALL PRTLCD4
DB ' TEMP ',0
MOV R4,#OFFCUR ; TURN OFF CURSOR
ACALL WRLCDCOM4
RET
BEGIN3:
MOV A,#2
MOV B,#0
ACALL PLACECUR4
ACALL PRTLCD4
DB '* : *',0
MOV R4,#OFFCUR ; TURN OFF CURSOR
ACALL WRLCDCOM4
RET
; **********************************************************
; LOOKUP TABLE USED BY WRITE_BCD.
; **********************************************************
FIND:
SJMP LOOK_UP
ST:
RET
LOOK_UP:
CJNE A,#0000000B,m1
LCALL PRTLCD4
DB '0',0
LJMP ST
m1:
CJNE A,#00000001B,m2
LCALL PRTLCD4
DB '1',0
LJMP ST
m2:
CJNE A,#00000010B,m3
LCALL PRTLCD4
DB '2',0
LJMP ST
m3:
CJNE A,#00000011B,m4
LCALL PRTLCD4
DB '3',0
LJMP ST
m4:
CJNE A,#00000100B,m5
LCALL PRTLCD4
DB '4',0
LJMP ST
m5:
CJNE A,#00000101B,m6
LCALL PRTLCD4
DB '5',0
LJMP ST
m6:
CJNE A,#00000110B,m7
LCALL PRTLCD4
DB '6',0
LJMP ST
m7:
CJNE A,#00000111B,m8
LCALL PRTLCD4
DB '7',0
LJMP ST
m8:
CJNE A,#00001000B,m9
LCALL PRTLCD4
DB '8',0
LJMP ST
m9:
CJNE A,#00001001B,m10
LCALL PRTLCD4
DB '9',0
LJMP ST
m10:
LJMP ST
READ_BYTE:
MOV BITCNT,#08H; SET COUNTER FOR 8-BITS DATA
MOV A,#00H
SETB SDA ; SET SDA HIGH TO ENSURE LINE
; FREE
READ_BITS:
SCL_HIGH ; TRANSITION SCL LOW-TO-HIGH
MOV C,SDA ; MOVE DATA BIT INTO CARRY
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 ACK-BIT
ACKN:
SCL_HIGH ; PULSE SCL TO TRANSMIT ACKNOWLEDGE
CLR SCL ; OR NOT ACKNOWLEDGE BIT
RET
; **********************************************************
; SUB SENDS START CONDITION
; **********************************************************
SEND_START:
SETB _2W_BUSY ; INDICATE THAT 2-WIRE
CLR ACK ; OPERATION IS IN PROGRESS
CLR BUS_FLT ; CLEAR STATUS FLAGS
JNB SCL,FAULT
JNB SDA,FAULT
SETB SDA ; BEGIN START CODITION
SCL_HIGH
CLR SDA
ACALL DELAY
CLR SCL
RET
FAULT:
SETB BUS_FLT
RET
; **********************************************************
; SUB SENDS STOP CONDITION
; **********************************************************
SEND_STOP:
CLR SDA
SCL_HIGH
SETB SDA
CLR _2W_BUSY
RET
; **********************************************************
; SUB DELAYS THE BUS
; **********************************************************
DELAY:
NOP ; DELAY FOR BUS TIMING
RET
; **********************************************************
; THIS SUB SENDS 1 BYTE OF DATA TO THE DS1307
; CALL THIS FOR EACH REGISTER SECONDS TO YEAR
; ACC MUST CONTAIN DATA TO BE SENT TO CLOCK
; **********************************************************
SEND_BYTE:
MOV BITCNT,#08H; SET COUNTER FOR 8-BITS
SB_LOOP:
JNB ACC.7,NOTONE; CHECK TO SEE IF BIT-7 OF
SETB SDA ; ACC IS A 1, AND SET SDA HIGH
JMP ONE
NOTONE:
CLR SDA ; CLR SDA LOW
ONE:
SCL_HIGH ; TRANSITION SCL LOW-TO-HIGH
RL A ; ROTATE ACC LEFT 1-BIT
CLR SCL ; TRANSITION SCL LOW-TO-HIGH
DJNZ BITCNT,SB_LOOP; LOOP FOR 8-BITS
SETB SDA ; SET SDA HIGH TO LOOK FOR
SCL_HIGH ; ACKNOWLEDGE PULSE
CLR ACK
JNB SDA,SB_EX ; CHECK FOR ACK OR NOT ACK
SETB ACK ; SET ACKNOWLEDGE FLAG FOR
; NOT ACK
SB_EX:
ACALL DELAY ; DELAY FOR AN OPERATION
CLR SCL ; TRANSITION SCL HIGH-TO-LOW
ACALL DELAY ; DELAY FOR AN OPERATION
RET
; **********************************************************
; END OF PROGRAM
; **********************************************************
END