1. 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.
    Dismiss Notice

24c32a NV ram interfacing via at89c2051 microcontroller

Discussion in '8051/8951' started by aamir1, Mar 14, 2013.

  1. aamir1

    aamir1 Member

    Joined:
    Oct 8, 2011
    Messages:
    106
    Likes:
    0
    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 (text):
    ;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: Mar 15, 2013
  2. Ian Rogers

    Ian Rogers Super Moderator Most Helpful Member

    Joined:
    Mar 28, 2011
    Messages:
    9,141
    Likes:
    907
    Location:
    Rochdale UK
    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 (text):

    ;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
     

Share This Page