pic汇编宏技巧-bank切换
mplab中有条非常有用的伪指令:banksel可用它来快捷设置 bank 而不用 status 的 rp0 ,rp1去具体的设置bank 。
banksel ****,通常只改变status,rp1,rp0,而rp1,rp0仅仅对 直接寻址[/b] [/b]有效
但banksel不会改变status,irp,也就是说,banksel的页选择对 间接寻址[/b] [/b]是没有用的.
以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
[URL=http://mayer.spaces.eepw.com.cn/articles/trackback/item/62107][/URL]
----------------------------------------------
此篇文章从博客转发
原文地址:
Http://blog.gkong.com/more.asp?id=97832&Name=zjcsharp