Continue to Site

Welcome to our site!

Electro Tech is an online community (with over 170,000 members) who enjoy talking about and building electronic circuits, projects and gadgets. To participate you need to register. Registration is free. Click here to register now.

  • Welcome to our site! Electro Tech is an online community (with over 170,000 members) who enjoy talking about and building electronic circuits, projects and gadgets. To participate you need to register. Registration is free. Click here to register now.

problem in getting temp from ds1621

Status
Not open for further replies.

esconele

New Member
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
 

Attachments

  • rtc.JPG
    rtc.JPG
    36.5 KB · Views: 623
whats wrong in this code its giving only a fix temp i.e 35 pls help me

.EQU TDA,P1.2
.EQU TCLK,P1.3

.EQU EN,P0.0
.EQU RW,P0.1
.EQU RS,P0.2

.EQU CHK,44H
.EQU STATUS,45H
.EQU TEMP,46H
.EQU SUM,47H
; P 3.0 -3.3 = D0 - D3
; P 3.4 -3.7 = A0 - A3
; P2 = DB0 - DB7 LCD DATA

.ORG 0000H
LJMP MAIN
.ORG 000BH
LJMP TIMER0

MAIN:MOV SP,#60H

MOV P3,#00H
MOV TH0,#0D8H
MOV TCON,#00H
MOV TL0,#0F0H
MOV TMOD,#01H
MOV IE,#02H
SETB EA


LCALL TEMPINT

SETB TR0
DO: LJMP DO

TIMER0:MOV TH0,#0D8H
MOV TL0,#0F0H
LCALL READTEMP
LCALL READALL
LCALL DISPLAY
RETI

READTEMP:LCALL START
MOV A,#090H ;READ STATUS CONV REG
LCALL OUTDATA
MOV A,#0AAH
LCALL OUTDATA
LCALL START
MOV A,#091H
LCALL OUTDATA
LCALL INDATA
MOV TEMP,A
LCALL STOP
MOV A,TEMP
MOV DPTR,#TABLE
MOVC A,@A+DPTR
MOV TEMP,A
RET

TEMPINT:LCALL START
MOV A,#090H ;START CONVERTION
LCALL OUTDATA
MOV A,#0EEH
LCALL OUTDATA
LCALL STOP
RET

DELU:MOV 23H,#064H
TU:DJNZ 23H,TU
RET

;-----------------------------------------------------------------------------------

START:SETB TCLK
LCALL DELU
SETB TDA
LCALL DELU
CLR TDA
CLR TCLK
RET

STOP: SETB TCLK
LCALL DELU
CLR TDA
LCALL DELU
SETB TDA
RET
;------------------------------------------------------------------------------------



INDATA:MOV B,#08H
REPP:SETB TCLK
NOP
MOV C,TDA
RLC A
LCALL DELU
CLR TCLK
DJNZ B,REPP
RET


OUTDATA:MOV B,#08H
DER: CLR TCLK
RLC A
MOV TDA,C
NOP
SETB TCLK
LCALL DELU
DJNZ B,DER
CLR TCLK
LCALL DELU
SETB TCLK
LCALL DELU
CLR TCLK
RET


DES:MOV 20,#06H
FG: MOV 21,#0FFH
FG2: MOV 22,#0FFH
FG1: DJNZ 22,FG1
DJNZ 21,FG2
DJNZ 20,FG
RET

DISPLAY:
MOV A,TEMP
JB ACC.7,NEG
MOV 4AH,#02BH
LJMP OK
NEG: MOV 4AH,#02DH
OK: MOV A,TEMP
ANL A,#0FH
MOV 4DH,A
MOV A,#030H
ADD A,4DH
MOV 4DH,A
MOV A,TEMP
RR A
RR A
RR A
RR A
ANL A,#0FH
MOV 4CH,A
MOV A,#030H
ADD A,4CH
MOV 4CH,A
MOV A,#0C7H
LCALL WRITE_INSTRN
MOV A,4AH ;SIGN
LCALL WRITE_DATA
MOV A,4CH ;TEMP
LCALL WRITE_DATA
MOV A,4DH ;TEMP
LCALL WRITE_DATA
MOV A,#0DFH ;'
LCALL WRITE_DATA
MOV A,#043H ;C
LCALL WRITE_DATA
RET




INITIALISE:LCALL DELAY100MS
LCALL DELAY100MS
MOV A,#38H
LCALL WRITE_INSTRN ;SELECT IN WRITE MODE
LCALL DELAY5MS
MOV A,#38H
LCALL WRITE_INSTRN ;SELECT IN WRITE MODE
LCALL DELAY400US
MOV A,#38H
LCALL WRITE_INSTRN ;SELECT IN WRITE MODE
MOV A,#38H ;SELECT NO.OF LINES 1
LCALL WRITE_INSTRN
MOV A,#0CH ;DISPLAY ON,CURSOR ON
LCALL WRITE_INSTRN
MOV A,#01H ;CLEAR DISPLAY
LCALL WRITE_INSTRN
MOV A,#06H ;SET NO SHIFT MODE
LCALL WRITE_INSTRN
RET

WRITE_INSTRN:CLR RS ;**** chek this order
CLR RW
CLR EN
SETB EN
MOV P2,A
CLR EN
LCALL RD_BUSY
RET

WRITE_DATA: CLR RS ;**** chek this order
CLR RW
CLR EN
SETB RS
SETB EN
MOV P2,A
CLR EN
CLR RS
LCALL RD_BUSY
RET







TABLE: .DB 00H,01H,02H,03H,04H,05H,06H,07H,08H,09H
.DB 10H,11H,12H,13H,14H,15H,16H,17H,18H,19H
.DB 20H,21H,22H,23H,24H,25H,26H,27H,28H,29H
.DB 30H,31H,32H,33H,34H,35H,36H,37H,38H,39H
.DB 40H,41H,42H,43H,44H,45H,46H,47H,48H,49H
.DB 50H,51H,52H,53H,54H,55H,56H,57H,58H,59H
.DB 60H,61H,62H,63H,64H,65H,66H,67H,68H,69H
 
memory problem

hello all,
i'm using at89s52 for my project my problem is that my hex file is 25kb and asm file is 99kb and i cannot reduce my code already i've reduced it to minimum but i'm not getting all the features for which i've written the code what sould i do pls reply.
thank you
 
I've not taken a very long look but in the circuit you are using port 3 for sds/scl but in the code you are using port1.
 
Status
Not open for further replies.

Latest threads

Back
Top