24c32a NV ram interfacing via at89c2051 microcontroller

aamir1

Member
Im using this ram for the first time and not familiar with I2C that much i got the code from a friend but its not working i checked it on proteus what is the problem with it please guide someone



Code:
;RAM LOCATION USED IN THIS MODULE 70H
;THIS IS A WORKING PROGRAM, TESTED ON 24C04 SERIAL MEMORY IC
;THE SAME CODE CAN BE USED FOR OTHER I2C IC'S WITH MODIFICATION.

WTCMD 	EQU 10100000B		;24C04 WRITE COMMAND
RDCMD 	EQU 10100001B		;24C04 READ COMMAND
ADDRS	EQU 70H

SCL 	EQU P3.6		;SERIAL CLOCK PIN
SDA 	EQU P3.7		;SERIAL DATA PIN

	ORG 0000H
	LJMP START
	ORG 0030H
START:
	MOV P1,#01H
	MOV R1,#55H		;
	MOV A,#00		;WRITE THE DATA IN R1 REGISTER INTO
	MOV ADDRS,A		;ADDRESS POINTED BY ADDRS INTO TEH 24C04
	LCALL WRITE		;
	LCALL L_DELAY

	MOV A,#00		;
	MOV ADDRS,A		;READ THE DATA FROM 24C04 FROM THE MEMORY
	LCALL READ		;LOCATION POINTED BY ADDRS AND STORE IN R2
	MOV A,R2		;

	MOV P1,A		;MOVE THE RED BACK DATA ONTO P0

	LCALL L_DELAY

	LJMP START


;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
;THIS IS USED TO WRITE INTO 24C04
;ARGUMENTS1 --> ADDRS => ADDRESS TO BE WRITTEN INTO,IN 24C04 MEMORY
;ARGUMENTS2 --> R1 ==> DATA TO BE WRITTEN
;RETURN  --> NONE

WRITE:
	MOV A,#WTCMD
	CALL OUTS

	MOV A,ADDRS
	CALL OUT

	MOV A,R1
	CALL OUT
	CALL STOP
	RET

;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
;THIS SUB ROUTINE IS USED TO READ DATA FROM THE 24C04
;ARGUMENTS --> ADDRS ==> ADDRESS IN 24C04,THE DATA SHOULD BE READ FROM.
;RETURN --> R2(DATA THAT WAS READ)
READ:
	MOV A,#WTCMD
	CALL OUTS

	MOV A,ADDRS
	LCALL OUT

	MOV A,#RDCMD
	LCALL OUTS

	LCALL IN
	MOV R2,A
	LCALL STOP
	RET

;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
OUTS:
	MOV B,#8
	SETB SDA
	SETB SCL
	NOP
	CLR SDA
	NOP
	CLR SCL
OSLOOP:
	RLC A
	MOV SDA,C
	SETB SCL
	NOP
	CLR SCL
	DJNZ B,OSLOOP
	SETB SDA
	NOP
	SETB SCL
	NOP
	CLR SCL
	RET
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
OUT:
	MOV B,#8
OLOOP:
	RLC A
	MOV SDA,C
	SETB SCL
	NOP
	CLR SCL
	DJNZ B,OLOOP
	SETB SDA
	NOP
	SETB SCL
	NOP
	CLR SCL
	RET
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IN:
	MOV B,#8
	SETB SDA
INLOOP:	CLR SCL
	NOP
	SETB SCL
	MOV C,SDA
	RLC A
	DJNZ B,INLOOP
	CLR SCL
	RET
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
STOP:	CLR SDA
	NOP
	SETB SCL
	NOP
	SETB SDA
	LCALL DLAYms
	RET
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
DLAYms:	MOV R6,#150
	MOV B,#00
MS1:	DJNZ B,$	;((2*255)+(2*255)*150
	DJNZ B,$	;=153 MILLI SECONDS
	DJNZ R6,MS1
	RET
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
L_DELAY:	MOV R7,#0AH	;153 MILLISECONDS * 10
LLL:	LCALL DLAYms	;1.53 SECONDS
	DJNZ R7,LLL
	RET
	END

[MODNOTE]Try to use code tags when posting code...Its the ' # ' symbol in the reply box toolbar[/MODNOTE]
 
Last edited by a moderator:
Hi aamir1... The code you have is for a 24lc04 eeprom.... You need to increase the read and write routines to accept 16 bit addresses.

Also the READ command should really issue a NACK before issuing the STOP..

Here's the new code

Code:
;RAM LOCATION USED IN THIS MODULE 70H
;THIS IS A WORKING PROGRAM, TESTED ON 24C04 SERIAL MEMORY IC
;THE SAME CODE CAN BE USED FOR OTHER I2C IC'S WITH MODIFICATION.
 
WTCMD 	EQU 10100000B		;24C04 WRITE COMMAND
RDCMD 	EQU 10100001B		;24C04 READ COMMAND
ADDRS	EQU 70H
 
SCL 	EQU P3.6		;SERIAL CLOCK PIN
SDA 	EQU P3.7		;SERIAL DATA PIN
 
	ORG 0000H
	LJMP START
	ORG 0030H
START:
	MOV P1,#01H
	MOV R1,#55H		;
	MOV A,#00		;WRITE THE DATA IN R1 REGISTER INTO
	MOV ADDRS,A		;ADDRESS POINTED BY ADDRS INTO TEH 24C04
	LCALL WRITE		;
	LCALL L_DELAY
 
	MOV A,#00		;
	MOV ADDRS,A		;READ THE DATA FROM 24C04 FROM THE MEMORY
	LCALL READ		;LOCATION POINTED BY ADDRS AND STORE IN R2
	MOV A,R2		;
 
	MOV P1,A		;MOVE THE RED BACK DATA ONTO P0
 
	LCALL L_DELAY
 
	LJMP START
 
 
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
;THIS IS USED TO WRITE INTO 24C04
;ARGUMENTS1 --> ADDRS => ADDRESS TO BE WRITTEN INTO,IN 24C04 MEMORY
;ARGUMENTS2 --> R1 ==> DATA TO BE WRITTEN
;RETURN  --> NONE
 
WRITE:
	MOV A,#WTCMD
	CALL OUTS
 
	MOV A,0			; Change this to you UPPER address
	CALL OUT

	MOV A,ADDRS
	CALL OUT
 
	MOV A,R1
	CALL OUT
	CALL STOP
	RET
 
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
;THIS SUB ROUTINE IS USED TO READ DATA FROM THE 24C04...( now for 24lc32+ )
;ARGUMENTS --> ADDRS ==> ADDRESS IN 24C04,THE DATA SHOULD BE READ FROM.
;RETURN --> R2(DATA THAT WAS READ)
READ:
	MOV A,#WTCMD
	CALL OUTS
 
	MOV A,0			; Change this to you UPPER address
	LCALL OUT

	MOV A,ADDRS
	LCALL OUT 

	MOV A,#RDCMD
	LCALL OUTS
 
	LCALL IN
	MOV R2,A

	setb sda	;this is the nack... This halts the read..
        setb scl
        clr scl
        setb scl

	LCALL STOP
	RET
 
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
OUTS:
	MOV B,#8
	SETB SDA
	SETB SCL
	NOP
	CLR SDA
	NOP
	CLR SCL
OSLOOP:
	RLC A
	MOV SDA,C
	SETB SCL
	NOP
	CLR SCL
	DJNZ B,OSLOOP
	SETB SDA
	NOP
	SETB SCL
	NOP
	CLR SCL
	RET
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
OUT:
	MOV B,#8
OLOOP:
	RLC A
	MOV SDA,C
	SETB SCL
	NOP
	CLR SCL
	DJNZ B,OLOOP
	SETB SDA
	NOP
	SETB SCL
	NOP
	CLR SCL
	RET
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IN:
	MOV B,#8
	SETB SDA
INLOOP:	CLR SCL
	NOP
	SETB SCL
	MOV C,SDA
	RLC A
	DJNZ B,INLOOP
	CLR SCL
	RET
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
STOP:	CLR SDA
	NOP
	SETB SCL
	NOP
	SETB SDA
	LCALL DLAYms
	RET
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
DLAYms:	MOV R6,#150
	MOV B,#00
MS1:	DJNZ B,$	;((2*255)+(2*255)*150
	DJNZ B,$	;=153 MILLI SECONDS
	DJNZ R6,MS1
	RET
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
L_DELAY:	MOV R7,#0AH	;153 MILLISECONDS * 10
LLL:	LCALL DLAYms	;1.53 SECONDS
	DJNZ R7,LLL
	RET
	END

I have commented where the changes are needed
 
Cookies are required to use this site. You must accept them to continue using the site. Learn more…