PIC16F87X单片机中断系统应用须关注的问题
- 格式:doc
- 大小:117.50 KB
- 文档页数:7
PIC系列单片机的中断资源特点及其应用方法详解1 PIC单片机简介PIC系列单片机是美国Microchip技术公司推出的高性能价格比的8位嵌入式控制器(Embedded Controller),它采用了精简指令集计算机RISC (Reduced Instruction Set Computer)和哈佛(Harvard)双总线以及两级指令流水线结构。
具有高速度、低工作电压、低功耗等特点和优良的性能价格比,因而PIC系列单片机越来越受到单片机开发与应用工程技术人员的青睐。
该系列独特的结构和中断资源使其在使用时与其它系列的单片机有许多不同之处。
下面以PIC16CXX系列微控制器为例来介绍PIC 系列单片机的中断资源特点以及应用方法。
2 中断资源的开发与屏蔽图1是PIC16C64/64A/65/65A的中断逻辑电路图,其它型号芯睡的中断资源也大致相同,只是资源多少不一而已,但它们的中断入口只有一个(入口地址在004H)。
PIC 单片机的中断大致可以分为两类。
第一类是由中断控制器INTCON直接控制的中断,包括外部引脚中断INT的RB口电平变化中断以及定时器TMRO溢出中断,它们的中断允许位和中断标志都在INTCON寄存器中。
引脚中断INT和定时器TMRO溢出中断与其它微处理器相同。
RB口电平变化中断是PIC 单片机特有的中断,当把RB口高4位I/O口线设置为输入时,只要这4位I/O 口线上的电平发生变化就会引起中断。
RB口的电平中断特性对用户是非常有用的。
用户可以直接利用这些口线的关键部位进行电平检测,并可利用中断进行保护性控制等操作;另一方面,电平中断特性还可以利用RB口的软件控制弱上拉特性组成一个矩阵键盘,并用按键唤醒CPU,这对于那些以电池供电的系统特别有用。
另一类是外围接口中断,包括定时器TMR1溢出中断、TMR溢出或匹配中断、同步串行口中断、异步串行口中断、并行从动口中断和CCP(Capture/Compare/PWM)中断等,而带A/D功能的PIC16C7X系列微处理器还有A/D转换完成中断。
单片机外中断使用方面的问题及其解决方法在长期使用51 单片机的过程中,我们发现单片机在工业生产现场等干扰较强的环境工作时,有时确已产生定义为下降沿触发方式的外中断,然而用仪器测量已经送入单片机的INTX 引脚时,单片机却不能够正常响应中断。
在排除了可能由程序导致的问题之后,再检查CPU 的当前状态,发现中断级别、中断允许、中断触发方式也都表明应该响应中断。
后经分析及测试,发现是单片机INTX 引脚内部端口锁存器被置为零所致。
当端口被封锁为零时,从该引脚引入的下降沿表示的中断申请将丢失,中断当然不被响应。
由于程序中并未使用可将端口锁存器置为零的指令,且这种情况的产生具有一定的随机性,并非经常发生,所以认为这种现象可能是因电路干扰或噪声造成锁存器误动作导致的。
同时我们还认为这种误动作和P3 口的内部结构及操作方式有一定关系。
单片机外中断输入端的P3 口是具有第二变异功能的准双向口,其每一位的内部结构如图1 所示。
当变异功能输出为高电平时,位口是普通I/O 口。
此时如对I/O 口进行写操作,数据由内部总线写入锁存器,经与非门和MOS 管两次反相后送出引脚;如对I/O 口进行读操作,则必须先将锁存器置为1,使MOS 管截止,引脚被片内负载MOS 管(图中标为上拉电阻)上拉为高电平,然后可进行输入操作,当输入为低电平时它能被拉成低电平,引脚信息经两个缓冲器进入内总线;如果使用第二功能(变异功能),输入锁存器同样也必须先被置为1,这时引脚受变异功能输出控制,若需使用变异功能输入,则锁存器和变异输出必须同时置为1,使MOS 管截止,变异功能输入随引脚的变化而变化。
估计在第二功能时只能用于输入中断的P3.2 和P3.3 口,内部可能没有变异功能输出线,即使有,也只能上拉为固定的高电平。
可见,单片机P3口不管是通用I/O 口还是变异功能输入,其锁存器都必须先置为1。
单片机复位后所有I/O 口的状态都是1,一般在系统的初始化程序中定义过中断优先级,并在开中断之后单片机即可响应中断,此后若关掉相应中断允许位(置为0),则需从引脚进入单片机的中断有效信号(低电平或下降沿)虽然仍可进入并使IE0(或IE1)置为1,但不能引起中断,当然程序可查寻IE 了解中断源是否产生了中断申请。
PIC16F87X单片机中断系统应用须关注的问题摘要:美国微芯公司研制的PIC系列单片机,其硬件结构和指令系统采用了与众不同的设计手法。
在架构上和概念上对传统单片机进行了一些突破性的变革,但也给这类单片机的应用带来了一些特殊问题。
本文针对PIC16F87X系列单片机中断的特点,及其在应用过程中应该注意的几个问题进行必要的说明。
内容包括中断源、中断逻辑、中断相关的寄存器、中断的延时、中断的现场保护以及注意事项等。
广告插播信息维库最新热卖芯片: MIC38HC44BM 24LC64-I/SN CD4021BE PIC18F252-I/SO AD8606AR M62431FP TL16C554AFNR S3C4510B01-QER0 L7815 MOCD207目前在世界一些着名的单片机产品系列中,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)微控制器,具有丰富的中断功能。
PIC16F87x的数据存储器规划和中断编程
林东亮;罗胜
【期刊名称】《单片机与嵌入式系统应用》
【年(卷),期】2006(000)007
【摘要】PIC系列单片机的硬件结构和指令系统采用很多独有的设计,其中数据存储器的分页结构是一个典型的特征.本文以PIC16F87x子系列单片机为例,分析其存储器特点,介绍数据存储器变量存储位置的合理安排方法,从而给分页选择处理和中断现场保护编程带来好处.
【总页数】3页(P79-81)
【作者】林东亮;罗胜
【作者单位】闽江学院;温州大学
【正文语种】中文
【中图分类】TP3
【相关文献】
1.在DSP的C编程中常量数据段的存储器分配 [J], 丁刚
2.一次编程(OTP)存储器的数据保持特性工艺研究 [J], 房世林;李月影;何永华
3.0.18μm一次编程(OTP)存储器的数据保持性能研究 [J], 林俊毅;刘宇
4.用单片机实现SPI接口存储器数据编程设计 [J], 李伟光;王元聪
5.浮栅非易失存储器中低温数据保持的编程/擦除循环加速统计模型 [J],
因版权原因,仅展示原文概要,查看原文内容请购买。
PIC单片机中断系统详细汇总在PIC单片机中,中断系统的实现主要包括以下几个方面的内容:1.中断向量表:PIC单片机中的中断系统采用了向量表的形式来管理不同类型的中断。
向量表是一个存放中断服务子程序入口地址的表格,当中断发生时,单片机根据中断号在向量表中查找相应的中断服务子程序入口地址,并跳转到该地址处执行相应的操作。
2.中断优先级:PIC单片机中的中断系统支持多级中断优先级。
不同的中断可以设置不同的优先级,当多个中断同时发生时,系统会根据优先级的设置,优先处理优先级较高的中断,从而保证重要的中断不会被忽略。
3.中断源:PIC单片机支持多个中断源,包括外部中断(外部引脚上的信号触发的中断)、定时器中断(由定时器溢出或比较事件触发的中断)和串口中断(由串口接收/发送数据触发的中断)等。
每个中断源都有对应的中断标志位,当中断发生时,对应的中断标志位会被设置,以便主程序判断中断类型并做出相应的处理。
4.中断使能和屏蔽:PIC单片机中的中断系统提供了中断使能和屏蔽的功能。
通过设置相应的中断使能和中断屏蔽寄存器的位,可以控制一些中断源的中断是否启用,以及在一些中断源触发中断后,是否允许继续触发该中断。
5.中断服务子程序:PIC单片机的中断系统需要用户自行编写中断服务子程序来处理中断事件。
中断服务子程序是一个与主程序独立的子程序,它会在中断发生时被自动调用,并执行特定的操作。
在编写中断服务子程序时,需要注意子程序的实时性和占用资源的情况,以确保中断的及时响应和系统的稳定性。
6.中断处理流程:PIC单片机中的中断处理流程可以简单描述为:当中断发生时,系统会根据中断号在中断向量表中查找相应的中断服务子程序入口地址,并跳转到该地址处执行中断服务子程序。
在中断服务子程序中,可以对中断事件进行处理,清除中断标志位,并在需要的情况下触发其他操作,比如发送数据、修改相关寄存器等。
当中断服务子程序执行完毕后,系统会自动返回到主程序的执行流程中,继续执行之前的任务。
单片机的延时与中断问题及解决方法单片机作为嵌入式系统中非常重要的组成部分,在许多应用中都需要进行延时和中断处理。
延时和中断是单片机中常见的问题,它们直接关系到系统的稳定性和性能。
本文将重点介绍单片机中延时和中断的问题,并提出解决方法。
一、延时问题延时是指在程序执行过程中需要暂停一段时间,以便等待某些条件满足或者执行某些特定的操作。
在单片机中,延时通常需要通过软件实现,也就是在程序中加入延时函数。
常见的延时函数包括循环延时和定时器延时。
1. 循环延时循环延时是指通过循环来实现延时的方式。
具体做法是在程序中使用一个循环来反复执行空操作,从而消耗一定的时间。
下面是一个简单的循环延时函数:```cvoid delay(unsigned int ms){unsigned int i, j;for(i = 0; i < ms; i++)for(j = 0; j < 1000; j++);}```这个函数中,外层循环控制延时的毫秒数,内层循环则是用来消耗时间的。
通过这样的方式可以实现一定量级的延时。
循环延时的精度和稳定性都不够理想,特别是在频繁调用的情况下,容易导致系统性能下降。
2. 定时器延时定时器是单片机中常见的外设之一,它可以生成精确的时间延时。
通过设置定时器的时钟源和计数值,可以实现微秒级甚至更小单位的延时。
在单片机中,通常会使用定时器来实现较为精确的延时操作。
下面是一个使用定时器来实现延时的示例:```cvoid delay_us(unsigned int us){TMOD = 0x01; // 设置定时器为工作方式1TH0 = 0xFF - us / 256; // 设置定时器初值TL0 = 0xFF - us % 256; // 设置定时器初值TR0 = 1; // 启动定时器while(!TF0); // 等待定时器溢出TR0 = 0; // 停止定时器TF0 = 0; // 清除溢出标志}```这段代码中,我们使用定时器0来实现微秒级的延时操作。
PIC单片机引脚中断程序设计技巧,让系统的实时性更好!所有的中档系列PIC单片机,PORTB端口最高的4个引脚(RB7~RB4)在设为输入模式时,当输入电平由高到低或由低到高发生变化时,可以让单片机产生中断。
这就是通常所说的引脚状态变化中断。
在设计引脚中断程序时,有三个需要特别注意的地方:一是,在清除P0RTB中断标志位RBIF之前,必须安排一条必不可少的,以PORTB 端口数据寄存器PORTB为源寄存器的读操作指令。
放置这一指令的目的有时并不只是为了读取有用的数据,而是为了取消状态变化的硬件信号,以便顺利清除RBIF标志位,为下一次中断做好准备。
二是,由于端口PORTB是引脚电子变化中断,即无论引脚出现上升沿还是下降沿都会产生中断请求,所以必须处理好不需要的虚假中断。
三是,一般都利用PIC单片机的引脚功能来检测按键,所以必须处理好按键消抖的问题。
引脚中断程序设计在主程序里先设置有关的寄存器设置TRISB寄存器,使RB7~RB4相关的引脚处于输入状态;如果需要弱上拉,通过OPTION_REG的第7位设置;RBIF=O;RBIE=1;GIF=1。
响应状态变化后的中断服务程序检查RBIF是否为l,为l则是引脚变化引起的中断;调用延时程序,延时20~30 ms,目的是为了按键去抖;判断是引脚出现上升沿还是下降沿引起的中断;调用按键处理程序;读PORTB口的值,取消状态变化的硬件信号;清除RBIF标志。
笔者认为上面程序设计最大的问题是在中断程序里调用延时程序。
大家知道,中档PIC单片机只有8层深度的硬件堆栈,在中断里调用于程序出现极易堆栈溢出的情况。
另外,PIC单片机中断程序入口只有一个,在响应中断的请求时,PIC 单片机就会自动把全局中断的使能位(INTCON的第7位GIF)清除,这样其他中断就暂时不能被响应(此时,如果别的中断发出的中断请求,标志位将一直保留着),直到这个中断程序退出后才会得到响应。
PIC单片机习题第一次一、选择题(B)1、PIC单片机采用总线结构。
A、普林斯顿B、哈佛2、PIC16F877单片机精简指令集系统共 C 条。
A、75B、133C、35D、1113、PIC16F877单片机程序存储器和数据存储器的宽度是 B 和。
A、8,8B、14,8C、16,8D、16,164、PIC16F877单片机共 C 中断源。
A、5B、8C、14D、165、PIC16F877单片机共 C 端口。
A、3B、4C、5D、66、PIC16F877单片机共有 C 个定时/计数器A、1B、2C、3D、47、PIC16F877单片机定时器1具有的特殊功能是 D 。
A、定时B、计数C、PWMD、CCP8、若端口B接8个按键,则该端口的TRISB应初始化成A、0x00B、0xFFC、0x0FD、0xF09、TMR0的位宽度为A、8B、16C、32D、6410、 PIC16F877 单片机外围接口区域包括RA,RB,RC,RD 和RE 5个端口,而每个端口均有多条输入/输出可编程的引脚,合计5个端口共有__C____条引脚.A. 30B. 34C.33D.3111、PIC16F877 单片机外围接口区域包括RA,RB,RC,RD 和RE 5 个端口.在下列端口中,____D_____并不具备8 条引脚.A.. RA,RBB. RC,RDC. RB,RCD. RA,RE二、问答题1、如何确定I/O端口的输入和输出?答:根据方向控制TRIS确定,高电平做输出,低电平做输入。
2、在确定A、B、C、D、E端口的功能时,首先要执行什么操作?答:确定端口方向。
3、PIC16F877单片机有几个定时/计数器?他们的区别是什么?答:TMR0 8位宽与WDT共用预分频器TMR1 16位宽与CPP模块配合使用可实现捕捉和比较功能TMR2 只作定时;8位宽与PWM模块配合使用可实现脉宽调制输出功能4、PIC单片机具有的优点有哪些?答、1、哈佛总线结构;2、指令系统采用RISC技术;3、代码压缩率高;4、IO端口驱动负载能力较强及功耗低等。
PIC16F87X单片机中断系统应用须关注的问题发布时间:2009-7-21 阅读次数:210 字体大小: 【小】【中】【大】作者:河北省邮电学校李学海摘要:美国微芯公司研制的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单片机的中断源及其数量从表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 与中断功能相关的寄存器四、中断的处理单片机复位后,由硬件自动对全局中断屏蔽位进行设置GIE=0,将屏蔽所有的中断源。
中断返回指令“RETFIE”执行后,也由硬件自动对总屏蔽位进行设置GIE=1,重新开放所有的中断源。
不论各种中断屏蔽位和全局中断屏蔽位GIE处于何种状态(是开放还是禁止),当某一中断源的中断条件满足时,都会发出中断请求,相应的中断标志位都会被置位(=1)。
但是,是否能够得到CPU的响应,则要根据该中断源所涉及到的中断屏蔽位的状态而定。
CPU响应中断后,由硬件自动对全局中断屏蔽位进行清零(GIE=0),屏蔽所有的中断源,以免发生重复中断响应,然后,由硬件自动把当前的程序计数器PC值(即程序断点地址)压入堆栈(实际为硬件堆栈),并且把PC寄存器置以中断向量地址(0004H),从而转向并开始执行中断服务程序。
进入中断服务程序后,程序中必须安排指令,检查发出请求的中断源(如果同时开放多个中断源的话)。
这可以通过检查各个中断源的标志位来实现。
一旦确定出发出申请的中断源,就用软件把该中断源的标志位人为地清零,否则,执行中断返回指令“RETFIE”。
重开中断后,由于中断标志位仍为“1”而引起CPU重复响应同一个中断请求。
中断服务程序的末尾必须放置1条中断返回指令“RETFIE”。
执行该条指令后,不仅可以重开中断,而且还可以由硬件自动将保留在堆栈顶部的断点地址弹出,并放回到程序计数器PC中,使CPU返回和继续执行被中断的主程序。
1 中断的延时响应和延时处理1次中断过程,从中断源发出请求到得到CPU的响应必然存在一定的延迟时间。
各个相关信号的时序图如图2所示。
图2INT引脚中断时序图在图2中,第1行是系统时钟脉冲信号,每4个时钟周期对应1个指令周期。
第2行就是指令周期信号。
该信号只有在RC振荡模式下,从OSC2脚上可以向片外送出。
第3行是单片机外部引脚INT送入的中断脉冲信号。
外部中断信号INT是用边沿触发的。
假设预先设定的是INT中断信号上升沿有效的话,则该信号的上升沿将会在1个时钟周期后引发中断标志位INTF被置位。
第4行代表INTF信号。
每个指令周期内的第2个时钟脉冲上升沿时,该信号被抽检1次。
一旦检测到INTF信号被设置为“1”,则CPU会在接下来的1个指令周期内,将全局中断屏蔽位GIE清零。
第5行是全局中断屏蔽位GIE。
在GIE信号被清零的下一个指令周期内,程序计数器PC被置入中断向量0004H,见图2中第6行。
同时在该指令周期内完成到中断服务程序的跳转,并且实现提取该子程序的首条指令,即指令(0004H),见图2中第7行。
在其后的1个指令周期内,正式开始执行中断服务程序的第1条指令,见图2中第8行。
自INT引脚输入有效信号,到中断服务程序的第1条指令得到执行,大约需要3~4个指令周期的延时。
更精确的延迟时间取决于中断事件的发生时机。
以上描述的只是1次中断从申请到得到CPU的响应的延迟时间。
下面分析从CPU响应1次中断到该中断得到有效处理的延迟时间。
由于具有中断功能的PIC系列单片机(低档产品PIC16C5X和PIC12C5X系列不具备中断功能),采用的是“多源中断”的设计方案(即1个中断向量对应着多个中断源),只有惟一的1个中断向量,或者说只有1个中断服务程序入口地址。
这就意味着,此类单片机的中断服务程序只能编写1个。
这类单片机的硬件结构得到了简化,那么,相应的软件设计上就得多开销一些。
在1个中断服务程序中,若想对多个中断源作出处理,就必须在进入中断服务程序后,首先执行调查具体中断源的一条或多条指令,其后才能对查到的中断源作出有针对性的服务。
如此以来,就形成了1次中断从CPU响应到进入针对性处理的延迟时间。
该时间有长有短,它会随着被开放的中断源的个数的增加而增加。
最好情况是只有1个中断源被开放,这时不需要检测中断源就可以立即进入针对性处理;最坏情况是所有中断源全部开放,此时用在检测中断源上的时间会最长。
另外,PIC单片机中采用的是硬件堆栈结构。
其好处是既不占用程序存储器空间,也不占用数据存储器空间,同时也不需用户去操作堆栈指针;但此时也带来1个不可回避的弱点,即不具备像其他单片机指令系统中的压栈(PUSH)和出栈(POP)指令那样,实现中断现场的保护会麻烦一些,并且占用的处理时间也相应多一点。
2 中断的现场保护问题中断现场的保护是中断技术中一个很重要的环节。
在进入中断服务程序期间,只有返回地址,即程序计数器PC的值被自动压入堆栈。
若需要保留其他寄存器的内容,就得由程序员另想办法。
由于PIC单片机的指令系统中没有像其他单片机那样的PUSH(入栈)和POP(出栈)之类的指令,所以要用1段用户程序来实现类似的功能。
因为是用1段程序来实现现场保护,而程序的执行有可能会影响到W寄存器和STATUS 寄存器,所以,首先应该把这2个寄存器保护起来,然后再去保存其他用户认为有必要保护的寄存器。
并且在PIC单片机中,中断现场数据不是保留到芯片的堆栈存储区中,而是保留在用户自己选择的一些文件寄存器(即RAM数据存储器单元)中,当然一般应该选择通用寄存器来保护现场。
下面给出的是1段原厂家最新提供的实现保护中断现场的范例程序片段。
;将W、STATUS和PCLATH寄存器的内容保存到临时备份寄存器中[1]MOVWFW_TEMP ;复制W到它的临时备份寄存器W_TEMP中[2]SWAPFSTATUS,W ;将STATUS寄存器高低半字节交换后放入W[3]CLRFSTATUS ;不管当前处在哪个体,都设置体0作当前体[4]MOVWFSTATUS_TEMP ;保存STATUS到体0上的临时寄存器STATUS_TEMP[5]MOVF PCLATH, W ;把寄存器PCLATH内容复制到W中[6]MOVWFPCLATH_TEMP ;经W将PCLATH内容转到临时寄存器PCLATH_TEMP[7]CLRFPCLATH ;不管当前处在哪页,都把PCLATH设置成指向页0 (中断服务程序的核心部分) [8]MOVFPCLATH_TEMP, W ;经过W转移[9]MOVWFPCLATH ;恢复PCLATH内容[10]SWAPFSTATUS_TEMP,W ;将STATUS_TEMP寄存器高低半字节交换后放入W[11]MOVWFSTATUS ;把W内容移动到STATUS寄存器,(同时也把当前体恢复到原先的体上)[12]SWAPFW_TEMP,F ;将W_TEMP内容高低半字节交换后放回[13]SWAPFW_TEMP,W ;再次将W_TEMP内容高低半字节交换后放入W这段程序适用于PIC16CXX系列中各款型号的单片机。