AVR单片机ATmega328P中断原理详解

1、一AVR单片机中断原理的介绍

ATmega328P微控制器具有两个外部中断引脚,分别是INT0和INT1。

  • 外部中断0(INT0):它对应的引脚是PD2(数字引脚2)。INT0可以用于响应外部信号的边沿触发(上升沿、下降沿或任意边沿),并触发相应的中断服务程序。INT0具有附加的可选特性,例如使能/禁用中断、选择触发边沿、使能上拉电阻等。

  • 外部中断1(INT1):它对应的引脚是PD3(数字引脚3)。INT1的功能与INT0类似,它也可以用于响应外部信号的边沿触发,并触发相应的中断服务程序。INT1同样具有附加的可选特性,例如使能/禁用中断、选择触发边沿、使能上拉电阻等。

  • 这两个外部中断引脚提供了一种机制,使得ATmega328P能够在外部事件发生时及时中断当前的程序执行,以处理外部事件或执行其他特定的任务。程序员可以根据应用需求来配置和利用这些外部中断功能。


    ATmega328单片机具有26个中断源。每个中断源都有个独立的中断向量作为中断服务程序的入口地址,而且所有的中断源都有自己独立的使能位。如果全局中断I和相应的中断使能位都置位,则在中断标志位置位时将执行中断服务程序。

    一个中断产生后,全局中断使能位I将被清零,后续的中断被屏蔽。用户可以在中断服务程序里面对工置位从而开发中断,在中断返回后全局中断位I将重新置位。

    ATmega328P单片机中断向量表介绍:

    ATmega328单片机具有2个外部中断,分别是INT0(中断号为2),INT1(中断号为1),这2个外部中断都是由单片机的引脚触发。需要注意的是,如果允许外部中断的话,即使是INT0,INT1这2个引脚都设置为输出方式,外部中断也会触发。INT0,INT1外部中断可以选择的触发方式有上升沿触发、下降沿触发以及低电平触发;使用外部中断涉及到的寄存器有:

    1.1 外部中断控制寄存器A

    EICRA(External Interrupt Control Register A):这是一个8位寄存器,用于配置外部中断的触发方式。它的低两位(ISC01和ISC00)控制INT0的触发方式,而高两位(ISC11和ISC10)控制INT1的触发方式。这些位可用于选择外部中断的触发边沿(上升沿、下降沿或任意边沿)。

    ISC11 ISC10 说明
    0 0 INT1引脚为低电平时产生中断请求
    0 1 INT1引脚上的任意逻辑电平变化都会产生中断请求
    1 0 INT1引脚为下降沿产生中断请求
    1 1 INT1引脚为上升沿产生中断请求

    ISC01 ISC00 说明
    0 0 INT0引脚为低电平时产生中断请求
    0 1 INT0引脚上的任意逻辑电平变化都会产生中断请求
    1 0 INT0引脚为下降沿产生中断请求
    1 1 INT0引脚为上升沿产生中断请求

    1.2 外部中断屏蔽寄存器

    EIMSK(External Interrupt Mask Register):这是一个8位寄存器,用于使能/禁用外部中断。它包含两个位用于使能/禁用INT0和INT1外部中断。设置EIMSK寄存器的相应位可以启用对应的外部中断功能。

    当 INT1 位被设置1并且状态寄存器SREG中的I位被设置1时,外部引脚中断被启用。 外部中断控制寄存器 A (EICRA) 中的中断检测控制 1 位 1/0(ISC11 和 ISC10)定义外部中断是在 INT1 引脚的上升沿和/或下降沿激活还是在检测到电平时激活。 即使 INT1 配置为输出,一旦引脚电平发生了相应的变化,中断就产生。 外部中断请求1对应的中断从INT1中断向量执行。

    当 INT0 位被设置1并且状态寄存器SREG中的 I 位被设置1时,外部引脚中断被启用。 外部中断控制寄存器 A (EICRA) 中的中断检测控制 0 位 1/0(ISC01 和 ISC00)定义外部中断是在 INT0 引脚的上升沿和/或下降沿激活还是在检测到电平时激活。 即使INT0配置为输出,一旦引脚电平发生了相应的变化,中断就产生。 外部中断请求0对应的中断从INT0 中断向量执行。

    1.3 外部中断标志寄存器

    EIFR(External Interrupt Flag Register):这是一个8位寄存器,用于指示外部中断事件的发生。当外部中断事件触发时,相应的位(INTF0和INTF1)会被置位。在处理完中断后,可以通过清除EIFR寄存器的相应位来复位中断标志。


    当INT1引脚上的边沿或逻辑变化触发中断请求时,INTF1变为置位1。 如果 SREG 中的I位和IMSK中的INT1位被置位1,MCU将跳转到相应的中断向量。中断程序执行时该标志被清除。 或者,可以通过向其写入逻辑1来清除该标志。 当 INT1配置为电平中断时,该标志总是被清除。

    当INT0引脚上的边沿或逻辑变化触发中断请求时,INTF0变为置位1。 如果SREG中的I位和EIMSK中的INT0位被置位1,MCU将跳转到相应的中断向量。中断程序执行时该标志被清除。 或者,可以通过向其写入逻辑 1 来清除该标志。 当 INT0配置为电平中断时,该标志总是被清除。

    二、中断服务函数写法

    语法格式:

    #pragma interrupt_handler<函数名>:<中断向量号>
    

    例如定义INT0中所服务程序:

    #pragma interrupt_handler into_isr: 2
    void into_isr(void)
    {
    	//INTO中断服务函数
    }
    

    三、外部中断使用步骤

    1、设置外部中断触发方式
    2、使能外部中断
    3、设置中断管脚(是否需要上拉电阻)
    4、打开全局中断
    5、选择终端号,编写中断服务函数

    #include <avr/io.h>
    #include <avr/interrupt.h>
    
    // 外部中断0的中断服务函数
    ISR(INT0_vect)
    {
        // 在此处编写中断处理代码
        // ...
    }
    
    int main(void)
    {
        // 配置引脚和外部中断
    
        // 设置PD2引脚为输入
        DDRD &= ~(1 << PD2);
        // 使能PD2引脚的上拉电阻
        PORTD |= (1 << PD2);
    
        // 配置外部中断0的触发方式为下降沿触发
        EICRA |= (1 << ISC01);
        EICRA &= ~(1 << ISC00);
    
        // 使能外部中断0
        EIMSK |= (1 << INT0);
    
        // 全局使能中断
        sei();//SREG |= (1 << 7);
    
        while (1)
        {
            // 主循环代码
            // ...
        }
    
        return 0;
    }
    
    
    物联沃分享整理
    物联沃-IOTWORD物联网 » AVR单片机ATmega328P中断原理详解

    发表回复