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.

24c32a NV ram interfacing via at89c2051 microcontroller

Status
Not open for further replies.

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
 
Status
Not open for further replies.

Latest threads

New Articles From Microcontroller Tips

Back
Top