打印
[PIC®/AVR®/dsPIC®产品]

PIC16(L)F1826使用——IOC、外部中断

[复制链接]
10294|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 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中断


备注
芯片复位后寄存器的值有很多是不确定的,所以在初始化时都需要设置了需要使用的相关寄存器的值







使用特权

评论回复
沙发
gaoyang9992006| | 2021-9-16 23:56 | 只看该作者
可以用回调函数的指针传入函数在main.c的主函数里设置传入你翻转函数的地址的。
这样除了main.c文件外,你其他的都不需要改一个字节。

使用特权

评论回复
板凳
JackTang1994|  楼主 | 2021-9-17 09:21 | 只看该作者
本帖最后由 JackTang1994 于 2021-9-17 09:26 编辑
gaoyang9992006 发表于 2021-9-16 23:56
可以用回调函数的指针传入函数在main.c的主函数里设置传入你翻转函数的地址的。
这样除了main.c文件外,你 ...

pin_manager.c文件函数中用的就是回调函数。可以在pin_manager.c文件将回调函数的注册代码放在main.c中的main函数中执行。
<blockquote>void PIN_MANAGER_Initialize(void)

使用特权

评论回复
地板
gaoyang9992006| | 2021-9-17 14:24 | 只看该作者
JackTang1994 发表于 2021-9-17 09:21
pin_manager.c文件函数中用的就是回调函数。可以在pin_manager.c文件将回调函数的注册代码放在main.c中的m ...

你理解错了,是用设置中断处理函数传输要执行的函数地址,不是在pin_manager.c
虽然你那么做也可以,但是MCC设计的初衷不是这么用。
你可以看一下我这个贴。
https://bbs.21ic.com/icview-3164904-1-1.html

你是直接放到了默认处理函数里面去了,那个是让你设置一种默认情况的,同时你还可以自己在主函数传入一个。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

28

主题

61

帖子

0

粉丝