PIC单片机避坑系列-中断

  • 前言:
  • 问题描述:
  • 原因分析:
    • 1、PIC单片机中断标志位特点
    • 2、PIC单片机中断响应函数特点
  • 解决方案:

前言:

PIC单片机有丰富的中断源,使用起来非常方便,但是在使用的时候有个点必须要注意,否则会出现预期外的结果。
本文就重点讲一个PIC中断容易踩坑的点,希望大家能够避免出现问题。


问题描述:

之前我在做一个项目时,发现程序怎么都不按预期逻辑来执行,程序举例如下:

void interrupt isr()
{if(RCIF){recieve_buffer=RCREG;recieve_flag=1;}if(CCP1IF){CCP1IF=0;ccp1_flag=1;}if(CCP2IF){CCP2IF=0;ACT=1;    }if(INTF){INTF=0;ACT=1;}}

这个程序我使能了串口中断,捕获1和外部中断,捕获2中断并未使能(CCP2IE=0)。串口是上位机每间隔100ms发送指令给单片机,因此单片机每间隔100ms会进入串口中断。程序本来设计是外部中断触发后,ACT=1;可是在调试时,还未有外部中断条件也会出现ACT=1。


原因分析:

1、PIC单片机中断标志位特点

PIC单片机的中断标志位有一个特点—当一个中断条件发生时, 不管相应的中断允许位和全局允许位 GIE (INTCON<7>) 的状态如何,中断标志位都将置1。
这就是说,不管中断的单独允许位,或者中断全局允许位是不是使能,只要某个中断条件满足,其中断标志位就会置1。

2、PIC单片机中断响应函数特点

我之前使用的51单片机不同中断会有不同的响应函数入口,不同中断会单独使用关键字interrupt,后面接相应的端口号,来响应不同中断程序。
而PIC单片机在程序里面统一是一个中断函数,这就导致发生任何种类的中断,程序都会跳入统一的中断函数,然后依次执行函数内语句。

综合以上两个原因,就会发生我上述程序调试时碰到的问题,我的捕获2中断未开启,如果发生了捕获2中断事件,虽然不会进入中断响应,其标志位CCP2IF会置1,这时如果发生其他中断响应进入中断函数。这就会发生我碰到的问题,虽然没有出现外部中断,捕获2未使能,但是CCP2IF已经置1了,所以判断会进入条件语句处理,使ACT的值变为1了。


解决方案:

要避免上述问题,其实只需要我们在代码上注意以下两点便可以避免。
1、在中断响应函数中,判断条件除了标志位判断再增加使能判断,如外部中断原来只判断INTF,现写为INTF&&INTE;
2、在开启一个中断前,必须先将其标志位清零;
3、每个中断响应处理函数内,必须将其标志位清零,虽然某些标志位是硬件清零,但是考虑不同芯片型号设置不一致,或者遗忘,反正加一条软件清零不会出错。
例程如下:

void init_interrupt()
{RCIF = 0;RCIE = 1;CCP1IF = 0;CCP1IE = 1;INTF = 0;INTE = 1;}
void interrupt isr()
{if(RCIF&&RCIE){RCIF = 0;recieve_buffer = RCREG;recieve_flag = 1;}if(CCP1IF&&CCP1IE){CCP1IF = 0;ccp1_flag = 1;}if(CCP2IF&&CCP2IE){CCP2IF = 0;ACT = 1;    }if(INTF&&INTE){INTF = 0;ACT = 1;}}

PIC单片机学习-中断相关推荐

  1. PIC单片机学习—USART串口

    PIC单片机学习-USART串口 最近做了几个项目都用到了PIC单片机,在这几个项目之前我只用到了51单片机和STM32来做控制类的项目,用PIC单片机的时候发现使用的时候和51单片机还是有所区别,有 ...

  2. 单片机学习——中断系统

    单片机必学系列 单片机学习--中断系统 单片机学习--存储器详解(程序存储器.片内RAM.拓展RAM.EEPROM) 单片机学习--定时器/计数器 单片机学习--A/D转换 更新ing 单片机学习-- ...

  3. 【PIC单片机】-- 中断、定时器相关知识

    文章目录 文章目录 00 写在前面 01 中断相关知识 02 定时器相关知识 03 定时器相关寄存器 04 定时器相关电路 05 定时器补充 06 结尾 00 写在前面 该系列的文章,源自于担任过PI ...

  4. PIC单片机之中断程序

    什么是中断程序呢? 形象的生活比喻就比如你现在这在看我的文章,突然你的朋友喊你一起去烤地瓜,这时候你就中断了看文章和朋友烤地瓜去了,烤完地瓜之后你又回来看文章.烤地瓜这件事就好比中断程序,他中断了你看 ...

  5. 51单片机学习----中断

    什么是中断? 当CPU正在处理某件事的时候,突然有一个紧急的事情发生了,要求CPU暂停当前的工作,转而去处理这个紧急的事情,处理完之后,再回到原理被中断的地方,继续原来的工作,这样的过程就叫中断.比如 ...

  6. PIC单片机学习 TMR2

    TMR2的宽度与TMR0一样的也是8位,一般伴随着CCP模块和PWM功能一起出现. 8位宽度的TMR2定时器有一个前置预分频器和后置预分频器,同时还有一个周期控制寄存器与它配合一起实现针对单片机指令周 ...

  7. PIC单片机学习之独立按键

    硬件电路:独立按键接RA5 效果:让RD0口的LED,当独立按键为0时,点亮. 注意:PORTA口的默认状态不是数字IO口,我们要将他配置成数字IO口.这涉及到了ADCON1寄存器. 代码 //201 ...

  8. PIC单片机学习笔记——PIC16F(L)1526/7

    一.产品技术参数 系列名称 PIC16F 封装类型 TQFP 安装类型 表面贴装 引脚数目 64 装置核芯 PIC 数据总线宽度 8Bit 程序存储器大小 28 kB 最大频率 20MHz 内存大小 ...

  9. 51单片机学习——中断

    1.中断源及其中断标志 外部中断0:中断号为0:中断标志为IE0:中断服务程序入口为0003H: 定时器0:中断号为1:中断标志为TF0:中断服务程序入口为000BH: 外部中断1:中断号为2:中断标 ...

  10. 吴鉴鹰51单片机学习—中断、定时器同时点亮数码管和LED各种效果

    LED闪烁有5种效果,数码管点亮有3种效果,包含小彩蛋哟 实现代码如下: //#include <reg52.h> #include <REGX52.H>//typedef u ...

最新文章

  1. linux配置环境jdk
  2. 让Entity Framework支持MySql数据库
  3. 记一次更改了电脑名称后遇到的各种错误反思及感想
  4. 前端学习(3026):vue+element今日头条管理-调整外观
  5. 2-3:配置与环境之定制提示符
  6. 炮兵阵地(POJ-1185)
  7. 10g数据库入门与实践 oracle_修改oracle数据文件大小 报错:ORA-03297
  8. 大数据_Hbase-shell命令_(补充_hbase存数据只增加不删除_只会适时删除)---Hbase工作笔记0006
  9. 利用zabbix API进行管理
  10. mysql show sleep_mysq解决sleep进程过多的办法
  11. linux clone函数ptid,pthread_create到ret_fast_syscalls 参数和栈的变化
  12. 树莓派学习(二):摄像头模块的安装和使用
  13. 小程序 轮播图样式设置
  14. C# extention extension
  15. 中国移动手机支付须走自主创新之路
  16. 互斥锁(mutex)的使用
  17. 进行ui设计培训学费是多少
  18. 简单介绍快速开始使用Unity引擎的步骤
  19. 小米门卡协议加载失败_小米门禁卡没反应怎么回事
  20. 正则表达 包含 英文、数字、特殊字符

热门文章

  1. 同济大学 线性代数 第六版 pdf_同济大学版工程数学 线性代数 第六版 课本
  2. Android源码目录结构,kotlin中文文档pdf
  3. python设计模式之MVC
  4. C++转Java快速入门
  5. wer 流程图编程_WER机器人搭建学习实操练习
  6. Python画图之散点图(plt.scatter)
  7. 基于SSM的运动会管理系统
  8. AT89C51的矩阵键盘、跑马灯和呼吸灯设计
  9. 思科CCNA考试流程-ielab
  10. 大白菜U盘启动制作工具怎么用?