hello,
i'm using at24c16a with at89c55wd i followed the instructions given in the datasheet of eprom but its not working if i write something to eprom its not reading the data back where i'm doing wrong pls tell me i've attached code and schematic here.
thank you.
code:
$MOD51
ORG 0000H
LJMP MAIN
SCL BIT P3.5
SDA BIT P3.4
LASTREAD BIT FLAGS.0
RD_WR_ROM BIT FLAGS.4
ACK BIT FLAGS.5
BUS_FLT BIT FLAGS.6
_2W_BUSY BIT FLAGS.7
BITCNT DATA 21H
BYTECNT DATA 22H
ADDHI DATA 050H ; ADDRESS LOCATION FOR 24C16 SERIAL-
; EEPROM
ADDLO DATA 051H
COUNT DATA 052H ; STORES THE VALUE OF NO OF INTERRUPT
TDATA DATA 053H
RWDATA DATA 054H
SCL_HIGH MACRO
SETB SCL ; SET SCL HIGH
JNB SCL,$ ; LOOP UNTIL STRONG 1 ON SCL
ENDM
MAIN:
LCALL BEGIN
SETB SDA ; ENSURE SDA HIGH
SCL_HIGH ; ENSURE SCL HIGH
CLR ACK ; CLEAR STATUS FLAGS
CLR BUS_FLT
CLR _2W_BUSY
LCALL SEND_START
MOV A,#00H ;READING FROM LOCATION 0000H FOR COUNT
RL A
ORL A,#0A0H
LCALL SEND_BYTE
MOV A,#00H
LCALL SEND_BYTE
MOV A,#00H
LCALL SEND_BYTE
LCALL SEND_STOP
WER:
LCALL NUMBER1
JNB P0.1,SET12
SJMP WER
SET12:LCALL ESCCLEAR
LJMP SETDATA
BEGIN:
LCALL LCD_INIT
RET
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
SEND_START:
SETB SCL
LCALL DELU
SETB SDA
LCALL DELU
CLR SDA
CLR SCL
RET
DELU:MOV 23H,#02H
TUJNZ 23H,TU
RET
SEND_STOP:
SETB SCL
LCALL DELU
CLR SDA
LCALL DELU
SETB SDA ; DELAY FOR BUS TIMING
RET
DELAY_1:
NOP
RET
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 ONET
NOTONE:
CLR SDA ; CLR SDA LOW
ONET:
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_1 ; DELAY FOR AN OPERATION
CLR SCL ; TRANSITION SCL HIGH-TO-LOW
ACALL DELAY_1 ; DELAY FOR AN OPERATION
RET
NUMBER1:
SETDATA:LCALL ESCCLEAR
MOV 23H,#00H
LCALL SKIP
MOV R2,#01H
MOV A,2FH
MOV R0,A
LCALL ETWRITE
MOV 23H,#010H
LCALL SKIP
MOV R2,#02H
MOV A,2FH
MOV R0,A
LCALL ETWRITE
LJMP WER
SKIP:
TSZ: JB P0.2,WTZ
LCALL DRT1
RET
WTZ: JB P0.3,TSZ
MOV DPTR,#AA
MOV 2FH,#01H
ACALL DISPLAY
LCALL DRT1
RET
SAVEDATA:CJNE A,#01H,ANS1
MOV DPTR,#AA
RET
ANS1: CJNE A,#02H,ANS2
MOV DPTR,#BB
RET
TRIGR: MOV B,#03H
MOV A,90
MUL AB
MOV DPTR,#TRIGRG
JMP @A+DPTR
TRIGRG: LJMP TRIGR1
LJMP TRIGR2
TRIGR1:
MOV R5,#01H
LCALL EEREAD
MOV A,2EH
LCALL SAVEDATA
CLR A
LCALL WRITESCRN
RET
TRIGR2:
MOV R5,#02H
LCALL EEREAD
MOV A,2EH
LCALL SAVEDATA
CLR A
LCALL WRITESCRN
RET
;---------------------------------------------------------------------------------------------------------------------------------------------------
ETWRITE:
LCALL SEND_START
MOV A,#0A0H
LCALL SEND_BYTE
MOV A,R2
LCALL SEND_BYTE
MOV A,R0 ;DATA
LCALL SEND_BYTE
LCALL SEND_STOP
RET
;-----------------------------------------------------------------------------------------------------------------------------
EEREAD:
LCALL SEND_START
MOV A,#0A0H
LCALL SEND_BYTE
MOV A,R5 ;EITHER TH/TL COMMAND BYTE
LCALL SEND_BYTE
LCALL SEND_START ; REPEATED START COMMAND
MOV A,#0A1H
LCALL SEND_BYTE
LCALL READ_BYTE ; READ A BYTE OF DATA
MOV 2EH,A
SETB SDA ; MOVE DATA IN SCRATCHPAD MEMORY
LCALL SEND_STOP
RET
END
i'm using at24c16a with at89c55wd i followed the instructions given in the datasheet of eprom but its not working if i write something to eprom its not reading the data back where i'm doing wrong pls tell me i've attached code and schematic here.
thank you.
code:
$MOD51
ORG 0000H
LJMP MAIN
SCL BIT P3.5
SDA BIT P3.4
LASTREAD BIT FLAGS.0
RD_WR_ROM BIT FLAGS.4
ACK BIT FLAGS.5
BUS_FLT BIT FLAGS.6
_2W_BUSY BIT FLAGS.7
BITCNT DATA 21H
BYTECNT DATA 22H
ADDHI DATA 050H ; ADDRESS LOCATION FOR 24C16 SERIAL-
; EEPROM
ADDLO DATA 051H
COUNT DATA 052H ; STORES THE VALUE OF NO OF INTERRUPT
TDATA DATA 053H
RWDATA DATA 054H
SCL_HIGH MACRO
SETB SCL ; SET SCL HIGH
JNB SCL,$ ; LOOP UNTIL STRONG 1 ON SCL
ENDM
MAIN:
LCALL BEGIN
SETB SDA ; ENSURE SDA HIGH
SCL_HIGH ; ENSURE SCL HIGH
CLR ACK ; CLEAR STATUS FLAGS
CLR BUS_FLT
CLR _2W_BUSY
LCALL SEND_START
MOV A,#00H ;READING FROM LOCATION 0000H FOR COUNT
RL A
ORL A,#0A0H
LCALL SEND_BYTE
MOV A,#00H
LCALL SEND_BYTE
MOV A,#00H
LCALL SEND_BYTE
LCALL SEND_STOP
WER:
LCALL NUMBER1
JNB P0.1,SET12
SJMP WER
SET12:LCALL ESCCLEAR
LJMP SETDATA
BEGIN:
LCALL LCD_INIT
RET
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
SEND_START:
SETB SCL
LCALL DELU
SETB SDA
LCALL DELU
CLR SDA
CLR SCL
RET
DELU:MOV 23H,#02H
TUJNZ 23H,TU
RET
SEND_STOP:
SETB SCL
LCALL DELU
CLR SDA
LCALL DELU
SETB SDA ; DELAY FOR BUS TIMING
RET
DELAY_1:
NOP
RET
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 ONET
NOTONE:
CLR SDA ; CLR SDA LOW
ONET:
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_1 ; DELAY FOR AN OPERATION
CLR SCL ; TRANSITION SCL HIGH-TO-LOW
ACALL DELAY_1 ; DELAY FOR AN OPERATION
RET
NUMBER1:
SETDATA:LCALL ESCCLEAR
MOV 23H,#00H
LCALL SKIP
MOV R2,#01H
MOV A,2FH
MOV R0,A
LCALL ETWRITE
MOV 23H,#010H
LCALL SKIP
MOV R2,#02H
MOV A,2FH
MOV R0,A
LCALL ETWRITE
LJMP WER
SKIP:
TSZ: JB P0.2,WTZ
LCALL DRT1
RET
WTZ: JB P0.3,TSZ
MOV DPTR,#AA
MOV 2FH,#01H
ACALL DISPLAY
LCALL DRT1
RET
SAVEDATA:CJNE A,#01H,ANS1
MOV DPTR,#AA
RET
ANS1: CJNE A,#02H,ANS2
MOV DPTR,#BB
RET
TRIGR: MOV B,#03H
MOV A,90
MUL AB
MOV DPTR,#TRIGRG
JMP @A+DPTR
TRIGRG: LJMP TRIGR1
LJMP TRIGR2
TRIGR1:
MOV R5,#01H
LCALL EEREAD
MOV A,2EH
LCALL SAVEDATA
CLR A
LCALL WRITESCRN
RET
TRIGR2:
MOV R5,#02H
LCALL EEREAD
MOV A,2EH
LCALL SAVEDATA
CLR A
LCALL WRITESCRN
RET
;---------------------------------------------------------------------------------------------------------------------------------------------------
ETWRITE:
LCALL SEND_START
MOV A,#0A0H
LCALL SEND_BYTE
MOV A,R2
LCALL SEND_BYTE
MOV A,R0 ;DATA
LCALL SEND_BYTE
LCALL SEND_STOP
RET
;-----------------------------------------------------------------------------------------------------------------------------
EEREAD:
LCALL SEND_START
MOV A,#0A0H
LCALL SEND_BYTE
MOV A,R5 ;EITHER TH/TL COMMAND BYTE
LCALL SEND_BYTE
LCALL SEND_START ; REPEATED START COMMAND
MOV A,#0A1H
LCALL SEND_BYTE
LCALL READ_BYTE ; READ A BYTE OF DATA
MOV 2EH,A
SETB SDA ; MOVE DATA IN SCRATCHPAD MEMORY
LCALL SEND_STOP
RET
END