《匠人手记》推荐网上购书渠道:
互动出版网(china-pub)购书入口   >>>
当当网(dangdang)购书入口   >>>
卓越亚马逊网 购书入口   >>>
淘宝网(taobao)购书入口   >>>
更多购书渠道……   >>> 

设为首页加入收藏联系匠人管理入口21IC首页21IC博客21IC社区侃单片机回复的贴参与的贴

天气预报
百宝日历
载入中...

百宝专栏

载入中...
最新货色

载入中...

粉丝评论

载入中...

载入中...



百宝信息

载入中...

百宝流量

(2006-07-01开始)


匠人手记

 匠人观点: 好记性不如烂笔头  
 黑色幽默:三鹿门——后世畅想

PIC:读写93C46程序
程序匠人 发表于 2005-6-2 20:51:00  阅读全文 | 回复(0) | 引用通告 | 编辑

;********************************************************************
;*                      PICALC Directives Section                   *
;********************************************************************

 SUBTITL "93C46 3 WIRE INTERFACE ROUTINE"
 LIST     P=16C54,N=40,C=132


;********************************************************************
;*                      Register Assignments                        *
;********************************************************************

indir   equ     0x00            ;Use this register as source/destination for
    ;indirect addressing.
pc      equ     0x02            ;PIC Program Counter.
status  equ     0x03            ;PIC Status Register.
fsr     equ     0x04            ;File Select Register.
serial  equ     0x05            ;Port used for 93C46 control.  Since Port A
    ;is 4 bits wide, we'll use all of Port A.

    ;The following three registers must be
    ;located consecutively in memory.
cmd     equ     0x10            ;This register contains the 2 bit 93C46
    ;command is the upper 2 bit positions and
    ;memory address in the lower 6.
highb   equ     0x11            ;Used in read/write routines to store the
    ;upper byte of a 16 bit 93C46 data word.
lowb    equ     0x12            ;Used in read/write routines to store the
    ;lower byte of a 16 bit 93C46 data word.

cnthi   equ     0x13            ;Used as the upper byte of a sixteen bit loop
    ;counter in RDYCHK routine.
cnt     equ     0x14            ;Used as the lower byte of a sixteen bit loop
    ;counter in RDYCHK routine, and elsewhere as
    ;an eight bit counter.

;********************************************************************
;*                      Bit Assignments                             *
;********************************************************************

carry   equ     0               ;Carry Flag of Status Register.
zflag   equ     2               ;Zero Flag of Status Register.

;For the 3 wire interface, connect the din and dout to the same
;i/o line of the PIC16C5X.
cs      equ     0               ;Port pin tied to CS on 93C46.
din     equ     1               ;Port pin tied to DI on 93C46.
dout    equ     1               ;Port pin tied to DO on 93C46.
clock   equ     2               ;Port pin tied to CLK on 93C46.

;********************************************************************
;*                      General Assignments                         *
;********************************************************************

no_err  equ     0               ;
error   equ     1               ;
tries   equ     0x04            ;After issuing a WRITE, ERASE, ERAL, or WRAL
    ;command, the approximate number of machine
    ;cycles X 256 to wait for the RDY status.
    ;This value must be adjusted for operating
    ;frequencies other than 4 MHz.

read    equ     0x80            ;93C46 Read command.
write   equ     0x40            ;93C46 Write command.
erase   equ     0xC0            ;93C46 Erase command.
ewen    equ     0x30            ;93C46 Erase/Write Enable command.
ewds    equ     0x00            ;93C46 Erase/Write Disable command.
eral    equ     0x20            ;92CXX Erase All command.
wral    equ     0x10            ;92CXX Write All command.

;********************************************************************
;*                      Macro Definitions                           *
;********************************************************************

sel     MACRO                   ;Selects the 93C46 device.
 bsf     serial,cs       ;Chip Select (CS) = '1' to select the device.
 ENDM

dsel    MACRO                   ;De-select the 93C46 device.
 bcf     serial,cs       ;Chip Select (CS) = '0' to de-select the
    ;device.
 ENDM

strtbt  MACRO                   ;Issue the Start Bit to the 93C46.
 bsf     serial,din      ;Start Bit = '1'.
 clkit                   ;Clock it out.
 ENDM

clkit   MACRO                   ;Clocks a serial data bit into or out of the
    ;93C46 device.
 bsf     serial,clock    ;Clock (CLK) = '1'.

 nop                     ;Adjust the number of nop instructions
    ;between the assertion and de-assertion of
    ;CLK in proportion to the PIC operating
    ;frequency.  Refer to the 93C46 data for the
    ;minimum CLK period.
    
 bcf     serial,clock    ;Clock (CLK) = '0'.
 ENDM

;********************************************************************
;*                      Power-On/Reset Entry Point                  *
;********************************************************************

reset_  org     0x1FF
 goto    main

;********************************************************************
;*                      93C46 Routines                              *
;********************************************************************
 org     0x000           ;Locate all subroutines in the lower half of
    ;a Program Memory Page.

;********************************************************************
;*                      DOUT8                                       *
;********************************************************************
    ;Dout8 will output 8 bits of data to the
    ;93C46.  Before calling this routine, the FSR
    ;must point to the byte being transmitted.

dout8   movlw   0x08            ;Initialize loop counter.
 movwf   cnt             ;

d_o_8   bcf     serial,din      ;Assume that the bit to be transfered is a
    ;'0'.  Hence, de-assert DI.
 rlf     indir           ;Rotate the actual bit to be transferred into
    ;the carry bit.
 btfsc   status,carry    ;Test the carry, if our assumption was
    ;correct, skip the next instruction.
 bsf     serial,din      ;No, actual bit was a '1'.  Assert DI.
 clkit                   ;Clock the 93C46.
 decfsz  cnt             ;Repeat until cnt = 0.
 goto    d_o_8           ;Cnt still > 0.
 rlf     indir           ;Restore register to its original condition.
 retlw   no_err          ;Exit with good status.

;********************************************************************
;*                      DIN8                                        *
;********************************************************************
    ;Din8 will input 8 bits of data from the
    ;93C46.  Before calling this routine, the FSR
    ;must point to the register being used to
    ;hold the incomming data.
din8    movlw   0x08            ;Initialize loop counter.
 movwf   cnt             ;
;for the 3 wire interface the direction of the i/o line connected to
;din and dout has to converted from an output to an input.
 movlw   b'00000010'     ;convert RA1 to an input
 tris    serial          ;       /

d_i_8   clkit                   ;Clock a bit out of the 93C46.
 rlf     indir           ;Make room for the incomming bit in the
    ;destination register.
 bcf     indir,0         ;Assume that the incomming bit is a '0' and
    ;clear the LSB of the destination register.
 btfsc   serial,dout     ;Test the incomming bit, if our assumption
    ;was correct, skip the next instruction.
 bsf     indir,0         ;No, actual bit is a '1'.  Set the LSB of the
    ;destination register.
 decfsz  cnt             ;Repeat until cnt = 0.
 goto    d_i_8           ;Cnt still > 0
;for a 3 wire interface, convert the RA1 line back to an output
 movlw   0               ;make RA1 to an output
 tris    serial          ;       /
 retlw   no_err          ;Exit with good status.

;********************************************************************
;*                      RDYCHK                                      *
;********************************************************************
    ;Rdychk will read the 93C46 READY/BUSY status
    ;and wait for RDY status within the alloted
    ;number of processor cycles.  If RDY status
    ;is not present after this set period, the
    ;routine will return with an error status.

rdychk  movlw   tries           ;Initialize time-out counter.
 movwf   cnthi           ;
 clrf    cnt             ;
;for a 3 wire interface, make the RA1 line an input
 movlw   b'00000010'     ;
 tris    serial
 dsel                    ;De-select the 93C46.

;       nop                     ;NOTE:  Check the 93C46 data sheet for
    ;minimum CS low time.  Depending upon
    ;processor frequency, a nop(s) may be
    ;between the assertion and de-assertion of
    ;Chip Select.

 sel                     ;Re-select the 93C46.
notrdy  btfsc   serial,dout     ;If DO is a '0', 93C46 has yet to completed
    ;the last operation (still busy).
 goto    no_error        ;Otherwise RDY status is present within the
    ;alloted time, and return with good status.
 decfsz  cnt             ;No, not yet ready.  Decrement the LSB of our
    ;16 bit timer and check for expiration.
 goto    notrdy          ;Still some time left.  Try again.
 decfsz  cnthi           ;Least significant byte expired - decrement
    ;and check for expiration of the MSB.
 goto    notrdy          ;Still some time left.  Try again.
;for a 3 wire interface, convert RA1 line back to an ouput
 movlw   0               ;convert RA1 to an output
 tris    serial          ;       /
 retlw   error           ;RDY status was not present in the alloted
    ;time, return with error status.
no_error
;for a 3 wire interface, convert RA1 line back to an ouput
 movlw   0               ;convert RA1 to an output
 tris    serial          ;       /
 retlw   no_err


;********************************************************************
;*                      SEE                                         *
;********************************************************************

    ;See will control the entire operation of a
    ;93C46 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 93C46 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     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 93C46.
 strtbt                  ;Send a start bit.
 call dout8              ;Transmit the 2 bit command and six bit
    ;address.
 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; 93C46
    ;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 93C46.
 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 93C46 data word.
 call    din8            ;Input the upper byte.
 incf    fsr             ;Increment the File Select Register to point
    ;to the register receiving the lower byte.
 call    din8            ;Input 8 more bits.
 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 93C46 data
    ;word to be transmitted.
 call    dout8           ;Output that byte.
 incf    fsr             ;Increment the File Select Register to point
    ;to the lower byte.
 call    dout8           ;Output the lower byte of the 16 bit 93C46
    ;data word.
 goto    exit2_          ;Exit with a status check.

;********************************************************************
;*                      Test Program                                *
;********************************************************************
 main                    ;We've include a sample program to exercise
    ;the PIC to 93C46 interface using a simple
    ;erase, write and varify routine.
 
 clrf    serial          ;Clear the port tied to the 93C46 device.
 movlw   b'11110100'     ;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 93C46 device.

 movlw   eral            ;Load W with the Erase All command.
 movwf   cmd             ;Transfer W into cmd register.
 call    see             ;Erase the 93C46.
 xorlw   error           ;Check completion status.
 btfsc   status, zflag   ;Test for error condition.
 goto    errloop         ;Yes, bad completion status, error-out.

    ;Write loop:
loopcnt equ     0x1F            ;Define an unused location for our test
    ;program loop counter.
tstptrn equ     0xAA            ;Define the test pattern to be written.

 movlw   .64             ;Initialize that counter.
 movwf   loopcnt         ;
 movlw   write           ;Load W with the Write command.
 movwf   cmd             ;Transfer W into cmd register.
 movlw   tstptrn         ;Intialize the 93C46 data registers with
    ;write data.
 movwf   highb           ;
 movwf   lowb            ;
test1   call    see             ;Write data word into 93C46 device.
 xorlw   error           ;Check completion status.
 btfsc   status,zflag    ;Test for error condition.
 goto    errloop         ;Yes, bad completion status, error-out.
 incf    cmd             ;No, increment the 6 bit memory address
    ;field.
 decfsz  loopcnt         ;Have we written all 64 locations?
 goto    test1           ;No, write another location.

    ;Read loop:

 movlw   .64             ;Initialize loop counter.
 movwf   loopcnt         ;
 movlw   read            ;Load W with the Read command.
 movwf   cmd             ;Transfer W into cmd register.
test2   call    see             ;Read addressed data word from 93C46 device.
 movlw   tstptrn         ;Load W with the pattern written.
 subwf   highb,0         ;Verify the data read against what was
    ;written.
 btfss   status,zflag    ;Same?
 goto    errloop         ;No, error-out.
 movlw   tstptrn         ;Repeat with the lower byte read.
 subwf   lowb,0          ;
 btfss   status,zflag    ;Same?
 goto    errloop         ;No, error-out.
 incf    cmd             ;Yes, both byte correct, increment the 6 bit
    ;memory address field.
 decfsz  loopcnt         ;Have we read all 64 locations?
 goto    test2           ;No, read another location.

allok   goto    allok           ;Home safe!

errloop goto    errloop         ;Bad news!

 END                     ;Thats all folks!

看《匠人手记》,与匠人同行!北航出版,正在热卖!

发表评论:
载入中...

芯片专题

器件专题

软件专题

硬件专题

综合专题

项目专题

原创专题

器件检测
LCD LED
按键 触摸键
E2PROM
电池 电机
电阻 电容 电感

指令系统
软件算法
编程规范
滤波算法
串行通讯

PCB设计
I2C PWM
红外遥控
充电技术
中断 ADC 

匠人手记
匠人夜话
网络心路
一周热点串烧
从零开始玩PIC
DIY旋转时钟

广告5号位 [投放]


学习板、开发板、编程器、下载器、仿真器(查看详情……)

广告3号位 [投放]

站内搜索


站外搜索


百度  google
mp3  歌词 
图片  FLASH 
知道  文档
新闻  词典 
地图  mp3 
软件  天网 
雅虎  爱问 
搜狗  讯雷 
网讯  华军 
天空 

21IC器件搜索
百宝箱分站
  • 《匠人的百宝箱》21IC站
  • 《匠人的百宝箱》21IC笔记团队
  • 《匠人手记》21IC书友会
  • 《匠人的百宝箱》MCUBLOG站
  • 《匠人的百宝箱》MCUBLOG笔记团队
  • 《匠人的百宝箱》EDN站
  • 《匠人手记》EDN书友会
  • 《匠人的百宝箱》与非网站
  • 《匠人的百宝箱》新浪站
  • 《匠人的百宝箱》百度站
  • 《匠人的百宝箱》网易126站
  • 《匠人的百宝箱》网易163站
  • 《匠人的百宝箱》互动出版网站
  • 广告4号位 [投放]

     
     

    匠人原创

    往日酷贴

     
     
     

    大千八卦

    友情连接

    新浪新闻:
    新浪财经:
    AK58新闻:
    新浪股票:
    新浪股票:
    证券之星:

     [更多酷站连接]

     

     

    [欢迎交换连接]

    [百宝箱之与非门分舵]

    [电脑圈圈的家当]

    [IC921的博客]

    [柔月阁]

    [八楼的呼吸]

    [hotpower 的水潭]

    [xwj的文君阁]

    [所长的BLOG]

    [阿摆手记]

    [电子伙伴]

    [unaided的笔记]

    [小飞的笔记]

    [单片机开发联盟]

    [网址之家]

    [好东西网址大全]

    [美萍中文精选]

    [数字电视之家]

    [SMARTCODE电子书斋]

    [软件开发之窗]

    [Armoric]

    [我爱研发网]

    [infernal的笔记]

    [雄鹰的空中加油站]

    [SunK]

    [逍遥电子]

    [ningpanda的博客]

    [C-Design]

    [一网见天下]

    [海边淘沙]

    [嵌入式365]

    [水牛的仓库]

    [股剩是怎样炼成的]

    [PIC论坛]

    [ICC AVR开发网]

    [中国高校自动化网]

     

     

     

    MCU博客-中国电子工程师博客网 

    大学生电子网 

     

     

     

     

     

    !!! 《匠人的百宝箱》 !!!