lyngao 发表于 2015-6-1 14:55:07

关于中断的请教

arduino能不能在中断中执行另一个中断,比如我一个按键按下发生中断,跳到中断程序, 在中断程序中也有一个中断。

请叫我小萌兽 发表于 2015-6-1 17:58:42

可以的,这就是所谓的“中断嵌套"

帕米 发表于 2015-6-1 19:29:48

这个我曾经做过实验. 你可以把INT0跟INT1同时接在一个开关下. INT0跟INT1的触发事件分别点亮/熄灭各自的LED. 多次按下开关.两个LED都会亮灭.

PINKWALKMAN 发表于 2015-6-2 07:52:51

帕米 发表于 2015-6-1 19:29 static/image/common/back.gif
这个我曾经做过实验. 你可以把INT0跟INT1同时接在一个开关下. INT0跟INT1的触发事件分别点亮/熄灭各自的LED ...

敢问,你接的开关程序上有木有做降噪滤波处理?
这里你说的灯的现象好像没有体现出“中断嵌套”的原理。

sanyouhi 发表于 2015-6-2 12:17:01

帕米 发表于 2015-6-1 19:29 static/image/common/back.gif
这个我曾经做过实验. 你可以把INT0跟INT1同时接在一个开关下. INT0跟INT1的触发事件分别点亮/熄灭各自的LED ...

你这个不叫中断嵌套,两个中断并列执行并没有嵌套。

帕米 发表于 2015-6-2 16:18:09

PINKWALKMAN 发表于 2015-6-2 07:52 static/image/common/back.gif
敢问,你接的开关程序上有木有做降噪滤波处理?
这里你说的灯的现象好像没有体现出“中断嵌套”的原理。

没有, 用一上拉.或者一下拉电阻. 中断触发相反的电平.或者上升下降沿.

帕米 发表于 2015-6-2 18:19:28

本帖最后由 帕米 于 2015-6-2 19:06 编辑

sanyouhi 发表于 2015-6-2 12:17 static/image/common/back.gif
你这个不叫中断嵌套,两个中断并列执行并没有嵌套。

好吧"并行" ,都能触发"并行"了 :lol 中断嵌套,那不对于MCU来说更是小KS. 再说AVR内部 肯定是链式处理的.




#include "Arduino.h"

volatile uint32_t i,j,k=0,n=0;

void INT0_EVENT() {
        k++;
        digitalWrite(10, HIGH);
        for(i=0; i< 200000;i++){
                //_NOP();
        }
        digitalWrite(10, LOW);
        for(i=0; i< 200000;i++){
                //_NOP();
        }
}

void INT1_EVENT() {
        n++;
        digitalWrite(11, HIGH);
        for(j=0; j< 200000;j++){
                //_NOP();       
        }
        digitalWrite(11, LOW);
        for(j=0; j< 200000;j++){
                //_NOP();       
        }
}

void setup() {
       
        Serial.begin(9600);
        pinMode(10,OUTPUT);
        pinMode(11,OUTPUT);
        pinMode(13,OUTPUT);
       
        attachInterrupt(0, INT0_EVENT, FALLING);
        attachInterrupt(1, INT1_EVENT, RISING);
       
       
       //替换成
        //attachInterrupt(1, INT1_EVENT, FALLING);
        //attachInterrupt(0, INT0_EVENT, RISING);
}

void loop() {
        digitalWrite(13, HIGH);
        delay(500);
        digitalWrite(13, LOW);
        delay(500);
       
        if(k > 0){
                Serial.print("INT0: ");
                Serial.print(k);
                Serial.print(", INT1: ");
                Serial.println(k);
                k = 0; n=0;
        }
}
页: [1]
查看完整版本: 关于中断的请教