Continue to Site

Welcome to EDAboard.com

Welcome to our site! EDAboard.com is an international Electronics Discussion Forum focused on EDA software, circuits, schematics, books, theory, papers, asic, pld, 8051, DSP, Network, RF, Analog Design, PCB, Service Manuals... and a whole lot more! To participate you need to register. Registration is free. Click here to register now.

24C08 INTERFACE WITH 8051

Status
Not open for further replies.

hami007

Newbie level 5
Joined
Nov 1, 2008
Messages
9
Helped
0
Reputation
0
Reaction score
0
Trophy points
1,281
Activity points
1,396
I HAVE A PROGRAM FOR ONE BYTE WRITE AND READ FROM 24C08, WHEN I USE IT FOR 2 OR HIGHER BYTES THE LOOP DOES NOT STOP AND KEEP ON INCREASING VALUES CAN ANY ONE FIGURE IT OUT BY SEEING THE CODE

SCL EQU P1.6
SDA EQU P1.7
EE_DATA EQU 30H
EE_ADDR EQU 40H

MAIN:

MOV R2,#3
MOV R0,#06H
MOV R1,#01H
AGAIN:
MOV EE_DATA,R0

MOV EE_ADDR,R1
CALL EE_WRITE
INC R0
INC R1

CALL DELAY
CALL DELAY
CALL DELAY
CALL DELAY
DJNZ R2,AGAIN


MOV R3,#01H
MOV R4,#3
AGA:
MOV EE_ADDR,R3
CALL EE_READ

INC R3

CALL DELAY
CALL DELAY
CALL DELAY
CALL DELAY
MOV P2,A
DJNZ R4,AGA


; EEPROM ROUTINES FOR THE 24C02, with A2 = A1 = A0 = 0
; WRITING TO EEPROM

EE_WRITE:
CALL EE_START ; SEND A START FLAG TO THE EEPROM
MOV A,#0A0H ; SPECIFY A WRITE EEPROM @ ADDRESS 0H
CALL SHOUT ; SHIFT OUT THE DEVICE ADDRESS
JC WR_ABORT ; ABORT IF NO ACK FROM EEPROM
MOV A,EE_ADDR ; GET EEPROM MEMORY ADDRESS
CALL SHOUT ; SHIFT OUT THE MEMORY ADDRESS
JC WR_ABORT ; ABORT IF NO ACK FROM EEPROM
MOV A, EE_DATA ; GET THE DATA TO BE WRITTEN
CALL SHOUT ; SHIFT OUT THE DATA
JC WR_ABORT
CLR C




WR_ABORT:
CALL EE_STOP ; SEND STOP CONDITION TO EEPROM

; READ THE EEPROM DATA - FIRST PERFORM 'DUMMY WRITE'

EE_READ:
MOV EE_DATA,#00H ; CLEAR OLD DATA
CALL EE_START ; SEND A START FLAG TO EEPROM
MOV A,#0A0H ; SPECIFY A WRITE TO EEPROM @ ADDRESS 0H
CALL SHOUT ; PERFORM 'DUMMY WRITE'
JC RD_ABORT ; ABORT IF NO ACK

MOV A,EE_ADDR ; LOAD EEPROM MEMORY LOCATION FROM WHICH TO READ
CALL SHOUT ; WRITE EEPROM MEMORY LOCATION
JC RD_ABORT ; ABORT IF NO ACK

; NOW READ THE DATA!

CALL EE_START ; SEND A START FLAG
MOV A,#0A1H ; SPECIFY A READ FROM EEPROM
CALL SHOUT ; SHIFT OUT EEPROM ADDRESS
JC RD_ABORT ; ABORT IF NO ACK
CALL SHIN ; SHIFT IN THE DATA FROM EEPROM
MOV EE_DATA,A ; STORE THE DATA
CALL NAK ; SEND A NAK (NO ACKNOWLEDGE) TO THE EEPROM
CLR C ; CLEAR FLAG

RD_ABORT:
CALL EE_STOP ; ALL DONE
RET

; EE_START BIT-BANGS A START SEQUENCE TO EEPROM (HI-TO-LOW SDA TRANSITION
; WITH SCL HIGH).




EE_START:

SETB SDA
SETB SCL ; SET BOTH BITS
NOP ; DELAY
CLR SDA ; START CONDITION; SDA HI TO LOW TRANSITION
NOP
NOP ; EEPROM ACCESS TIME DELAY
CLR SCL
CLR C ; CLEAR FLAG
RET

; EE_STOP SENDS A STOP SEQUENCE TO THE EEPROM (LOW-TO-HIGH SDA TRANSITION WITH SCL HIGH).

EE_STOP:

CALL DELAY
CLR SDA
NOP
NOP
SETB SCL
NOP
NOP ; SETUP TIME DELAY
SETB SDA ; SEND A STOP CONDITION
RET

; SHOUT SHIFTS DATA OUT TO THE EEPROM

SHOUT:
PUSH B
MOV B,#8 ; SAVE B AND LOAD BIT COUNT
EEOUT:
RLC A ; SHIFT BIT LEFT (RLC=ROTATE LEFT THROUGH CARRY)
MOV SDA,C ; GET DATA BIT FROM CARRY
NOP
SETB SCL ; CLOCK IN 1-BIT
NOP ; CLOCK HIGH TIME
CLR SCL ; CLOCK IS NOW LOW
DJNZ B,EEOUT ; DO IT 8 TIMES
SETB SDA ; RELEASE SDA FOR ACK
NOP
NOP
SETB SCL ; ACK CLOCK
NOP
MOV C,SDA ; GET THE ACK
CLR SCL ; CLEAR THE CLOCK BIT
POP B ; RESTORE WHATEVER B WAS
RET


; SHIN SHIFT DATA IN FROM THE EEPROM

SHIN:
SETB SDA ; MAKE SDA AN INPUT
PUSH B
MOV B,#8 ; SAVE B AND SET BIT COUNTER
EEIN:
NOP
SETB SCL ; SET CLOCK
NOP
NOP ; EEPROM ACCESS TIME
SETB SDA ; SET = 1 SO USED AS INPUT
MOV C,SDA ; READ 1-BIT
RLC A ; SHIFT BIT LEFT
CLR SCL ; CLEAR CLOCK BIT
DJNZ B,EEIN ; GET NEXT BIT IF LESS THAN 8 BITS READ
POP B
RET

; NAK SENDS A NO ACKNOWLEDGE

NAK:
SETB SDA
NOP
NOP
SETB SCL ; CLOCK THE NAK
NOP
CLR SCL ; BRING CLOCK LOW
RET

DELAY:
MOV TMOD,#00000001
MOV TH0,#027H
MOV TL0,#010H ; DELAY OF 10MS
CLR TF0
SETB TR0
WAIT: JNB TF0, WAIT
CLR TR0
RET

END
 

Have a look at this loop:

Code:
AGAIN: 
MOV EE_DATA,R0 

MOV EE_ADDR,R1 
CALL EE_WRITE 
INC R0 
INC R1 

CALL DELAY 
CALL DELAY 
CALL DELAY 
CALL DELAY 
DJNZ R2,AGAIN

Can you see the INC instructions?
Ro increases the DATA, R1 increases the ADDRESS ..

Rgds,
IanP
 

Status
Not open for further replies.

Part and Inventory Search

Welcome to EDABoard.com

Sponsor

Back
Top