;Listing 1 - EEPROM Drive Routines ; data register definitions temp equ h'C' ;temporary register temp2 equ h'D' ;temporary register cnt equ h'E' ;bit counter addlow equ h'F' ;address low byte addhigh equ h'10' ;address high byte din equ h'11' ;data read from EEPROM dout equ h'12' ;data to EEPROM flag equ h'13' ;flags err equ h'0' ;error bit done equ h'1' ;EEPROM full ;PORTA scl equ h'3' ;clock output to EEPROM sda equ h'4' ;data line to EEPROM ;subroutine to send 'dout' to addhigh/low BWRITE call DSTART ;send start bit movlw b'00000111' andwf addhigh,W ;w=3 bits of addhigh movwf temp bcf STATUS,C ;clear carry rlf temp,W addlw b'10100000' ;dev sel, addhigh, write call DSTORE ;send to EEPROM call SACK ;slave acknowledge btfsc flag,err return ;return if no ack movf addlow,W ;w=address low byte call DSTORE ;send address call SACK ;slave acknowledge btfsc flag,err return ;return if no ack movf dout,W ;w=dout call DSTORE ;send data call SACK ;slave acknowledge btfsc flag,err return ;return if no ack call DSTOP ;send stop return ;subroutine to read addhigh/low to 'din' BREAD call DSTART ;send start bit movlw b'00000111' andwf addhigh,W ;w=3 bits of addhigh movwf temp bcf STATUS,C ;clear carry rlf temp,W addlw b'10100000' ;dev sel, addhigh, write movwf temp2 ;temp2 = start word call DSTORE ;send data call SACK ;slave acknowledge btfsc flag,err return ;return if no ack movf addlow,W ;w=address low byte call DSTORE ;send address call SACK ;slave acknowledge btfsc flag,err return ;return if no ack call DSTART ;send start bit incf temp2,W ;dev sel, addhigh, read call DSTORE ;send data call SACK ;slave acknowledge btfsc flag,err return ;return if no ack call DREAD ;read data call DSTOP return ; subroutine to trigger start DSTART bsf STATUS,RP0 ;bank 1 bcf TRISA,sda ;data line to PIC bcf STATUS,RP0 ;bank 0 bsf PORTA,sda bsf PORTA,scl ;both lines high nop nop nop nop ;wait 4.7us bcf PORTA,sda ;trigger start nop nop nop nop ;wait 4us bcf PORTA,scl ;ready for data RETURN ; Stop bit DSTOP bsf STATUS,RP0 ;bank 1 bcf TRISA,sda ;data line to PIC bcf STATUS,RP0 ;bank 0 bsf PORTA,scl ;clock in nop nop nop nop ;wait 4.7us bsf PORTA,sda ;data high RETURN ; subroutine to send 'w'to EEPROM DSTORE bsf STATUS,RP0 ;bank 1 bcf TRISA,sda ;data line to PIC bcf STATUS,RP0 ;bank 0 movwf temp ;temp=data movlw h'8' ;w=8 movwf cnt ;bit counter =8 STO1 rlf temp,F bcf PORTA,sda ;clear data btfsc STATUS,C bsf PORTA,sda ;set data bsf PORTA,scl ;clock in nop nop nop nop ;wait 4.7us bcf PORTA,scl ;clock low decfsz cnt,F goto STO1 RETURN ; Read data DREAD bsf STATUS,RP0 ;bank 1 bsf TRISA,sda ;PIC releases data line bcf STATUS,RP0 ;bank 0 movlw h'8' ;w=8 movwf cnt ;bit counter =8 DR1 bsf PORTA,scl ;clock in bcf STATUS,C ;clear carry btfsc PORTA,sda ; bsf STATUS,C ;set carry rlf din,F ;push in bcf PORTA,scl ;clock low nop nop decfsz cnt,F goto DR1 RETURN ; Slave acknowledge SACK bsf STATUS,RP0 ;bank 1 bsf TRISA,sda ;PIC releases data line bcf STATUS,RP0 ;bank 0 bsf PORTA,scl ;clock in movf PORTA,F ;read data bsf flag,err ;error bit btfss PORTA,sda ;ack low? bcf flag,err ;error bit bcf PORTA,scl ;clock low RETURN ; Master acknowledge MACK bsf STATUS,RP0 ;bank 1 bcf TRISA,sda ;data line to PIC bcf STATUS,RP0 ;bank 0 bcf PORTA,sda ;data low nop nop nop nop ;wait 4.7us bsf PORTA,scl ;clock in nop nop nop nop ;wait 4.7us bcf PORTA,scl ;clock low RETURN