PIC16F87x的数据存储器规划和中断编程
时间:09-21
来源:互联网
点击:
3 中断编程
中断现场的保护是中断技术中一个很重要的环节。对于PIC16F87x单片机,在进入中断服务程序期间,只有返回地址,即程序计数器PC的值被自动压入硬件堆栈;而在中断处理程序中,一般必须像使用WReg、STATUS等寄存器一样,在中断处理程序开始处,就备份这些寄存器的内容,即进行所谓的现场保护。
PIC16F87x子系列单片机具备的中断源多达14种,中断矢量只有1个,并且各个中断源之间也没有优先级别之分,不具备非屏蔽中断。PIC单片机中采用的是硬件堆栈结构,不占用程序存储器空间,也不占用数据存储器空间,同时也无需用户去操作堆栈指针;但同时也就决定了它不具备其他单片机指令系统中的压栈(PUSH)和出栈(POP)指令。实现中断现场保护时,不能用堆栈来实现,而是通过变量的复制备份来实现。一般的实现办法是:先确定要保护的现场,一般包括WReg、STATUS等寄存器的内容,然后在各个页都定义与这些寄存器对应的变量,以备份现场。发生中断时,在中断处理代码开始处先将这些现场寄存器内容复制到备份变量,退出中断处理时再复制回去恢复现场:
ORG 0x004 ;中断向量人口
movwf w_temp ;保存当前w 寄存器内容
mov STATUS,w ;将STATUS 寄存器内容复制到w
movwf status_temp ;保存STATUS寄存器内容
movf PCLATH,w ;将PCLATH寄存器复制到w
movw{ pclath_temp ;保存PCLATH 器内容
……
;中断处理代码放在这里
……
movf pclath_temp,w;
movwf PCLATH ;恢复PCLATH 寄存器内容
movf status_temp,w;
movwf STATUS ;恢复STATUS寄存器内容
swapf w_temp,f
swapf w_temp,w ;恢复w 寄存器内容
retfie ;中断返回
因为中断发生具有随机性,发生中断时当前的页是哪个也具有不确定性,所以只在某个页(如BANK0)中定义一套备份变量w_temp、status_temp等,处理起来是很麻烦的,也要耗费CPU 处理时间,所以一般在每个页BANK都定义了一套用于备份现场的变量。这显然是浪费空间的办法。
进行数据存储器的变量规划后,程序的执行过程都是在BANK0,因此在BANK0定义一套备份变量就可以了。要备份的现场包含哪些寄存器,可以根据系统具体情况而定。
基于上面设计的中断处理程序,总是默认当前的页是BANK0。如果在访问一些不在BANK0的特殊寄存器而没有关闭中断,而刚好此时发生中断,则此时不能正确访问到wREG_TEMP等备份变量了,这种情况就是个错误。
结语
用PIC16F87x单片机开发室内监控系统,进行变量的规划,免去大量的页选择问题带来的不便,能够避免分页没处理好而带来程序BUG。PIC系列单片机都有类似的硬件结构和指令系统,所以存储器的规划对于其他PIC系列单片机应该也是起作用的。另外,这也从另一个角度说明,在设计阶段对系统变量的物理存储进行适当的规划,有时会得到意想不到的效果。
中断现场的保护是中断技术中一个很重要的环节。对于PIC16F87x单片机,在进入中断服务程序期间,只有返回地址,即程序计数器PC的值被自动压入硬件堆栈;而在中断处理程序中,一般必须像使用WReg、STATUS等寄存器一样,在中断处理程序开始处,就备份这些寄存器的内容,即进行所谓的现场保护。
PIC16F87x子系列单片机具备的中断源多达14种,中断矢量只有1个,并且各个中断源之间也没有优先级别之分,不具备非屏蔽中断。PIC单片机中采用的是硬件堆栈结构,不占用程序存储器空间,也不占用数据存储器空间,同时也无需用户去操作堆栈指针;但同时也就决定了它不具备其他单片机指令系统中的压栈(PUSH)和出栈(POP)指令。实现中断现场保护时,不能用堆栈来实现,而是通过变量的复制备份来实现。一般的实现办法是:先确定要保护的现场,一般包括WReg、STATUS等寄存器的内容,然后在各个页都定义与这些寄存器对应的变量,以备份现场。发生中断时,在中断处理代码开始处先将这些现场寄存器内容复制到备份变量,退出中断处理时再复制回去恢复现场:
ORG 0x004 ;中断向量人口
movwf w_temp ;保存当前w 寄存器内容
mov STATUS,w ;将STATUS 寄存器内容复制到w
movwf status_temp ;保存STATUS寄存器内容
movf PCLATH,w ;将PCLATH寄存器复制到w
movw{ pclath_temp ;保存PCLATH 器内容
……
;中断处理代码放在这里
……
movf pclath_temp,w;
movwf PCLATH ;恢复PCLATH 寄存器内容
movf status_temp,w;
movwf STATUS ;恢复STATUS寄存器内容
swapf w_temp,f
swapf w_temp,w ;恢复w 寄存器内容
retfie ;中断返回
因为中断发生具有随机性,发生中断时当前的页是哪个也具有不确定性,所以只在某个页(如BANK0)中定义一套备份变量w_temp、status_temp等,处理起来是很麻烦的,也要耗费CPU 处理时间,所以一般在每个页BANK都定义了一套用于备份现场的变量。这显然是浪费空间的办法。
进行数据存储器的变量规划后,程序的执行过程都是在BANK0,因此在BANK0定义一套备份变量就可以了。要备份的现场包含哪些寄存器,可以根据系统具体情况而定。
基于上面设计的中断处理程序,总是默认当前的页是BANK0。如果在访问一些不在BANK0的特殊寄存器而没有关闭中断,而刚好此时发生中断,则此时不能正确访问到wREG_TEMP等备份变量了,这种情况就是个错误。
结语
用PIC16F87x单片机开发室内监控系统,进行变量的规划,免去大量的页选择问题带来的不便,能够避免分页没处理好而带来程序BUG。PIC系列单片机都有类似的硬件结构和指令系统,所以存储器的规划对于其他PIC系列单片机应该也是起作用的。另外,这也从另一个角度说明,在设计阶段对系统变量的物理存储进行适当的规划,有时会得到意想不到的效果。
- dsPIC33FJ256MC710疑难问题及解决方法(01-22)
- 晶圆级芯片封装和TO-92封装的单I/O总线EEPROM(微芯)(04-07)
- PIC单片机在线调试中的一些问题(06-09)
- 基于89C51的IC卡读写器设计与实现(07-23)
- 基于51主控的IP电话设计(09-16)
- 基于TMP04的PIC单片机测温实现(11-01)