历史上的今天
返回首页

历史上的今天

今天是:2024年12月05日(星期四)

正在发生

2019年12月05日 | AVR开发 Arduino方法(二) 中断子系统

2019-12-05 来源:elecfans

在了解中断子系统之前,首先要了解中断的概念。你正在看书,这时电话响了,你会怎么做呢?相信大多数人会这样:先标记看到的位置,接完电话回来后继续阅读。这就是一个现实生活中中断的例子,我们把“电话响了”成为中断源。Arduino UNO R3的主处理器ATMega328P拥有26个中断源,如下表所示:

向量号

程序地址

中断源

中断定义

中断服务程序名称

1

0x0000

RESET

外部电平复位,上电复位,掉电检测复位,看门狗复位


2

0x0002

INT0

外部中断请求0

INT0_vect

3

0x0004

INT1

外部中断请求1

INT1_vect

4

0x0006

PCINT0

引脚电平变化中断请求0

PCINT0_vect

5

0x0008

PCINT1

引脚电平变化中断请求1

PCINT1_vect

6

0x000A

PCINT2

引脚电平变化中断请求2

PCINT2_vect

7

0x000C

WDT

看门狗溢出中断

WDT_vect

8

0x000E

TIMER2 COMPA

定时/计数器2比较匹配A

TIMER2_COMPA_vect

9

0x0010

TIMER2 COMPB

定时/计数器2比较匹配B

TIMER2_COMPB_vect

10

0x0012

TIMER2 OVF

定时/计数器2溢出

TIMER2_OVF_vect

11

0x0014

TIMER1 CAPT

定时/计数器1事件捕捉

TIMER1_CAPT_vect

12

0x0016

TIMER1 COMPA

定时/计数器1比较匹配A

TIMER1_COMPA_vect

13

0x0018

TIMER1 COMPB

定时/计数器1比较匹配B

TIMER1_COMPB_vect

14

0x001A

TIMER1 OVF

定时/计数器1溢出

TIMER1_OVF_vect

15

0x001C

TIMER0 COMPA

定时/计数器0比较匹配A

TIMER0_COMPA_vect

16

0x001E

TIMER0 COMPB

定时/计数器0比较匹配B

TIMER0_COMPB_vect

17

0x0020

TIMER0 OVF

定时/计数器0溢出

TIMER0_OVF_vect

18

0x0022

SPI STC

SPI串行传输结束

SPI_STC_vect

19

0x0024

USART RX

USART接收结束

USART_RX_vect

20

0x0026

USART UDRE

USART数据寄存器空

USART_UDRE_vect

21

0x0028

USART TX

USART,发送结束

USART_TX_vect

22

0x002A

ADC

模数转换结束

ADC_vect

23

0x002C

EE READY

EEPROM准备好

EE_READY_vect

24

0x002E

ANALOG COMP

模拟比较器

ANALOG_COMP_vect

25

0x0030

TWI

两线串行接口

TWI_vect

26

0x0032

SPM READY

保存程序存储器内容就绪

SPM_ready_vect

这里以外部中断0为例了解对中断子系统的编程,沿用上一章中用于数字输入示例的电路,这个示例使得按键在按下时LED的状态取反:


 1 // Interrupt.ino

 2 const byte ledPin = 13;

 3 const byte interruptPin = 2;

 4 volatile byte state = LOW;

 5 

 6 void setup() {

 7   pinMode(ledPin, OUTPUT);

 8   pinMode(interruptPin, INPUT_PULLUP);

 9   attachInterrupt(digitalPinToInterrupt(interruptPin), blink, CHANGE);

10 }

11 

12 void loop() {

13   digitalWrite(ledPin, state);

14 }

15 

16 void blink() {

17   state = !state;

18 }


与外部中断相关的Arduino库函数有:

 

  attachInterrupt(digitalPinToInterrupt(pin), ISR, mode):启用指定引脚的外部中断并连接到指定中断服务程序

  pin:指定外部中断的引脚

  ISR:指定中断服务程序的名称

  mode:LOW(低电平触发中断),CHANG(逻辑电平变化触发中断),RISING(上升沿触发中断)或FALLING(下降沿触发中断)

  detachInterrupt(digitalPinToInterrupt(pin)):禁用指定中断

  pin:指定取消外部中断的引脚

  interrupts():开启总中断

  noInterrupts():禁用总中断

 

ATMega328P的外部中断由2个相关寄存器控制,外部中断控制寄存器EICRA的结构如下图所示:




INT1

INT0




ISC11

ISC10

ISC01

ISC00

ISCx[1:0](x = 0, 1)位用于设置外部中断的触发方式,如下表所示:

ISCx[1:0]

(x = 0, 1)

外部中断触发方式

00

低电平

01

逻辑电平变化

10

下降沿

11

上升沿

外部中断屏蔽寄存器EIMSK用于设置是否屏蔽外部中断,它的结构如下图所示:






INT1

INT0

若向其中某位写入1,则该位控制的外部中断启用;写入0则禁用。


通过直接访问寄存器改写以上程序为:


 1 // Interrupt_reg.ino

 2 volatile byte state = LOW;

 3 

 4 void setup() {

 5   DDRB |= (1 << PB5);

 6   

 7   DDRD &= ~(1 << PD2);

 8   PORTD |= (1 << PD2);

 9   EICRA &= ~(1 << ISC01) & ~(1 << ISC00);

10   EIMSK |= (1 << INT0);

11   sei(); // 启用总中断

12 }

13 

14 void loop() {

15   if (state == HIGH) {

16     PORTB |= (1 << PB5);

17   } else {

18     PORTB &= ~(1 << PB5);

19   }

20 }

21 

22 // 外部中断0中断处理函数

23 ISR(INT0_vect) {

24   state = !state;

25 }


推荐阅读

史海拾趣

Amplitronix LLC公司的发展小趣事

随着公司的规模不断扩大,Amplitronix LLC开始重视内部管理和企业文化的塑造。他们引进了一系列先进的管理理念和方法,优化了公司的组织结构和管理流程。同时,公司也注重员工的培训和发展,为员工提供了广阔的职业发展空间和良好的福利待遇。这些措施不仅提升了员工的工作积极性和满意度,也为公司的长远发展奠定了坚实的基础。

Circuit Assembly公司的发展小趣事

随着公司的发展,Amplitronix LLC逐渐在电子测量仪器领域站稳脚跟。然而,他们并没有满足于现状,而是继续投入研发,寻求技术突破。经过数年的努力,公司成功开发出一种具有颠覆性的新技术,显著提高了测量仪器的精度和稳定性。这一技术突破为公司赢得了更多的客户和市场份额,也为公司的未来发展奠定了坚实的基础。

Amidon Associates Inc公司的发展小趣事

随着公司的规模不断扩大,Amplitronix LLC开始重视内部管理和企业文化的塑造。他们引进了一系列先进的管理理念和方法,优化了公司的组织结构和管理流程。同时,公司也注重员工的培训和发展,为员工提供了广阔的职业发展空间和良好的福利待遇。这些措施不仅提升了员工的工作积极性和满意度,也为公司的长远发展奠定了坚实的基础。

FEI Microwave Inc公司的发展小趣事

为了进一步拓展国际市场,FEI Microwave Inc公司积极寻求与国际知名企业的合作。通过与欧洲宇航防务集团下属的子公司Astrium的合作,FEI Microwave Inc公司的微波技术成功应用于航天领域,为火箭发射任务提供了关键的技术支持。这次成功的合作不仅提升了FEI Microwave Inc公司的品牌知名度,也为其在国际市场上赢得了更多的机会。

上海超致公司的发展小趣事

随着技术的不断积累和创新,上海超致在功率半导体领域取得了重大突破。公司成功推出了全球首款量产SJ-IGBT产品,这一产品具有电流密度大、综合器件性能优的特点,在硅基成本下实现了性能的显著提升。此外,上海超致还不断拓宽产品线,产品广泛应用于太阳能微逆变器、车载OBC、充电桩、UPS电源等多个领域。这些产品的推出不仅满足了市场的需求,也进一步提升了公司的市场竞争力。

Fluke公司的发展小趣事

随着技术的不断积累和创新,上海超致在功率半导体领域取得了重大突破。公司成功推出了全球首款量产SJ-IGBT产品,这一产品具有电流密度大、综合器件性能优的特点,在硅基成本下实现了性能的显著提升。此外,上海超致还不断拓宽产品线,产品广泛应用于太阳能微逆变器、车载OBC、充电桩、UPS电源等多个领域。这些产品的推出不仅满足了市场的需求,也进一步提升了公司的市场竞争力。

问答坊 | AI 解惑

汽车点烟器输出电压和电流是多少呢?

汽车点烟器输出电压和电流是多少呢? 电脑的光驱有多少的电压和电流呢? 如果把光驱放到车上要接多大的电阻呢? 接什么东西 能把电流降到 1.5A 呢?  光驱的电流是1.5A  如果电流大了,光驱会坏吗? [ 本帖最后由 sunsonglin 于 2009-2-2 ...…

查看全部问答>

冰箱:高端驶入快车道 中国成全球“风向标”

本帖最后由 jameswangsynnex 于 2015-3-3 19:57 编辑 然国际金融危机给家电业带来了不小的冲击,但是受益于家电下乡、以旧换新等一系列利好政策,2009年我国的高端冰箱市场出现了快速增长的态势。另外,随着低碳理念的深入人心,企业节能技术不断 ...…

查看全部问答>

ARM Pc寄存器的一个问题

我在看书看到这样一段话: 对于arm指令集来说,PC指向当前指令的下两条指令的地址,由于ARM指令是字对齐的,PC值的第0位和第一位总为0, 这句话全不懂,谁能解释下呢…

查看全部问答>

问一下MSP430f42xx里的SAD( Sigma-Delta A/D)怎么用啊?

本帖最后由 paulhyde 于 2014-9-15 09:44 编辑 Sigma-Delta A/D 原理基本不懂····和逐次比较的有什么不同?还有怎样操作它?  …

查看全部问答>

基于ARM与SD卡的大容量数据存储技术的应用研究

0 引言   在现场测控系统中,RTU(远程测控终端)存储容量、存储数据的转移问题始终是RTU的重要环节。RTU的存储容量一般为几十K~几百K字节,数据转移通常采用不掉电静态RAM、EEPROM存储模块,或采用便携式计算机通过串行口读取RTU数据。 ...…

查看全部问答>

【悬赏求助】launchpad捕获按键按下的时间

最近在学习launchpad,中断方面困难重重。。。我想实现这样一个功能:P1.1设为输入,连接一个按键,然后利用中断判断按键按下的时间,要是短按的话就LED1翻转,长按的话LED2翻转。这样的话,我知道应该用捕获模式获取时间信息对吧,但是实现过程一 ...…

查看全部问答>

MSP430硬件I2C程序

MSP430硬件I2C程序,已测试通过,有兴趣的可探讨探讨…

查看全部问答>

今年刚大一下学期,学的电子信息专业,我应该入手怎样51单片机,本人小白,

刚刚进入大学,不想时间都被浪费,想自学51单片机,不知道怎么下手,     论坛的帖子也下了一些,也看了有一些,大二大三的学长要我先看书,    我到底是应该是先看书,还是边理论边实践,实践的话,应该买个什么样的51单片 ...…

查看全部问答>