PIC单片机中断系统详细汇总.ppt_第1页
PIC单片机中断系统详细汇总.ppt_第2页
PIC单片机中断系统详细汇总.ppt_第3页
PIC单片机中断系统详细汇总.ppt_第4页
PIC单片机中断系统详细汇总.ppt_第5页
已阅读5页,还剩56页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第八章中断系统 8 1中断的基本概念当单片机正在执行程序时 出现了某些特殊状况 例如定时时间到 有键盘信号输入等 此时CPU须要暂时停止当前的程序 而转去执行处理这些事件的程序 待执行完这些特定的程序之后 再返回到原先的程序去执行 这就形成了一次 中断 中断 加强了单片机处理突发事件的能力 如果没有中断功能 对可能发生的特殊状况的处理就必须采用定时查询 这样就会浪费大量的CPU时间 因此 中断是单片机中很重要的一个概念 是提高工作效率的重要功能 中断系统功能的好坏是衡量单片机功能的重要指标 单片机的 中断源 与单片机包含的外围设备有很大的关系 所谓 中断源 就是引起中断的原因或根源 就是中断请求的来源 PIC16F87X系列集成了较多的外围设备 16F874 877内部集成了15个外围设备 16F873 876内部集成了12个外围设备 16F870 872内部集成了10个外围设备 16F871内部集成了13个外围设备 外围设备在工作过程中 都需要CPU参与控制 协调或交换数据等服务 而CPU正是通过中断技术使得这些外围设备协调工作的 PIC单片机作一次中断处理的过程如下 当某一中断源发出中断请求时 假如CPU正在执行更重要的任务 则可采用屏蔽的方法暂时不响应该中断请求 如果可以响应该中断请求 则CPU执行完当前指令后 必须把断点处的程序计数器PC的值 即下一条指令的地址 压入堆栈保存起来 断点保护 也可以把一些的重要寄存器内容也保护 起来 现场保护 然后再转移到相应的中断服务子程序中执行 在中断服务子程序中 首先必须确定发出中断请求的中断源 然后再跳转到与该中断源相对应的程序分支中去执行中断服务程序 当中断服务程序执行毕后 必须先恢复被保护的寄存器的值 现场恢复 再将程序计数器PC的值从堆栈中恢复 断点恢复 使CPU返回断点处继续执行被中断的程序 8 2PIC16F87X的中断源PIC16F87X单片机具备的中断源如下表所示 从上表可看出 各中断源基本上都与各个外围设备模块相对应的 多数的外围设备对应着一个中断源 如定时 计数器TMR0 也有的外围设备对应二个中断源 如SCI同步 异步接收 发送器USART 有的外围设备没有中断源与之对应 如输入 输出端口RA和RC 也有的中断源没有外围设备与之对应 例如外部中断源INT 8 3PIC16F87X的中断硬件逻辑在PIC16F87X单片机中 不但中断源的种类和个数不同 它们的中断逻辑电路也不同 PIC16F87X单片机的中断系统的逻辑电路如图9 1 a e 所示 p101 103 每一种中断源对应了一个中断标志位 记为XXXF 以及一个中断屏蔽位或叫中断使能位 记为XXXE 中断源产生的中断信号能否到达CPU 都受控于相应的中断屏蔽位 每个中断源申请中断时 其中断标志位会自动置位 中断标志位的清0是由用户程序完成的 而每个中断屏蔽位的置位和清位均由用户程序完成 下图是由一些门电路构成的中断组合逻辑电路 图中全部的的14个中断源按两个梯队并列排开 第一梯队中只安排了3个中断源 其余的中断源全部安排到第二梯队中 所有的中断源都受 全局中断屏蔽位 也称总屏蔽位 GIE的控制 第一梯队的中断源不仅受GIE的控制 还要受各自中断屏蔽位的控制 第二梯队的中断源不仅受到GIE和各自中断屏蔽位的控制 还要受到一个外设中断屏蔽位PEIE的控制 8 4中断相关的寄存器 与中断有关的特殊功能寄存器SFR共有6个 分别是 选项寄存器OPTION REG 中断控制寄存器INTCON 第一外围设备中断标志寄存器PIR1 第一外围设备中断屏蔽寄存器PIE1 也称中断使能寄存器 第二外围设备中断标志寄存器PIR2和第二外围设备中断屏蔽寄存器PIE2 如表9 2所列 后5个SFR 共有40位 但仅使用了30位来控制中断 分别与图9 l中的中断逻辑电路的输入信号成严格的对应关系 选项寄存器OPTION REGOPTION REG选项寄存器是可读写的 各位的分布形式 该寄存器包含了与定时 计数器TMR0 分频器和端口RB有关的控制位 RB端口引脚RB0和外部中断INT复用一脚 与该脚有关的一个控制位含义如下 INTEDG 外部中断INT触发信号边沿选择位 1 选择RB0 INT上升沿触发 0 选择RB0 INT下降沿触发 中断控制寄存器INTCON中断控制寄存器是一个可读 可写的寄存器 各位的分布形式如下 它将第一梯队中的3个中断源的标志位和屏蔽位 以及PEIE和GIE包含在其中 RBIF 端口RB的引脚RB4 RB7电平变化中断标志位 1 RB4 RB7已经发生了电平变化 0 RB4 RB7尚未发生电平变化 RBIE 端口RB的引脚RB4 RB7电平变化中断屏蔽位 1 允许端口RB产生的中断 0 屏蔽端口RB产生的中断 INTF 外部INT引脚中断标志位 1 外部INT引脚有中断触发信号 0 外部INT引脚无中断触发信号 INTE 外部INT引脚中断屏蔽位 l 允许外部INT引脚产生的中断 0 屏蔽外部INT引脚产生的中断 INTE 外部INT引脚中断屏蔽位 l 允许外部INT引脚产生的中断 0 屏蔽外部INT引脚产生的中断 T0IF TMR0溢出中断标志位 1 TMR0已经发生了溢出 0 TMR0尚未发生溢出 T0IE TMR0溢出中断屏蔽位 1 允许TMR0溢出后产生的中断 0 屏蔽TMR0溢出后产生的中断 PEIE 外设中断屏蔽位 1 允许CPU响应来自第二梯队的中断请求 0 禁止CPU响应来自第二梯队的中断请求 GIE 全局中断屏蔽位 总屏蔽位 1 允许CPU响应所有中断源产生的中断请求 0 禁止CPU响应所有中断源产生的中断请求 第一外围设备中断标志寄存器PIR1寄存器PIR1也是一个可读 可写的寄存器 各位的分布形式如下 该寄存器中各中断标志位的含义如下 TMR1IF 定时 计数器TMR1模块溢出中断标志位 1 发生了TMR1溢出 0 未发生TMR1溢出 TMR2IF 定时 计数器TMR2模块溢出中断标志位 1 发生了TMR2溢出 0 未发生TMR2溢出 CCP1IF 输入捕捉 输出比较 脉宽调制CCP1模块中断标志位 输入捕捉模式下 1 发生了捕捉中断请求 0 未发生捕捉中断请求 输出比较模式下 1 发生了比较输出中断请求 0 未发生比较输出中断请求 脉宽调制模式下 无用SSPIF 同步串行端口 SSP 中断标志位 1 发送 接收完毕产生的中断请求 0 等待发送 接收 TXIF 串行通信接口 SCI 发送中断标志位 1 发送完成 即发送缓冲区空 0 正在发送 即发送缓冲区未空 RCIF 串行通信接口 SCI 接收中断标志位 1 接收完成 即接收缓冲区满 0 正在准备接收 即接收缓冲区空 ADIF 模拟 数字 A D 转换中断标志位 1 发生了A D转换中断 0 未发生A D转换中断 PSPIF 并行端口中断标志位 只有40脚封装型号具备 对于28脚封装型号总保持0 1 并行端口发生了读 写中断请求 0 并行端口未发生读 写中断请求 第一外围设备中断屏蔽寄存器PIE1第一外围设备中断屏蔽寄存器PIEl也是可读写的寄存器 各位的分布形式如下 该寄存器中包含的中断屏蔽位 使能位 的含义如下 TMR1IE 定时器 计数器TMRl模块溢出中断屏蔽位 l 开放TMRl溢出发生的中断 0 屏蔽TMRl溢出发生的中断 TMR2IE 定时 计数器TMR2溢出中断屏蔽位 1 开放TMR2溢出发生的中断 0 屏蔽TMR2溢出发生的中断 CCP1IE 输入捕捉 输出比较 脉宽调制CCP1模块中断屏蔽位 1 开放CCP1模块产生的中断请求 0 屏蔽CCP1模块产生的中断请求 SSPIE 同步串行端口 SSP 中断屏蔽位 1 开放SSP模块产生的中断请求 0 屏蔽SSP模块产生的中断请求 TXIE 串行通信接口 SCI 发送中断屏蔽位 1 开放SCI发送中断请求 0 屏蔽SCI发送中断请求 RCIE 串行通信接口 SCI 接收中断屏蔽位 1 开放SCI接收中断请求 0 屏蔽SCI接收中断请求 ADIE 模拟 数字 A D 转换中断屏蔽位 1 开放A D转换器的中断请求 0 屏蔽A D转换器的中断请求 PSPIE 并行端口中断屏蔽位 只有40脚封装型号具备 对于28脚封装型号总保持0 1 开放并行端口读 写发生的中断请求 0 屏蔽并行端口读 写发生的中断请求 第二外围设备中断标志寄存器PIR2第二外围设备中断标志寄存器PIR2也是一个可读写的寄存器 各位的分布形式如下 各位的含义如下 CCP2IF 输入捕捉 输出比较 脉宽调制CCP2模块中断标志位 输入捕捉模式下 1 发生了捕捉中断请求 必须用软件清0 0 未发生捕捉中断请求 输出比较模式下 1 发生了比较输出中断请求 必须用软件清0 0 未发生比较输出中断请求 脉宽调制模式下 无用BCLIF I2C总线冲突中断标志 当同步串行端口MSSP被配置成I2C总线的主控器模式时 1 发生了总线冲突 0 未发生总线冲突 EEIF EEPROM写操作中断标志位 1 写操作已经完成 必须用软件清0 0 写操作未完成或尚未开始进行 第二外围设备中断屏蔽寄存器PIE2PIE2各位的分布形式如下 CCP2IE 输入捕捉 输出比较 脉宽调制CCP2模块中断屏蔽位 1 开放CCP2模块产生的中断请求 0 屏蔽CCP2模块产生的中断请求 EEIE EEPROM写操作中断屏蔽位 1 开放EEPROM写操作产生的中断请求 0 屏蔽EEPROM写操作产生的中断请求 8 5中断的处理单片机复位后 硬件会自动设置GIE 0 屏蔽所有的中断源 假如要求单片机能响应所有中断 必须设置GIE 1 其实无论GIE或着其他中断屏蔽位是否为1 当某中断源的中断条件满足时 都会发出中断请求 即相应的中断标志位都会置1 但是否能够得到CPU的响应 则由该中断源的中断屏蔽位决定 CPU响应中断后 自动设置GIE 0 屏蔽所有中断 以免发生重复中断响应 然后自动把PC寄存器当前值压入堆栈 并把PC值赋予地址0004H 从而转向执行中断服务子程序 进入中断服务程序后 程序必须要确定发出请求的中断源 这可以通过检查各中断源的标志位来实现 确定了中断源后 就用软件把该中断源的标志位清0 否则 执行中断返回指令重开中断后 假如中断标志位仍然为1 则会引起CPU重复响应同一个中断请求 执行中断返回指令RETFIE后 不仅会将保留在堆栈中的断点地址弹回到PC寄存器中 使程序能返回到被中断的程序处 而且还会自动设置GIE 1 重新开放所有的中断源 8 5 1中断的现场保护问题中断现场保护是中断技术中十分重要的环节 在进入中断服务子程序期间 堆栈中只能保存返回地址 程序计数器PC的值 若要保留其他寄存器的内容 怎么办 由于PIC的指令系统中没有PUSH 入栈 和POP 出栈 之类的指令 所以用户要编制一段程序来实现现场保护的功能 因为是由用户程序来实现现场保护 而程序的执行中最敏感的寄存器无非就是W寄存器和STATUS寄存器 所以应该首先把这两个寄存器保护起来 然后再去保存其他的寄存器 PIC单片机中 中断现场数据是不能保留到堆栈区域中的 而是保留在RAM存储器单元中 一般是保留在通用寄存器中 在PIC中 现场保护是很麻烦的事 因为中断是随机发生的 不管程序执行到哪一步 也不管程序所选择的RAM的当前体是哪一个 更不管主程序目前在程序存储器那个页面 中断请求及其中断响应都有可能发生 在中断现场保护过程中 首先要保存的是累加器W 这是因为PIC单片机 是不可以在不同的文件寄存器之间 RAM单元之间 直接传送数据的 必须要经W中转才能实现 所以首先要把W寄存器保存 才可以备份其他的寄存器比如STATUS 在保存W寄存器时 要确定主程序目前处在的RAM存储器的那个体中是十分困难的 虽然可以通过读取STATUS寄存器的rp0rp1位得到当前体 但是也是十分麻烦的 假设在RAM的bank0的20H上定义一个W的临时备份寄存器 通常取名为W TEMP 当利用MOVWFW TEMP命令 企图将W中的内容保存到W TEMP中时 往往会出现问题 因为此时保存的内容不一定是在bank0中 还和STATUS寄存的内容有关系 为了解决这个问题 PIC16F87X中有几款单片机 见p28 p31 其RAM各个体的顶端有16个单元 都会彼此映射到相同的16个单元上 访问这16个单元时体选码就不重要了 因为它们对四个体都是 透明 的 因此 将W TEMP安排在这个部位最为合适 这样做可以使得现场保护和现场恢复变得相对容易实现 下面给出一段保护中断现场的程序片段 将W STATUS和PCLATH的内容保存到文件寄存器中W TEMPEQU70HSTATUS TEMP6EHPCLATH TEMP6FH MOVWFW TEMP W W TEMPSWAPFSTATUS 0 STATUS高低半字节交换CLRFSTATUS 设置体0作当前体MOVWFSTATUS TEMP 到STATUS TEMPMOVFPCLATH 0 PCLATH到PCLATH TEMPMOVWFPCLATH TEMP 中断服务子程序的核心部分 CLRFSTATUSMOVFPCLATH TEMP 0 恢复PCLATH内容MOVWFPCLATHSWAPFSTATUS TEMP 0 恢复STATUSMOVWFSTATUS 同时RAM恢复到原先BANKSWAPFW TEMP 1 恢复WSWAPFW TEMP 0 说明 程序中对要保留的寄存器分别定义了相应的临时备份寄存器 例如 W 的临时备份寄存器为 W TEMP 在保存W时 决不能影响状态寄存器STATUS的当前内容 否则会影响到体选码及其他标志位 保存好W后 才可以保存STATUS和其他寄存器 指令系统总是先将STATUS的内容传送W 再经W传送到备份相应的备份寄存器中 比如STATUS TEMP 在程序中使用SWAPFSTATUS 0来保存状态寄存器STATUS的内容 而没有使用MOVFSTATUS 0 因为该指令会影响STATUS的Z标志位 显然这是不可容忍的 因此 程序采用字节交换指令SWAPF来顶替 在此只利用SWAPF的传递功能 它带来的交换功能得记录下来 在返回主程序之前必须把它重新置换回来 STATUS保存到W后 就可以将其清0 以便把定义了STATUS TEMP和PCLATH TEMP的体0设置为当前体 然后就可以很方便地将寄存器STATUS和PCLATH的内容保存到各自的临时备份寄存器中 寄存器PCLATH的内容保护并不是必须的 只要主程序和中断子程序中都不会修改PCLATH的内容 就可以不保护它 恢复现场的操作次序与保护现场的操作次序应该相反 在恢复STATUS的内容时候一定要注意把保护现场时采用SWAPFSTATUS 0产生的多余的交换再交换回来 最后2条指令 将W TEMP内容的高 低半字节交换了2遍 才被恢复到工作寄存器W中 为不使用MOVFW TEMP 0 因为MOVFW TEMP 0又会影响Z标志位 会破坏刚刚恢复的STATUS中的内容 这显然是不可以的 8 5 3小结除了在中断现场保护部分提到的一些需注意的问题之外 还有前面提到的一些重要注意要注意 单片机在任何情况下的复位 均会导致总屏蔽位和其他的中断屏蔽位清0 即在默认状态下 禁止CPU响应所有中断 中断标志位的状态与该所有的中断屏蔽位无关 即不管是否允许CPU响应中断源的中断请求 只要满足了中断的条件 中断标志位就会被置成1 当系统开放某一中断源时 中断源就通过中断标志位向CPU申请中断 只要将中断标志位置1 就会产生中断响应 当CPU响应任一个中断后 全局中断屏蔽位GIE将会自动清0 当中断返回时它又会自动恢复为1 如果在中断服务期间若用软件将自动清0的GIE重新置1 这时若再出现中断请求 就会形成中断的嵌套 即在响应某一中断期间又响应了其他中断 不过嵌套的级数不能超过堆栈的深度 8级 以免造成堆栈溢出 如果同时发生多个中断请求 到底哪个中断会优先得到处理 完全取决于在中断服务子程序中检查中断源的顺序 原因是各个中断源之间不存在优先级别之分 每一种中断源受屏蔽的次数不完全相同 第一梯队的中断源受到二次屏蔽 而第二梯队的中断源受到三次屏蔽 PIC系列单片机的型号不同 数据存储器RAM的布局不完全相同 为工作寄存器W安排备份寄存器W TEMP的方法也就不完全相同 8 6中断功能的应用举例 8 6 1TMR0溢出中断本例介绍如何以中断方式利用TMR0产生延时 例8 1 闪烁式跑马灯实验的功能 演示板上ICD2上的8只LED中只有一只点亮 亮灯的位置以循环方式不停地移动 移动的速度取决于在各个位置上停留的时间 假设延时196ms 并且在每一个位置上LED都保持快速闪烁 假设延时66ms 软件设计思路本例中 需要加入2段延时 一个是LED灯每向前移动一步都要延迟196ms 记为T1 另一个是LED要在亮 灭之间切换形成闪烁 亮和灭状态之间保持66ms的延时 记为T2 T1延时用软件实现 T2延时用TMR0的中断技术实现 将分频器配置给TMR0使用 并将分频比设定为1 256 假设时钟频率为4MHZ 则TMR0延时计算 256 256 0 1 s 65 536 s 65 536ms 66ms 程序流程图如下图所示 程序清单 TMR0EQU01HPCLEQU02HSTATUSEQU03HOPTION REGEQU81HINTCONEQU0BHPORTCEQU07HTRISCEQU87HTMR0 BEQU0DLY1EQU20H 定义延时变量寄存器DLY2EQU21H 定义延时变量寄存器WEQU0 定义目标寄存器WFEQU1 定义目标寄存器为RAMRP0EQU5 定义体选位RP0T0IFEQU2 TMR0的中断标志位 W TEMPEQU7FH 临时备份寄存器PORTC BEQU23H 显示数据寄存器FLAGEQU24H 亮灭标志位ORG000HGOTOMAIN 中断向量和中断服务子程序 ORG004H 中断服务程序入口地址TMR0SERV 中断服务程序名称MOVWFW TEMP 保存WINCFFLAG F 亮灭标志位反转BTFSSFLAG 0 标志位 1 是 跳转GOTOJUMP0 CLRFPORTC 熄灭GOTOJUMP1 跳过下面的程序 JUMP0MOVFPORTC B W 将显示数据MOVWFPORTC 送入PORTCJUMP1BCFINTCON T0IF T0IF清零MOVLWTMR0 B TMR0赋初值MOVWFTMR0 重新启动定时MOVFW TEMP W 恢复现场RETFIE 中断返回 主程序 MAINBSFSTATUS RP0 设置RAM的体1MOVLW0 将端口C设为输出MOVWFTRISCMOVLW0FH 设置选项寄存器MOVWFOPTION REG BCFSTATUS RP0 恢复RAM的体0MOVLW0A0H 开放T0IE 1MOVWFINTCON 开放GIE 1BCFINTCON T0IF T0IF 0MOVLWTMR0 B TMR0赋初值MOVWFTMR0 并启动定时计数MOVLWB 10000000 送显示码初值MOVWFPORTC B 至显示数据寄存器LOOPCALLDELAY 调用延时子程序RRFPORTC B F 右移GOTOLOOP 开始循环 软件延时子程序 DELAY 子程序名MOVLW0FFH 将外层循环参数值MOVWFDLY1 送入循环变量DLY1LP0MOVLW0FFH 将内层循环参数值MOVWFDLY2 送入循环变量的DLY2LP1DECFSZDLY2 F DLY2内容递减 若为0跳跃GOTOLP1 DECFSZDLY1 F DLY1内容递减 若为0跳跃GOTOLP0 跳转到LP0处RETURN 返回主程序END 源程序结束 用C语言编制如下 includeunsignedcharFLAG 0 x24 flag绝对定位在23HunsignedcharW TEMP 0 x7F 临时备份寄存器bitFLAG0 unsigned if FLAG0 0 gotojump0 PORTC 0 x00 gotojump1 jump0 PORTC PORTC B jump1 TMR0 TMR0 B asm MOVF W TEMP W W恢复 main TRISC 0 不用切换体OPTION 0 x07 INTCON 0 xA0 TMR0 B 0 T0IF 0 TMR0 TMR0 B TMR0赋初值并启动PORTC B 0b10000000 loop delay asm RRF PORTC B F PORTC B PORTC B 1 gotoloop 说明 定义中断服务程序时 直接使用interrupt关键字 而不用ORG004H定位 累加器W的保存用asm MOVWF W TEMP 也可以使用asm MOVF W TEMP W 恢复现场 C环境下设置的变量在汇编中要使用的时候 变量前面要加下划线标注 8 6 3端口RB电平变化中断 端口RB除了具有普通I O功能之外 它还要其他端口没有的特点 端口RB具有弱上拉功能 每条引脚内部都有一个可编程的弱上拉电路 即在RB每条引脚上都有一个可由程序控制的开关连接一只高值电阻到VDD引脚上 开关闭合 则弱上拉功能启用 开关断开 则弱上拉功能禁止 选项寄存器OPTION REG的RBPU bit7 位 可以控制弱上拉开关 RBPU 0 弱上拉启用 RBPU 1 弱上拉禁止 对于某些需要外接上拉电阻的应用场合 利用这项功能 可以简化外部电路 RB端口还有一个重要特性 即RB7 RB4具有输入电平变化中断功能 当口线RB7 RB4被定义为输入状态时 口线上的输入电平发生变化 电平由低变高或由高变低 时 可以引起CPU的中断 与端口RB相关的中断标志位和中断屏蔽位是寄存器INTCON中的RBIF位和RBIE位 端口RB的中断功能电路RB端口中断的硬件电路原理图如下 图中RB4 RB7中只要某一口线上的逻辑电平发生变化 就会使端口中断标志RBIF置位 产生中断请求 所谓 电平变化 意味着口线电平在原有的 基准电平 上发生了变化 基准电平是0 引脚新电平是1 或者基准电平是1 引脚新电平是0 均会引起中断请求 基准电平是由基准电平锁存器LEVELLatch负责锁存 输入锁存器INPUTLatch的Q端输出电平 即锁存内容 会不停的用外部引脚上的逻辑状态进行周期性刷新 即输入锁存器的Q端和基准电平锁存器的Q端电平都随着外部引 脚上的电平变化而变化 只是锁存的时刻不同而已 当然应该是基准电平锁存器LEVELLatch锁存在前 异或门Gb比较两个锁存器的Q端输出电平 一旦发现两个电平不同 就立即

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论