考虑一辆快速行驶的汽车,如果它突然突然被另一辆汽车以相反的方向撞到,则首先发生的事情是,汽车中的加速度传感器感应到突然的加速度降低,并触发存在于其中的微控制器的外部中断。汽车。然后,基于该中断,微控制器产生电信号以立即展开安全气囊。汽车中的微控制器同时监视许多事物,例如感应汽车的速度,检查其他传感器,控制空调的温度等。那么,导致安全气囊在几秒钟内突然打开的原因是什么?答案是中断,这里使用的中断信号具有最高的优先级。
中断的另一个简单示例是触摸屏手机,其优先级高于“触摸”感。几乎每个电子设备都具有某种中断功能,以“中断”常规过程并在特定事件上执行某些优先级更高的操作。服务中断后,将恢复常规过程。
因此,从技术上讲,中断是一种机制,通过该机制,I / O或指令可以挂起处理器的正常执行并像优先级更高的优先级一样得到服务。例如,执行正常执行的处理器可能会被某些传感器中断,以执行ISR(中断服务程序)中存在的特定进程。执行完ISR处理器后,可以再次恢复正常执行。
中断类型
有两种类型的中断:
硬件中断:发生外部事件时,例如外部中断引脚的状态从LOW变为HIGH或从HIGH变为LOW时发生。
软件中断:根据软件的指示发生。例如,定时器中断是软件中断。
Arduino中断
现在,我们将看到如何在Arduino开发板中使用中断。它有两种类型的中断:
- 外部中断
- 引脚变更中断
外部中断:
这些中断由硬件解释并且非常快。可以将这些中断设置为在RISING或FALLING或LOW电平时触发。
Arduino板 |
外部中断引脚: |
诺诺 |
2,3 |
美加 |
2,3,18,19,20,21 |
引脚更改中断:
Arduino可以通过使用引脚更改中断来启用更多的中断引脚。在基于ATmega168 / 328的Arduino板上,任何引脚或所有20个信号引脚都可用作中断引脚。也可以使用RISING或FALLING边沿触发它们。
在Arduino中使用中断
为了在Arduino中使用中断,需要理解以下概念。
中断服务程序(ISR)
中断服务程序或中断处理程序是其中包含少量指令集的事件。发生外部中断时,处理器首先执行ISR中存在的这些代码,然后返回到其退出正常执行状态。
ISR在Arduino中具有以下语法:
attachInterrupt(digitalPinToInterrupt(pin),ISR,模式);
digitalPinToInterrupt(pin):在Arduino Uno,NANO中用于中断的引脚为2,3&在mega 2,3,18,19,20,21中。在此指定用于外部中断的输入引脚。
ISR:完成外部中断后会调用此函数。
模式:要触发的过渡类型,例如下降,上升等。
- 上升:当引脚从低电平转变为高电平时触发中断。
- 下降:当引脚从高电平转换为低电平时触发中断。
- CHANGE:当引脚从LOW转变为HIGH或从HIGH转变为LOW时(即,当引脚状态改变时)触发中断。
使用中断时的一些条件
- 中断服务程序功能(ISR)必须尽可能短。
- 延迟()函数在ISR内部不起作用,应避免使用。
在此Arduino中断教程中,数字从0开始递增,两个按钮用于触发中断,每个按钮都连接到D2和D3。LED用于指示中断。如果按下一个按钮,指示灯将亮起,并显示中断2并熄灭;当按下另一按钮时,指示灯将熄灭,并显示中断1并熄灭。
所需组件
- Arduino开发板(在本教程中,使用Arduino NANO)
- 按钮-2
- LED-1
- 电阻(10K)-2
- LCD(16x2)-1
- 面包板
- 连接线
电路原理图
Arduino Nano和16x2 LCD显示器之间的电路连接:
液晶屏 |
Arduino纳米 |
VSS |
地线 |
VDD |
+5伏 |
V0 |
至电位计中心PIN 用于控制LCD的对比度 |
RS |
D7 |
读写器 |
地线 |
Ë |
D8 |
D4 |
D9 |
D5 |
D10 |
D6 |
D11 |
D7 |
D12 |
一种 |
+5伏 |
ķ |
地线 |
两个按钮在引脚D2和D3处连接到Arduino Nano。它们用于使用两个外部中断,一个用于打开LED,另一个用于关闭LED。每个按钮都有一个10k的下拉电阻接地。因此,当按下按钮时,其为逻辑高电平(1),而当未按下按钮时,其为逻辑低电平(0)。下拉电阻是强制性的,否则输入引脚D2和D3上会有浮动值。
甲LED还用于指示中断已被触发或按钮已被按下。
Arduino中断编程
在本教程中,数字从0开始递增,并在连接到Arduino Nano的(16x2)LCD中连续显示,每当按下左按钮(中断引脚D3)时,LED就会亮起并显示Interrupt2,而当右按钮时按下(中断引脚D2),LED熄灭,显示屏显示Interrupt1。
本教程的末尾提供了完整的代码和可运行的视频。
1.首先 包括LCD显示器的头文件,然后定义用于与Arduino Nano连接的LCD引脚。
#包括
2.在void setup()函数内部,首先在LCD显示屏上显示一些介绍性消息。在此处了解有关将LCD与Arduino接口的更多信息。
lcd.begin(16,2); lcd.setCursor(0,0); lcd.print(“电路图摘要”); lcd.setCursor(0,1); lcd.print(“ ArduinoInterrupt”); 延迟(3000); lcd.clear();
3.然后在相同的void setup()函数中,必须指定输入和输出引脚。引脚D13连接到LED的阳极,因此必须将该引脚定义为输出。
pinMode(13,输出);
4.现在,编程中最重要的部分是attachInterrupt()函数,它也包含在void setup()中。
attachInterrupt(digitalPinToInterrupt(2),buttonPressed1,RISING); attachInterrupt(digitalPinToInterrupt(3),buttonPressed2,RISING);
此处指定引脚2用于外部中断,并且当D2引脚上有RISING(从低到高)时,将调用 buttonPressed1 函数。引脚3也用于外部中断,并且D3引脚上有RISING时调用buttonPressed2函数。
5.在void loop()中,数字(i)从零开始递增,并打印在LCD(16x2)上。
lcd.clear(); lcd.print(“ COUNTER:”); lcd.print(i); ++ i; 延迟(1000);
在相同的void loop()中,在连接LED阳极的引脚D13上使用 digitalWrite() 。根据变量 输出中 的值,LED会亮起或熄灭
digitalWrite(13,output);
6.最重要的部分是根据 attachInterrupt() 函数中使用的名称创建一个中断处理函数。
由于使用了两个中断引脚2和3,因此需要两个ISR。在此编程中,使用了以下ISR
buttonPressed1():
void buttonPressed1() { output = LOW; lcd.setCursor(0,1); lcd.print(“中断1”); }
当按下引脚D2上的按钮(上升沿)时,将执行此功能。此功能将输出状态更改为“低”,导致LED熄灭并在LCD显示屏上打印“ interrupt1”。
buttonPressed2():
void buttonPressed2(){output = HIGH; lcd.setCursor(0,1); lcd.print(“ Interrupt2”); }
当按下引脚D3上的按钮时,将执行此功能。此功能将输出状态更改为“高”,导致LED点亮,并在LCD显示屏上打印“ interrupt2”。
Arduino中断演示
1.按下左侧的PUSH BUTTON时,LED点亮,并且LCD显示Interrupt2。
2.按下右侧的PUSH BUTTON时,LED熄灭并且LCD显示Interrupt1
这就是中断在正常执行之间触发任何重要任务的有用方式。