极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 13123|回复: 6

关于中断的请教

[复制链接]
发表于 2015-6-1 14:55:07 | 显示全部楼层 |阅读模式
arduino能不能在中断中执行另一个中断,比如我一个按键按下发生中断,跳到中断程序, 在中断程序中也有一个中断。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

发表于 2015-6-1 17:58:42 | 显示全部楼层
可以的,这就是所谓的“中断嵌套"
回复 支持 反对

使用道具 举报

发表于 2015-6-1 19:29:48 | 显示全部楼层
这个我曾经做过实验. 你可以把INT0跟INT1同时接在一个开关下. INT0跟INT1的触发事件分别点亮/熄灭各自的LED. 多次按下开关.两个LED都会亮灭.
回复 支持 反对

使用道具 举报

发表于 2015-6-2 07:52:51 | 显示全部楼层
帕米 发表于 2015-6-1 19:29
这个我曾经做过实验. 你可以把INT0跟INT1同时接在一个开关下. INT0跟INT1的触发事件分别点亮/熄灭各自的LED ...

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

使用道具 举报

发表于 2015-6-2 12:17:01 | 显示全部楼层
帕米 发表于 2015-6-1 19:29
这个我曾经做过实验. 你可以把INT0跟INT1同时接在一个开关下. INT0跟INT1的触发事件分别点亮/熄灭各自的LED ...

你这个不叫中断嵌套,两个中断并列执行并没有嵌套。
回复 支持 反对

使用道具 举报

发表于 2015-6-2 16:18:09 | 显示全部楼层
PINKWALKMAN 发表于 2015-6-2 07:52
敢问,你接的开关程序上有木有做降噪滤波处理?
这里你说的灯的现象好像没有体现出“中断嵌套”的原理。

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

使用道具 举报

发表于 2015-6-2 18:19:28 | 显示全部楼层
本帖最后由 帕米 于 2015-6-2 19:06 编辑
sanyouhi 发表于 2015-6-2 12:17
你这个不叫中断嵌套,两个中断并列执行并没有嵌套。


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


[pre lang="arduino" line="1" file="test_INT0_INT1"]

#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;
        }
}
[/code]

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-17 08:21 , Processed in 0.069916 second(s), 22 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表