sjy1979的笔记 https://bbs.21ic.com/?689713 [收藏] [复制] [RSS]

日志

转载:关于PIC单片机的中断现场保护问题

已有 675 次阅读2011-3-19 01:02 |系统分类:单片机| 单片机, 中断

       在进入中断服务子程序期间,只有返回地址PC的数值被自动压入堆栈,其他的一些寄存器的内容就得按照程序的需要由我们自己想办法了。PIC单片机汇编语言没有象51系列单片机那样的PUSH    POP指令,所以我们要用一段程序来实现类似的功能。


       因为是用一段程序来实现现场的保护,这样就可能影响到W和STATUS寄存器,所以我们要在保护现场的时候先把这两个寄存器给保护了。这些现场保护不是将数据保存在芯片的堆栈中。而是将其放到RAM中进行保存。个人认为将这些数据保存在与体选址无关的RAM中,也就是说PIC一般有四个体,无论目前在哪个体里改变其RAM的数据,都可以映射到其他体中,本人认为这样在程序上比较方便,避免了一些弊端和麻烦。我也是刚接触PIC,如果有说的不对的地方,还请大家提出,我们共同探讨。先谢了:)


       下面引用一段厂家提供的中断现场保护的样例程序:将W,STATUS,和PCLATH寄存器内的内容保存到临时备分寄存器中


(1)     MOVWF        W_TEMP                复制W到它的临时寄存器W_TEMP中


(2)    SWAPF          STATUS,W             将STATUS中的高低四位交换后放入W


(3)    CLRF             STATUS              不管目前在哪个体,都设置成体0为当前体


(4)    MOVWF         STATUS_TEMP   保存STATUS到体0上的临时寄存器


(5)   MOVF             PCLATH,W          把寄存器PCLATH中的内容复制到W中


(6)  MOVWF           PCLATH_TEMP     保存PCLATH到临时寄存器里


(7)  CLRF               PCLATH                不管当前处在哪页,都把PCLATH设置成0


............(中断服务子程序的核心部分)


(8)  MOVF              PCLATH_TEMP,W      经过W转移


(9) MOVWF          PCLATH                   恢复PCLATH


(10)SWAPF           STATUS_TEMP,W   交换后放回W


(11)MOVWF          STATUS


(12)SWAPF           W_TEMP,1


(13)SWAPF            W_TEMP,0


我们来看前面的程序  有一点需要声明的是,PIC的一部分汇编语句在运行的过程中会改变STATUS寄存器的数据,所以在保护好STATUS之前禁止使用能够改变STATUS的语句        


语句1用来保护W寄存器,因为MOVWF语句不改变STATUS所以可以直接使用PIC数据的传递基本都是通过W来转的,所以保护一上来先将W中的数据保护到临时备分中,在中断返回的时候再将其恢复.


语句2:用来保护STATUS,由于MOVF指令改变了STATUS所以在这里不能直接使用


MOVF      STATUS,W语句,而使用了SWAPF   指令,在这里我们没有应用他的高低半字节交换的功能,而是应用了这条语句的执行对STATUS寄存器没有影响,所以在中断恢复的时候我们仍然要使用SWAPF将高低半字节颠倒过来:)


语句3 和4:这个时候我们已经将STATUS的内容低位与高位颠倒后放入W寄存器中,所以这个时候我们就可以放心的改变STATUS的内容了  ,此两句是将STATUS的内容放到临时寄存器中。另外还有一点就是在恢复STATUS之前我们就不介意使用改变STATUS内容的指令了,一但恢复后,仍然不能使用改变STATUS的指令,直到中断返回到主程序中.


语句5、6和7     是对PCLATH的保护,其实对于一些小的程序这个是不用保护的,但怎么说呢,为了程序的规范性,以及防止因为某些因素而让PCLATH变成一个不可预料的数据,我们还是在这里对它进行一下保护吧。因为我们的中断服务程序在体0中,所以保护完后就将PCLATH清0


语句8、9是恢复PCLATH的指令在这里也就不多说了


语句10、11,我们前面已经说了在中断返回的时候恢复STATUS的数值需要将高低位颠倒过来,然后放入STATUS寄存器中,这两个语句都不改变状态位,所以可以放心使用   


语句12、13   由于此前已经恢复了STATUS所以这个时候我们在恢复W的时候要非常注意不要影响STATUS,所以在这里使用了两个SWAPF语句,字节交换上负负为正,还没有影响到状态位,呵呵。


路过

鸡蛋

鲜花

握手

雷人

评论 (0 个评论)