原创 pic汇编宏技巧-bank切换

2009-8-3 16:56 1603 2 2 分类: MCU/ 嵌入式

MPLAB中有条非常有用的伪指令:BANKSEL可用它来快捷设置 BANK 而不用 STATUS RP0 ,RP1去具体的设置BANK <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />


BANKSEL ****,通常只改变STATUS,RP1,RP0,RP1,RP0仅仅对 直接寻址 有效


 


BANKSEL不会改变STATUS,IRP,也就是说,BANKSEL的页选择对 间接寻址 是没有用的.


 


以<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />877A为例,如果你的寻址目标在BANK1,那么你设置BANKSEL BANK1,这样直接,间接寻址都有效


 


但如果你的寻址目标在BANK3,而用BANKSEL BANK3设置页地址,此时直接寻址有效,但间接寻址就会出错,因为BANKSEL不能改变STATUS,IRP


 


编译是能通过的,没问题,即便你不设置BANKSEL,编译也照样能通过,如果你用BSF(BCF)  STATUS,RP0(RP1)语句编译并烧录后,程序能正常运行,而用BANKSEL BANK*,编译并烧录,而程序却不能通过,这样的问题才是古古怪怪的问题,那我也没办法.


 


我有一个大程序,开始能通过,后来因为扩展,将原来BANK1上定义的寄存器改为BANK2,对应的页设置也仅仅是用BANKSEL BANK3,编译照样能通过,运行时就麻烦了.后来在每个BANKSEL BANK*的语句后面紧跟一句BSF(BCF) STATUS,IRP.如果要返回BANK0,全部用CLRF STATUS(或者同时将IRP,RP1RP0)三个位清0


 


 


 


PUSH_MACRO  MACRO


    MOVWF   W_TEMP


    SWAPF   STATUS,W


    MOVFW   STATUS_TEMP


    ENDM


 


POP_MACRO   MACRO


    SWAPF   STATUS_TEMP,W


    MOVWF   STATUS


    SWAPF   W_TEMP,F


    SWAPF   W_TEMP,W


    ENDM


TAG: PIC pic
PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
2
关闭 站长推荐上一条 /3 下一条