本帖最后由 JackTang1994 于 2021-9-16 21:07 编辑
#技术资源# #申请原创#
硬件平台:PIC16(L)F1826软件平台:MPLAB X IDE v5.50
芯片手册
下载地址:https://www.microchip.com/content/dam/mchp/documents/OTH/ProductDocuments/DataSheets/41391D.pdf
测试工程
Interrupt_Demos.zip
(408.65 KB)
查看芯片手册查看芯片手册第8章中断,从中断框图中了解整个中断系统由哪些部分组成。有哪些中断源,怎么控制的等等。
从此中断框图中我们可以得到以下信息:中断来源有外设中断、外部中断、定时器0中断。中断使能有PIEx、INTE、TMR0E、PEIE、GIE等寄存器。
GIE是最后一个与门的一个输入口,当它为0时此与门输出为0。所以它是“总开关,全局中断。
注:在ISR(中断服务函数)中通过轮询方式,检测所有发生的中断。即所有的中断共用一个中断服务函数,
通过在函数中判断中断各自的标志来确定相应中断是否发生。中断没有优先级以及嵌套
当有中断发生时GIE位被自动清零,此时无法再响应其他中断。当中断处理完成后,会继续响应刚才没有处理的中断。
即GIE会被自动清零,但是中断标志不会被清零。所以中断标志需要程序员手动清零。
IOC - Interrupt-on-Change
Port B每一个引脚都可以作为IOC中断来源。
查看芯片手册第13章IOC中断,从章节描述中可以得到关于IOC的介绍及使用相关信息。为下一步寄存器熟悉提供信息方便后续配置并使用相关外设。
从IOC章节描述部分可以获知,Port B可以被配置为IOC中断
INT- External Interrupt
只有PB0引脚具有外部中断功能
在手册的DEVICE OVERVIEW节的PINOUT DESCRIPTION中介绍了所有引脚的功能,从此表中我们可以知道只有PB0引脚才能作为外部中断INT的触发引脚。
IOC与INT区别?
两者都是外部信号(上升沿/下降沿)引起中断.MCU工作在普通模式下时两者基本没啥区别,只是IOC是可以同时设置两个边沿触发中断(上升沿和下降沿都可以触发)而INT只是设置一种触发方式(要不上升沿要不下降沿)。两者都可以从Sleep模式下唤醒MCU
IOC中断需要设置的寄存器
IOCBN、IOCBP:设置IOC中断的触发方式——下降沿、上升沿、双边沿(下降沿、上升沿都触发)。
IOCBN寄存器用于设置下降沿触发的IOC中断
IOCBP寄存器用于设置上升沿触发的IOC中断
ANSELB: 设置PORTB的 工作模式——模拟输入、数字I/O功能
INTCON: 使能相关中断——外设中断、外部中断、全局中断等。
ICOIF寄存器的值是只读的,它们由硬件置位的(0或者1)。这个是IOC中断的标志位
IOCBF: IOC中断标志。当触发了IOC中断后会将相应标志位置1,每一个引脚对应一个Flag标志位。如:PB0对应IOCBF0,PB1对应IOCBF1依次类推
芯片引脚配置
使用MCC软件
引脚配置
配置PB2为IOC中断触发引脚,PA0为输出模式用来驱动LED
外设功能设置——IOC中断配置
配置IOC为下降沿触发方式且PB2设置为上拉(PB2上没有输入时电平为高)
这样设置后报了一个警告:Please enable nWPUEN bit from register view。意思是让我们设置uWPUEN位,切换到Register View窗口
找到OPTION_REG寄存器的uWPUEN位,将其设置为enable
MCC中断配置在Interrupt Module窗口中勾选所使用的中断IOCI。
生成代码
点击左侧的Generate按钮生成代码
编写用户代码
1. 在main.c文件中的main函数中将使能中断的代码取消注释
2. 打开pin_manager.c文件,在IOCBF2_DefaultInterruptHandler函数中添加自己中断处理代码
LED_Toggle();
调试代码
设置工程
设置为模拟仿真
打开“激励”
这里简单提下MPLAB X IDE的强大仿真功能。打开Window >> Simulator >> “激励”窗口
“激励”窗口中可以设置各种外设信号:电平输入(脉冲形式、高低电平)、ADC采样、PWM
在pin_manager.c文件,在IOCBF2_DefaultInterruptHandler函数中添加断点
然后点击全速运行,在“激励”窗口设置好激励:IOCB2、Plus High即产品下降沿的脉冲,从而触发中断。
此时即可看见程序在我们设置的断点处,停止了。说明:触发了IOCB2中断
备注
芯片复位后寄存器的值有很多是不确定的,所以在初始化时都需要设置了需要使用的相关寄存器的值
|