PIC单片机学习-中断
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单片机学习-中断相关推荐
- PIC单片机学习—USART串口
PIC单片机学习-USART串口 最近做了几个项目都用到了PIC单片机,在这几个项目之前我只用到了51单片机和STM32来做控制类的项目,用PIC单片机的时候发现使用的时候和51单片机还是有所区别,有 ...
- 单片机学习——中断系统
单片机必学系列 单片机学习--中断系统 单片机学习--存储器详解(程序存储器.片内RAM.拓展RAM.EEPROM) 单片机学习--定时器/计数器 单片机学习--A/D转换 更新ing 单片机学习-- ...
- 【PIC单片机】-- 中断、定时器相关知识
文章目录 文章目录 00 写在前面 01 中断相关知识 02 定时器相关知识 03 定时器相关寄存器 04 定时器相关电路 05 定时器补充 06 结尾 00 写在前面 该系列的文章,源自于担任过PI ...
- PIC单片机之中断程序
什么是中断程序呢? 形象的生活比喻就比如你现在这在看我的文章,突然你的朋友喊你一起去烤地瓜,这时候你就中断了看文章和朋友烤地瓜去了,烤完地瓜之后你又回来看文章.烤地瓜这件事就好比中断程序,他中断了你看 ...
- 51单片机学习----中断
什么是中断? 当CPU正在处理某件事的时候,突然有一个紧急的事情发生了,要求CPU暂停当前的工作,转而去处理这个紧急的事情,处理完之后,再回到原理被中断的地方,继续原来的工作,这样的过程就叫中断.比如 ...
- PIC单片机学习 TMR2
TMR2的宽度与TMR0一样的也是8位,一般伴随着CCP模块和PWM功能一起出现. 8位宽度的TMR2定时器有一个前置预分频器和后置预分频器,同时还有一个周期控制寄存器与它配合一起实现针对单片机指令周 ...
- PIC单片机学习之独立按键
硬件电路:独立按键接RA5 效果:让RD0口的LED,当独立按键为0时,点亮. 注意:PORTA口的默认状态不是数字IO口,我们要将他配置成数字IO口.这涉及到了ADCON1寄存器. 代码 //201 ...
- PIC单片机学习笔记——PIC16F(L)1526/7
一.产品技术参数 系列名称 PIC16F 封装类型 TQFP 安装类型 表面贴装 引脚数目 64 装置核芯 PIC 数据总线宽度 8Bit 程序存储器大小 28 kB 最大频率 20MHz 内存大小 ...
- 51单片机学习——中断
1.中断源及其中断标志 外部中断0:中断号为0:中断标志为IE0:中断服务程序入口为0003H: 定时器0:中断号为1:中断标志为TF0:中断服务程序入口为000BH: 外部中断1:中断号为2:中断标 ...
- 吴鉴鹰51单片机学习—中断、定时器同时点亮数码管和LED各种效果
LED闪烁有5种效果,数码管点亮有3种效果,包含小彩蛋哟 实现代码如下: //#include <reg52.h> #include <REGX52.H>//typedef u ...
最新文章
- linux配置环境jdk
- 让Entity Framework支持MySql数据库
- 记一次更改了电脑名称后遇到的各种错误反思及感想
- 前端学习(3026):vue+element今日头条管理-调整外观
- 2-3:配置与环境之定制提示符
- 炮兵阵地(POJ-1185)
- 10g数据库入门与实践 oracle_修改oracle数据文件大小 报错:ORA-03297
- 大数据_Hbase-shell命令_(补充_hbase存数据只增加不删除_只会适时删除)---Hbase工作笔记0006
- 利用zabbix API进行管理
- mysql show sleep_mysq解决sleep进程过多的办法
- linux clone函数ptid,pthread_create到ret_fast_syscalls 参数和栈的变化
- 树莓派学习(二):摄像头模块的安装和使用
- 小程序 轮播图样式设置
- C# extention extension
- 中国移动手机支付须走自主创新之路
- 互斥锁(mutex)的使用
- 进行ui设计培训学费是多少
- 简单介绍快速开始使用Unity引擎的步骤
- 小米门卡协议加载失败_小米门禁卡没反应怎么回事
- 正则表达 包含 英文、数字、特殊字符