;8. STop EVENT
;9. Give 24LC16 a few ms to write the data
;====================================================================
; SEQUENCE IN WRITING
; PIC (master Side) >S>> >C>> >A>> >D>> >P>>
; 24LC16 (slave side) <S>>
call i2cStart
;>C>>
movlw 0xA0
call i2cSend ;block code write to 24LC16
;>A>>
movlw 0x00 ;address info
call i2cSend
;>D>>
movlw 'm' ;1 byte data
call i2cSend
;>P>>
call i2cSTOP
call delay10ms
; call delay10ms
;
;================================================================
;Sequence of Data (random) Read operation
; >S>> >C>> >A>> >RS>> >C>> <P>>
; <S>>
;2. Send Control Byte to Slave (with RW=0 i.e., write) >C>>
;3. Check for ACK from slave <A>>
;5. Wait for ACK <RS>>
;7.Send Control Byte to EEPROM again (with RW=1 i.e. now we read) >C>>
;8. wait for ACK <P>>
;=================================================================
;disable i2c
; banksel SSPCON
; movlw 0x08
; banksel SSPCON
; movwf SSPCON
;Flag Clear
; banksel PIR1
; bcf PIR1, SSPIF ;clear the SSP flag
;enable i2C
; banksel SSPCON
; movlw 0x28
; movwf SSPCON
; movlw 0x18
; banksel TRISC
; movwf TRISC
;>S>>
call I2CStart
;>C>>
movlw 0xA0
call i2cSend
;>A>>
movlw 0x00
call i2cSend
;>RS>> REPEATED START
call i2cRstart
call delay100us
;>C>>
; COntrol Byte = 10100001=0xA1 for READ
movlw 0xA1
banksel SSPBUF
movwf SSPBUF
call delay100us
;< W
; banksel temp
; movwf temp ;W --> TEMP
; Send NACK to 24LC16
call i2cNack
;>P>>
call i2cSTOP
banksel SSPBUF
movf SSPBUF,0 ;EEPROM data --> W
call DATATX
movlw '.'
call DATATX
movlw H'0d' ;CR
call DATATX
movlw H'0a' ;LF
call DATATX
FINI nop
goto FINI ;idling
;sybroutine I2CSTART =====
I2Cstart
banksel SSPCON2
bsf SSPCON2, SEN ;START
banksel PIR1
Swait btfss PIR1, SSPIF
goto Swait
bcf PIR1, SSPIF
return
;--------------------------------------------------
;subroutine i2cblock for write
i2cSend
banksel SSPBUF
movwf SSPBUF
banksel PIR1
cwait btfss PIR1, SSPIF
goto cwait
bcf PIR1, SSPIF
return
;------------------------------------------------
;----------------
;sybroutine I2CRSTART (Repeated Start. Use in READING =====
i2cRstart
banksel SSPCON2
bsf SSPCON2, RSEN ;REPEATED START
return
;--------------------------------------------------
;SUBROUTINE i2cREAD READ event =============
i2cREAD
banksel SSPCON2
bsf SSPCON2, RCEN
banksel PIR1 ;read event completion check
Rwait btfss PIR1, SSPIF
goto Rwait
bcf PIR1, SSPIF
return
;---------------------------------------------
;SUBROUTINE I2CSTOP =============================================
I2CSTOP
banksel SSPCON2
bsf SSPCON2, PEN
banksel PIR1
Pwait btfss PIR1, SSPIF
goto Pwait
bcf PIR1, SSPIF
return
;---------------------------------------
;subroutine
i2cNack
banksel SSPCON2
bsf SSPCON2, ACKDT
bsf SSPCON2, ACKEN
banksel PIR1
nwait btfss PIR1, SSPIF
goto Nwait
bcf PIR1, SSPIF
return
;--------------------------------
;SUBROUTINE ACK from SLAVE ============================
ACK
banksel SSPCON2
ackwait btfsc SSPCON2, ACKSTAT ;test for ACK ;from slave (ACKSTAT=0 if rec.)
goto ackwait
return
;--------------------------------------------------
;subroutine ACKTX ========================
;SENDING ACK from EEPROM PC MONITOR
ACKTX
banksel PIR1
btfss PIR1, TXIF
goto ACKTX ;if full, wait
movlw 'A'
banksel TXREG
movwf TXREG
return
;==subroutine DATATX
;W contains the data to be transferred to PC
DATATX
banksel PIR1
btfss PIR1, TXIF
goto DATATX ;if full, wait
banksel TXREG
movwf TXREG
return
;========================================
;========================================
Async_mode
banksel SPBRG
movlw baud
movwf SPBRG ;Baud Rate Setup
movlw TXMODE
movwf TXSTA
banksel RCSTA
movlw RXMODE
movwf RCSTA
return
;=========================================
;==========================================================
;DELAY SUBROUTINES
; 1 instruction cycle for 20MHz clock is 0.2 us
; Therefore 120 uS delay needs 600 instuction cycles
; 600 =199*3 +3 ---->Kount=199=0xC7
; or =198*3 +6 ---->Kount=198=0xC6
; or =197*3 +9 ---->Kount=197=0xC5
Delay20us
banksel Kount20us
movlw H'1F' ;D'31'
movwf Kount20us
R20us decfsz Kount20us
goto R20us
return
;
;
Delay120us
banksel Kount120us
movlw H'C5' ;D'197'
movwf Kount120us
R120us decfsz Kount120us
goto R120us
return
;
;100us delay needs 500 instruction cycles
; 500 =166*3 +2 ---->Kount=166=0xA6
; or =165*3 +5 ---->Kount=165=0xA5
; or =164*3 +8 ---->Kount=164=0xA4
Delay100us
banksel Kount100us
movlw H'A4'
movwf Kount100us
R100us decfsz Kount100us
goto R100us
return
;
;10ms delay
; call 100 times of 100 us delay (with some time discrepancy)
Delay10ms
banksel Kount10ms
movlw H'64' ;100
movwf Kount10ms
R10ms call delay100us
decfsz Kount10ms
goto R10ms
return
;
;
;1 sec delay
;call 100 times of 10ms delay
Delay1s
banksel Kount1s
movlw H'64'
movwf Kount1s
R1s call Delay10ms
decfsz Kount1s
goto R1s
return
;
;
;10 s delay
;call 10 tiems of 1 s delay
Delay10s
banksel Kount10s
movlw H'0A' ;10
movwf Kount10s
R10s call Delay1s
decfsz Kount10s
goto R10s
return
;
;1 min delay
;call 60 times of 1 sec delay
Delay1m
banksel Kount1m
movlw H'3C' ;60
movwf Kount1m
R1m call Delay1s
decfsz Kount1m
goto R1m
return
;======================================================
END