We are running a survey to help us improve the experience for all of our members. If you see the survey appear, please take the time to tell us about your experience if you can.
Hi everyone. Iam having a problem with interfacing an AT24C04 to the AT89C2051 microcontroller. On the display , I don't get the number I sent to the eeprom. Can anyone help? This is my code. I downloaded the code from the internet and modified it a little bit. The compiler is KEIL. Thanks in advance. Now here is the code that won't work.
;********************************************************************** ; THE FOLLOWING CODE SHOWS AN INTERFACE BETWEEN AN 8051 MICROCONTROLLER ; AND CATALYST'S I2C FAMILY OF EEPROMS. ; ; IT DEMONSTRATES A BYTE WRITE/BYTE READ ROUTINE AND A PAGE MODE ; WRITE/SEQUENTIAL READ ROUTINE. IT USES TWO LINES FROM PORT 1 ; (P1.0 AND P1.1) OF THE 8051 TO COMMUNICATE WITH THE CAT24CXX. ; ; THIS PROGRAM WILL WORK WITH THE CAT24WC02/04/08/16 DEVICES. ;NOTE: ; THE 24WC02 HAS AN 8 BYTE PAGE BUFFER AND 24WC04/08/16 HAVE A ; 16-BYTE PAGE BUFFER. ;*********************************************************************
SCL BIT P3.4 ;SCL BIT IS PORT 1,BIT 0
SDA BIT P3.5 ;SDA BIT IS PORT 1,BIT 1
SLV_ADDR EQU 0101B ;FIXED SLAVE ADDRESS BITS
DATAOUT EQU R5 ;DATA READ FROM DEVICE
ACK_READ EQU 10000101B ;READ FOR ACK POLLING
DSEG ORG 0030H
PAGE_DATA: DS 1 BLK_ADDR: DS 1 BYTE_ADDR: DS 1 BYTE_DATA: DS 1
ORG 40H STACK: DS 31
CSEG ORG 0040H LJMP BEGIN
ORG 0100H BEGIN: MOV SP,#STACK ;INITIALIZE STACK POINTER
MOV BLK_ADDR,#000B ;INITIALIZE 2K BLOCK
MOV BYTE_DATA,#05H ;BYTE DATA MOV BYTE_ADDR,#00H ;BYTE ADDRESS MOV PAGE_DATA,#0AAH ;PAGE DATA
; ACALL PAGE_WR ;CALL PAGE WRITE ROUTINE
;ACALL SEQ_RD ;CALL SEQ. READ ROUTINE
ACALL BYTE_WR ;CALL BYTE WRITE ROUTINE
ACALL SELECT_RD ;CALL BYTE READ ROUTINE MOV A,DATAOUT ACALL DISPLAY
DONE: LJMP DONE ;LOOP UNTIL RESET OCCURS
;*******************************************
;************** BYTE WRITE *****************
BYTE_WR: ACALL START_BIT ;SEND START BIT MOV A,#SLV_ADDR ;FIRST 4 SLAVE ADDRESS MOV R7,#4H ;BITS ACALL SHFTO MOV A,BLK_ADDR ;2K BLOCK ADDRESS MOV R7,#3H ACALL SHFTO
MOV A,#00H ;R/W BIT SET TO 0 FOR MOV R7,#1H ; WRITE ACALL SHFTO ACALL SLAVE_ACK
MOV A,BYTE_ADDR ;BYTE ADDRESS MOV R7,#8H ACALL SHFTO ACALL SLAVE_ACK MOV A,BYTE_DATA ;BYTE DATA MOV R7,#8H ACALL SHFTO ACALL SLAVE_ACK ACALL STOP_BIT ;STOP BIT ACALL ACK_POL ;CALL ACK POLLING,WAIT RET ;FOR END OF WRITE CYCLE
;************** PAGE WRITE *****************
PAGE_WR: ACALL START_BIT ;SEND START BIT MOV A,#SLV_ADDR ;FIRST 4 SLAVE ADDRESS MOV R7,#4H ;BITS ACALL SHFTO MOV A,BLK_ADDR ;2K BLOCK ADDRESS MOV R7,#3H ACALL SHFTO MOV A,#00H ;R/W BIT SET TO 0 FOR MOV R7,#1H ;WRITE ACALL SHFTO ACALL SLAVE_ACK MOV A,BYTE_ADDR ;BYTE ADDRESS MOV R7,#8H ACALL SHFTO ACALL SLAVE_ACK MOV R4,#0FH NEXT_DATA: ;WRITE 16 BYTES TO MOV A,PAGE_DATA ;EEPROM MOV R7,#8H ACALL SHFTO ACALL SLAVE_ACK DJNZ R4,NEXT_DATA ACALL STOP_BIT ACALL ACK_POL ;CALL ACK POLLING,WAIT
RET ;FOR END OF WRITE CYCLE
;************** ACK_POL ********************
ACK_POL: MOV R3,#40H ;# OF TIMES TO POLL ACK_LOOP: DJNZ R3,DONE_YET ;DEVICE SJMP DN_ACKPOL DONE_YET: ACALL START_BIT ;SEND START BIT MOV A,#ACK_READ ;SEND READ MOV R7,#8H ACALL SHFTO ACALL SLAVE_ACK ;SEND ACKNOWLEDGE JC ACK_LOOP ;LOOP IF NO ACK RCVD, ;JUMP IF ACK RCVD DN_ACKPOL: ACALL STOP_BIT ;SEND STOP BEFORE RETURN
RET ;*******************************************
;************** SHFTO **********************
SHFTO: CLR SCL NXTSHF: CLR SCL RRC A ;ROTATE DATA INTO CARRY
MOV SDA,C ;SEND CARRY TO SDA SETB SCL DJNZ R7,NXTSHF RET ;*******************************************
;************** START BIT ******************
START_BIT: SETB SCL ;START BIT NOP SETB SDA NOP CLR SDA NOP CLR SCL RET ;*******************************************
;************** STOP BIT *******************
STOP_BIT: CLR SDA ;STOP BIT NOP SETB SCL NOP SETB SDA RET ;*******************************************
;************** SLAVE ACKNOWLEDGE **********
SLAVE_ACK: NOP NOP CLR SCL ;SLAVE ACKNOWLEDGE BIT
NOP SETB SDA NOP NOP SETB SCL NOP NOP NOP MOV C,SDA ;READ STATE OF SDA, CLR SCL ;SAVE TO CARRY RET
;************** MASTER ACKNOWLEDGE *********
MSTR_ACK: CLR SCL ;MASTER ACKNOWLEDGE BIT
NOP CLR SDA NOP NOP SETB SCL NOP CLR SCL NOP SETB SDA RET ;*******************************************
;************** NO ACKNOWLEDGE *************
NO_ACK: SETB SDA ;NO ACKNOWLEDGE NOP SETB SCL NOP CLR SCL RET ;*******************************************
;************** SELECTIVE READ *************
SELECT_RD: ACALL START_BIT ;START BIT
MOV A,#SLV_ADDR ;DUMMY WRITE TO FIRST MOV R7,#4H ;2K BLOCK ACALL SHFTO MOV A,BLK_ADDR ;2K BLOCK ADDRESS MOV R7,#3H ACALL SHFTO MOV A,#00H ;R/W BIT SET TO 0 MOV R7,#1H ;FOR WRITE ACALL SHFTO ACALL SLAVE_ACK ;SEND ACKNOWLEDG MOV A,BYTE_ADDR ;ADDRESS TO READ MOV R7,#8H ACALL SHFTO ACALL SLAVE_ACK
ACALL START_BIT ;NEW START BIT
MOV A,#SLV_ADDR MOV R7,#4H
ACALL SHFTO MOV A,BLK_ADDR ;2K BLOCK TO READ MOV R7,#3H ACALL SHFTO MOV A,#1H ;R/W BIT SET TO 1 MOV R7,#1H ;FOR READ ACALL SHFTO ACALL SLAVE_ACK
MOV R7,#8H CLOCK8: SETB SCL ;CLOCK IN DATA NOP MOV C,SDA CLR SCL MOV A,DATAOUT RLC A ;ROTATE NEXT BIT MOV DATAOUT,A ;SAVE ROTATED DATA DJNZ R7,CLOCK8 ;READ 8 BITS OF DATA ACALL NO_ACK ACALL STOP_BIT CLR P3.7 ; Indicate Read RET ;*******************************************
DISPLAY: MOV DPTR,#07E0h MOVC A,@A+DPTR CPL A Mov P1,A SETB P3.0 SETB P3.1 CLR P3.2 RET
ORG 07E0h ; Reserve code memory space to hold the following DATA NUMBER_DOT: DB 02h,09Eh,024h,0Ch,098h,048h,040h,01Eh,00h,08h ; "Array1"
END
PAGE_WR: ACALL START_BIT ;SEND START BIT MOV A,#SLV_ADDR ;FIRST 4 SLAVE ADDRESS MOV R7,#4H ;BITS ACALL SHFTO MOV A,BLK_ADDR ;2K BLOCK ADDRESS MOV R7,#3H ACALL SHFTO MOV ....
That is not even remotely readable. and everything after ACALL START_BIT ; is treated as comments
Erik