📄 93xcxx.asm
字号:
retlw error ;RDY status was not present in the alloted
;time, return with error status.
rdynoerr
IF wire3
;setup RA1 back to output
movlw 0 ;set porta as output
tris serial ; /
ENDIF
retlw no_err
;********************************************************************
;* SEE *
;********************************************************************
;See will control the entire operation of a
;93CX6 device. Prior to calling the routine,
;load a valid command/memory address into
;location cmd, and for WRITE or WRAL
;commands, load registers highb and lowb with
;16 bits of write data. Upon exit, the W
;register will contain the completion status.
;Only 93CX6 instructions which require a
;status check can return with an error as the
;completion status. The values that denote
;the completion status are defined as
;variables 'error' and 'no_err' in the
;general assignments section.
see
movf cmd,w ;save cmd
movwf temp_cmd
movf addr,w ;save addr
movwf temp_addr ;
movlw cmd ;Load W with the location of the cmd
;register.
movwf fsr ;Transfer that information into the File
;Select Register. The fsr now points to
;location cmd.
sel ;Select the 93CX6.
strtbt ;Send a start bit.
;
btfsc cmd,7 ;bit 7 = 0?
IF XC46
goto sca8 ;xfer 8 bit cmd/adr
ENDIF
IF LC468
goto sca9 ;xfer 9 bit cmd/adr
ENDIF
IF H16
goto sca10 ;xfer 10 bit cmd/adr
ENDIF
IF H8
goto sca11 ;xfer 11 bit cmd/adr
ENDIF
; goto set_cmd_addr ;no then set cmd/addr
btfss cmd,6 ;bit 6 = 0 ?
IF XC46
goto sc8 ;xfer 8 bit cmd/adr
ENDIF
IF LC468
goto sc9 ;xfer 9 bit cmd/adr
ENDIF
IF H16
goto sc10 ;xfer 10 bit cmd/adr
ENDIF
IF H8
goto sc11 ;xfer 11 bit cmd/adr
ENDIF
; goto set_cmd ;yes then set cmd
IF XC46
goto sca8 ;xfer 8 bit cmd/adr
ENDIF
IF LC468
goto sca9 ;xfer 9 bit cmd/adr
ENDIF
IF H16
goto sca10 ;xfer 10 bit cmd/adr
ENDIF
IF H8
goto sca11 ;xfer 11 bit cmd/adr
ENDIF
; goto set_cmd_addr ;else set cmd/addr
see1
movf temp_cmd,w ;retore cmd
movwf cmd ; /
movf temp_addr,w ;restore addr
movwf addr ; /
btfsc cmd,6 ;Check for a WRITE or ERASE command.
goto see2 ;Yes, parse the command further.
btfsc cmd,7 ;Check for a READ command.
goto read_ ;Yes, process READ command.
btfsc cmd,5 ;Check for a EWEN or ERAL command.
goto see3 ;Yes, parse the command further.
btfsc cmd,4 ;Check for a WRAL command.
goto write_ ;Yes, process WRITE/WRAL command.
exit_ dsel ;No further processing required; 93CX6
;command completed.
;
retlw no_err ;Return with good completion status.
see2 btfss cmd,7 ;Check for a ERASE command.
goto write_ ;No, process WRITE command.
exit2_ call rdychk ;ERASE command requires a status check.
dsel ;De-select the 93CX6.
addwf pc ;Compute completion status from results of
;status check.
retlw no_err ;Return with good completion status.
retlw error ;Return with bad completion status.
see3 btfsc cmd,4 ;Check for a EWEN command.
goto exit_ ;Yes, no further processing required, exit
;now.
goto exit2_ ;No, ERAL command which requires a status
;check.
read_ incf fsr ;Increment the File Select Register to point
;to the register receiving the upper byte of
;the incomming 93CX6 data word.
call din8 ;Input the upper byte.
IF org8
ELSE
incf fsr ;Increment the File Select Register to point
;to the register receiving the lower byte.
call din8 ;Input 8 more bits.
ENDIF
goto exit_ ;No further processing required, exit now.
write_ incf fsr ;Increment the File Select Register to point
;to the upper byte of the 16 bit 93CX6 data
;word to be transmitted.
call dout8 ;Output that byte.
IF org8
ELSE
incf fsr ;Increment the File Select Register to point
;to the lower byte.
call dout8 ;Output the lower byte of the 16 bit 93CX6
;data word.
ENDIF
goto exit2_ ;Exit with a status check.
;
;
IF XC46
sca8
movlw b'11000000' ;clr all but hi 2
andwf cmd,w ;save in w
iorwf addr ;mask in addr.
incf fsr ;inc FSR
call dout8 ;output
goto see1 ;return
ENDIF
IF LC468
;
sca9
bcf addr,7 ;clr hi of addr
btfsc cmd,6 ;xfer cmd's bit 6
bsf addr,7 ;to addr's bit 7
call dout9 ;output
goto see1 ;return
ENDIF
IF H16
;
sca10
call dout10 ;output cmd reg
goto see1 ;return
ENDIF
;
IF H8
sca11
bcf cmd,5 ;xfer cmd's bit 3 to
btfsc cmd,3 ;cmd's bit 5
bsf cmd,5 ; /
call dout11 ;output
goto see1 ;return
;
ENDIF
;
;
;
IF XC46
sc8
movf cmd,w ;get command
movwf addr ;save in addr
incf fsr ;inc pointer
call dout8 ;output
goto see1 ;return
;
ENDIF
IF LC468
sc9
rlf cmd,w ;rotate cmd left
movwf addr ;save in addr
call dout9 ;xfer 9 bits
goto see1 ;return
ENDIF
IF H16
;
sc10
rlf cmd ;rotate cmd
rlf cmd,w ;left twice
movwf addr ;save in addr
clrf cmd ;clear command
call dout10 ;xfer 10 bits
goto see1 ;return
ENDIF
;
IF H8
sc11
bcf addr,7 ;xfer cmd's bit 4
btfsc cmd,4 ;to addr's bit 7
bsf addr,7 ; /
call dout11 ;xfer 11 bits
goto see1 ;return
ENDIF
;********************************************************************
;* Test Program *
;********************************************************************
main ;We've include a sample program to exercise
;the PIC to 93C66 interface using a simple
;erase, write and verify routine.
;8 bit organization has been used
;with a 3 wire interface.
clrf serial ;Clear the port tied to the 93C66 device.
movlw b'11110000' ;Intialize the data direction register for
tris serial ;that port.
movlw ewen ;Load W with the Erase/Write Enable command.
movwf cmd ;Transfer W into cmd register.
call see ;Enable the 93C66 device.
movlw eral ;Load W with the Erase All command.
movwf cmd ;Transfer W into cmd register.
call see ;Erase the 93C66.
xorlw error ;Check completion status.
btfsc status, zflag ;Test for error condition.
goto errloop ;Yes, bad completion status, error-out.
;Write loop:
tstptrn equ 0xAA ;Define the test pattern to be written.
movlw write ;Load W with the Write command.
movwf cmd ;Transfer W into cmd register.
movlw tstptrn ;Intialize the 93C66 data registers with
;write data.
movwf highb ;load in high byte only
;since 8 bit low byte is ignored
clrf addr ;start at addr 0
test1 call see ;Write data word into 93C66 device.
xorlw error ;Check completion status.
btfsc status,zflag ;Test for error condition.
goto errloop ;Yes, bad completion status, error-out.
incfsz addr ;No, increment the 8 bit memory address
;field.
goto test1 ;write another location
btfss cmd,3 ;see if all done
goto wrt_nxt_pg ;no then write next page
goto read_tst ;read written data
wrt_nxt_pg
bsf cmd,3 ;set page bit
goto test1 ;No, write another location.
;Read loop:
read_tst
movlw read ;Load W with the Read command.
movwf cmd ;Transfer W into cmd register.
test2 call see ;Read addressed data word from 93C66 device.
movlw tstptrn ;Load W with the pattern written.
subwf highb,w ;Verify the data read against what was
;written.
btfss status,zflag ;Same?
goto errloop ;No, error-out.
incfsz addr ;Yes, both byte correct, increment the 8 bit
;memory address field.
goto test2 ;do next byte
btfss cmd,3 ;check page bit
goto rd_nxt_pg ;no then chk next page
goto allok ;all done!!!
rd_nxt_pg
bsf cmd,3 ;set page bit
goto test2 ;No, read another location.
allok goto allok ;Home safe!
;
;
errloop
goto errloop
;
;
;
;KEY DEFINITIONS
;
ORG PIC54
SYS_RESET
GOTO START
;
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -