【Arduino学习】二、外部中断
介绍Arduino UNO的外部中断操作
前言
本文主要介绍Arduino UNO开发板的中断和开发板上的外部中断操作。
所需材料:
1.Arduino开发环境:Arduino IDE 1.8.10
2.仿真软件:Proteus 8.13
3.开发板:Arduino UNO
一、中断
1.中断
中断(Interrupt)是计算机的一个重要概念,当CPU执行时原本是按程序指令一条一条向下顺序执行的。 但如果此时发生了某一事件B请求CPU迅速去处理(中断发生),CPU暂时中断当前的工作,转去处理事件B(中断响应和中断服务,其中中断服务中执行的中断服务函数简称为ISR). 待CPU将事件B处理完毕后, 再回到原来被中断的地方继续执行程序(中断返回),这一过程称为中断 。实现中断功能的硬件和软件统称中断系统。一个完整的中断处理过程包括中断请求、中断响应、中断处理和中断返回。
中断的示意图如图所示:
2.中断的类型
Arduino Uno支持三种类型的中断:
硬件中断:由特定引脚上的外部中断信号触发中断。在开发板上,有两个引脚可直接触发外部中断(D2引脚对应中断向量0,D3引脚对应中断向量1)
引脚更改引发中断:使一个端口可以触发外部中断,并且将可以触发外部中断的分配到端口任何引脚上。
定时器中断:内部定时器生成的中断,在软件中操作。
二、外部中断操作
1.外部中断函数
代码如下:
attachInterrupt(digitalPinToInterrupt(pin), ISR, mode)
/*描述:配置外部中断源,使在引脚(pin)处触发符合设定模式(mode)的外部中断时,CPU进入
* 中断服务程序(ISR)中执行。
*参数:pin:接收外部中断信号的引脚
* ISR:中断服务函数名,注意:
* 1.函数中不能使用delay( ) 函数和millis( ) 函数
* 2.不能接收串口数据。
* 3.仅使用全局变量,这些变量应声明为volatile。
* 4.函数不能带有任何参数,也没有返回值。
* mode:外部中断触发模式,可设置为:
* RISING:当输入从低到高时触发。
* FALLING:当输入从高到低时触发。
* LOW:当输入保持低电平时触发。
* CHANGE:每当输入状态从高到低或从低到高时触发。
*
*/
int_exit = digitalPinToInterrupt(pin)
/*描述:通过数字引脚(pin)输出相应的中断向量。
*参数:pin:数字引脚号
* int_exit:返回值,结果为引脚所对应的中断向量
*/
2.引脚更改引发中断
以设置端口B的引脚D12可外部中断触发为例
选择端口
根据引脚编号确定端口。要启用该端口,您将使用*引脚更改中断控制寄存器(Pin Change Interrupt Control Register)*或 PCICR。如下图所示,PCICR 有三个感兴趣的位:位 0、位 1 和位 2。每个位都与其中一个端口相关联,将其设置为 1 将启用该端口,可以启用多个端口。
PCICR |= 0x01;
启用/禁用端口上的引脚
启用端口后,需要启用要用于引脚更改引发中断的引脚。如下图所示,每个端口可以启用或禁用 8 个引脚,要启用引脚,请为其写入“1”,可以根据需要启用任意数量的引脚,请记住,需要找到一种方法来区分中断服务例程中的引脚。
PMSK0 |= 0x10
中断服务例程
使用引脚更改引发中断时,已经为定义了中断服务函数,因此需要为端口直接编写需要的函数。因为Arduino UNO有三个端口,因此有三个 中断服务函数,其名称如下图所示:
ISR(PCINT0_vect)
{
...(函数程序)
}
示例
电路图如图所示,尝试实现第一次按下按键BUTTON时,板上的LED灯点亮,再次按下时,LED灯熄灭,如此往复。
volatile int a = 0;
void count()
{
a = 1 - a;
}
void setup()
{
// put your setup code here, to run once:
pinMode(2,INPUT_PULLUP);
pinMode(13,OUTPUT);
attachInterrupt(digitalPinToInterrupt(2), count, FALLING);
}
void loop()
{
// put your main code here, to run repeatedly:
digitalWrite(13,a);
}
更多推荐
所有评论(0)