![]() |
![]() |
![]() |
|
|
|||||||
| Micro Controllers Discuss all aspects of micro controllers - building them, coding them, etc. All controllers are welcome - PIC, BASIC, Z8 Encore!, etc. |
|
|
Thread Tools | Display Modes |
|
|
(permalink) |
|
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 |
|
|
|
|
|
|
(permalink) |
|
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 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 |
|
|
|
|
|
|
(permalink) |
|
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 |
|
|
|
|
|
|
(permalink) |
|
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.
|
|
|
|