摘要:美国微芯公司研制的PIC系列单片机,其硬件结构和指令系统采用了与众不同的设计手法。在架构上和概念上对传统单片机进行了一些突破性的变革,但也给这类单片机的应用带来了一些特殊问题。本文针对PIC16F87X系列单片机中断的特点,及其在应用过程中应该注意的几个问题进行必要的说明。内容包括中断源、中断逻辑、中断相关的寄存器、中断的延时、中断的现场保护以及注意事项等。 关键词:单片机 PIC16F87X 中断系统 中断源
目前在世界一些著名的单片机产品系列中,PIC16F87X系列单片机是芯片内部包含有外围设备模块数量最多的单片机品种之一。PIC16F874和PIC16F877单片机的芯片内部集成了15个外围设备模块;PIC16F873和PIC16F876单片机的芯片内部集成了12个外围设备模块。在最近推出的该系列的新型号中, PIC16F870单片机的芯片内部集成了10个外围设备模块;PIC16F871单片机的芯片内部集成了13个外围设备模块;PIC16F872单片机的芯片内部也集成了10个外围设备模块(比PIC16F870多了1个USART模块,少了1个SSP模块)。
这些外围设备模块在启用时以及在工作过程中,都或多或少地需要CPU参与控制、协调或交换数据等各种服务工作。由于CPU的运行速度非常高,而各个外围设备模块的工作速度却非常低,况且这些外围设备模块也不是频繁地要求CPU对其服务。因此,通常采取一种让众多外围设备模块共享1个CPU,并且能够及时得到CPU服务的调度方法——中断。
一、 PIC16F87X的中断源 PIC系列单片机是当今世界上很有影响力的精简指令集(RISC)微控制器,具有丰富的中断功能。其中功能强大的中、高挡型号的中断源有18种之多。在PIC单片机家族中,排位属于中上水平的PIC16F87X子系列单片机具备的中断源多达14种。其中,单片机的型号不同,中断源的种类、个数也不同,如表1所列。其不足之处是:中断矢量只有1个,并且各个中断源之间也没有优先级别之分,不具备非屏蔽中断。 表1 PIC16F87X单片机的中断源及其数量 中断源种类 | 中断源志位 | 中断源蔽位 | 873/ 876 | 874/ 877 | 870 | 871 | 872 | 外部触发中断INT | INTF | INTE | √ | √ | √ | √ | √ | TMR0溢出中断 | T0IF | T0IE | √ | √ | √ | √ | √ | RB端口电平变化中断 | RBIF | RBIE | √ | √ | √ | √ | √ | TMR1溢出中断 | TMR1IF | TMR1IE | √ | √ | √ | √ | √ | TMR2中断 | TMR2IF | TMR2IE | √ | √ | √ | √ | √ | CCP1中断 | CCP1IF | CCP1IE | √ | √ | √ | √ | √ | CCP2中断 | CCP2IF | CCP2IE | √ | √ | | | | SCI同步发送中断 | TXIF | TXIE | √ | √ | √ | √ | | SCI同步接收中断 | RCIF | RCIE | √ | √ | √ | √ | | SSP中断 | SSPIF | SSPIE | √ | √ | | | √ | SSP I2C总线碰撞中断 | BCLIF | BCLIE | √ | √ | | | √ | 并行端口中断 | PSPIF | PSPIE | | √ | | √ | | A/D转换中断 | ADIF | ADIE | √ | √ | √ | √ | √ | E2PROM中断 | EEIF | EEIE | √ | √ | √ | √ | √ | | | | 13种 | 14种 | 10种 | 11种 | 10种 |
从表1中可以看出,各中断源基本上都是与各个外围设备模块相对应的。其中,多数外围设备模块对应着1个中断源(比如定时器/计数器TMR0模块),有的外围设备模块对应着2个中断源(比如通用同步/接收/发送器SCI模块),也有的外围设备模块没有中断源与之对应(比如输入/输出端口RA和RC模块),还有的中断源没有外围设备模块与之对应(比如外部触发中断源INT)。
二、 PIC16F87X的中断硬件逻辑 在PIC16F87X的子系列中,具体型号不同,中断逻辑电路也存在着差异,中断源的种类和个数也不同:最多的具备14种中断源;最少的具备10种中断源(详见表1)。其中并行端口模块和并行端口中断源,只有40脚封装的型号(PIC16F871、PIC16F874和PIC16F877)才会具备;而对于28脚封装的型号(PIC16F870、PIC16F872、PIC16F873和PIC16F876)则不具备。
PIC16F87X系列单片机中断系统的逻辑电路如图1所示。每一种中断源对应着1个中断标志位(记为XXXF,F是Flag的第1个英文字母)和1个中断屏蔽位或者叫中断使能位(记为XXXE,E是Enable的第1个英文字母)。中断源产生的中断标志信号是否得以向前传递,将受控于对应的中断屏蔽位。每一个中断标志位都对应着1个触发器。当中断源申请CPU中断时,与之对应的触发器就由硬件自动置位,而该触发器的清零是由用户安排程序来实现的;每一个中断屏蔽位也对应着1个触发器。该触发器的置位和清零均是由用户程序完成的。
图1描绘的逻辑电路是1个由简单的门电路构成的组合逻辑电路。将全部14个中断源按2个梯队并列排开,第1梯队中只安排了3个中断源,其余的中断源全部安排到第2梯队中。这样做是为了与早期的PIC系列单片机型号相兼容(前些年研制出的单片机型号片内配置的外围设备模块数量较少,相应的中断源的数量自然也就少,比如PIC16C61只有第1梯队中的3个中断源)。近期研制的一些PIC单片机新型号是在原有的单片机芯片基础之上进行一些功能扩展而得来的。
所有的中断源都受全局中断屏蔽位(也可以称为总屏蔽位)GIE的控制。第1梯队的中断源不仅受全局中断屏蔽位的控制,还要受各自中断屏蔽位的控制;第2梯队的中断源不仅受到全局中断屏蔽位和各自中断屏蔽位的控制,还要额外受到1个外设中断屏蔽位PEIE的控制。
图1中断逻辑
三、 中断相关的寄存器 与中断功能有关的特殊功能寄存器共有5个:中断控制寄存器INTCON、第1外围设备中断标志寄存器PIR1、第1外围设备中断屏蔽寄存器(又称中断使能寄存器)PIE1、第2外围设备中断标志寄存器PIR2和第2外围设备中断屏蔽寄存器PIE2。如表2所列,5个寄存器中共有40位,其中使用了30位。分别与图1中的中断逻辑电路的输入逻辑信号成严格对应关系,也与逻辑表达式成严格对应关系。这5个寄存器都具有在RAM数据存储器中统一编码的地址。也就是说,PIC单片机可以把这5个特殊寄存器当作普通寄存器单元来访问(即读出或写入操作)。这样有利于减少指令集的指令类型和指令数量,也便于学习、记忆和编程。 表2 与中断功能相关的寄存器 寄存器名称 | 寄存器符号 | 寄存器地址 | 寄存器内容 | Bit7 | Bit6 | Bit5 | Bit4 | Bit3 | Bit2 | Bit1 | Bit0 | 选项寄存器 | OPTION-REG | 81H/181H | /RBPU | INTEDG | T0CS | T0SE | PSA | PS2 | PS1 | PS0 | 中断控制寄存器 | INTCON | 0BH/8B/
10BH/18BH | GIE | PEIE | T0IE | INTE | RBIE | T0IF | INTF | RBIF | 第1外设中断标志寄存器 | PIR1 | 0CH | PSPIF | ADIF | RCIF | TXIF | SSPIF | CCP1IF | TMR2IF | TMR1IF | 第1外设中断屏蔽寄存器 | PIE1 | 8CH | PSPIE | ADIE | RCIE | TXIE | SSPIE | CCP1IE | TMR2IE | TMR1IE | 第2外设中断标志寄存器 | PIR2 | 0DH | - | - | - | REIF | BCLIF | - | - | CCP2IF | 第2外设中断屏蔽寄存器 | PIE2 | 8DH | - | - | - | EEIE | BCLIE | - | - | CCP2IE |
|