Arduino 如何使中断只在ISR中运行而不运行主代码

Arduino 如何使中断只在ISR中运行而不运行主代码,arduino,microcontroller,Arduino,Microcontroller,我正在编写一段代码,在微控制器处于深度睡眠状态时对脉冲进行计数。我希望外部中断只运行ISR,它只增加一个计数器。然而,我注意到,如果我在代码中设置了特定的间隔,则每当产生脉冲时,数据就会被传输。下面是我的代码,说明了我想做什么 #include "LowPower.h" const uint8_t btn =2; volatile int power = 0; void setup() { Serial.begin(9600); pinMode(btn, INPUT_PULLUP

我正在编写一段代码,在微控制器处于深度睡眠状态时对脉冲进行计数。我希望外部中断只运行ISR,它只增加一个计数器。然而,我注意到,如果我在代码中设置了特定的间隔,则每当产生脉冲时,数据就会被传输。下面是我的代码,说明了我想做什么

#include "LowPower.h"

const uint8_t btn =2;
volatile int power = 0;
void setup() {
   Serial.begin(9600);
    pinMode(btn, INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(btn), count, FALLING);

}

void loop() {
   Serial.print("Power: ");
 Serial.println(power);
  delay(50);
  for (int i = 0; i < 8; i++) {
    LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF); // Put Arduino in Sleep mode 8 times 8 seconds
  }

}
void count() {
  power += 1;
}
#包括“LowPower.h”
常数8_t btn=2;
易失性整数幂=0;
无效设置(){
Serial.begin(9600);
pinMode(btn,输入\上拉);
连接中断(数字插针中断(btn)、计数、下降);
}
void循环(){
串行打印(“电源:”);
串行打印LN(电源);
延迟(50);
对于(int i=0;i<8;i++){
低功耗。关机(睡眠、ADC、BOD);//将Arduino置于睡眠模式8次8秒
}
}
无效计数(){
功率+=1;
}
从上面的代码中,我希望看到串行语句每次大约打印一分钟以上,但不是在生成中断时。有什么我遗漏的吗,谢谢。

从使用
低功耗
,似乎可以使用串行通信退出模式
断电
(这很好,因为您不希望串行缓冲区满)。不幸的是,中断也是如此

这可以解释您看到的情况。

从使用
低功耗
,似乎可以使用串行通信退出模式
断电
(这很好,因为您不希望串行缓冲区满)。不幸的是,中断也是如此



这可以解释您看到的情况。

您的代码中也有一个很大的错误,即在循环中打印电源。该变量需要在关键部分进行保护,因为它也可以从ISR访问。如果ISR在访问int的两个字节之间更改值,会发生什么情况?你必须关闭中断,复制值,再打开它们,然后打印副本。是什么产生了脉冲?你看到的数字是多少?当您收到中断时,它将唤醒micro。因此,如果你得到一束脉冲,或者一个开关反弹,给你8个或更多脉冲,那么你会看到它被打印得更频繁,因为它整个8秒钟都没有休眠。如果是这种情况,你可以尝试将
延迟
放入
for
循环中,给人一种去抖动的效果。我正在使用另一个Arduino的眨眼示意图,它以第二个间隔眨眼。我有一个10K电阻连接在引脚2和地面之间,作为下拉。我最好奇的是当外部中断触发时会发生什么。如果主循环运行,即使中断连接到ISR?中断将关闭
电源
,因此在每次中断时,它将进入
for
循环的下一次迭代。因此,我们预计串行通信大约每8秒进行一次。如果您每次都看到一些东西,那么可能还有其他东西。您的代码中也有一个很大的错误,即在循环中打印电源。该变量需要在关键部分进行保护,因为它也可以从ISR访问。如果ISR在访问int的两个字节之间更改值,会发生什么情况?你必须关闭中断,复制值,再打开它们,然后打印副本。是什么产生了脉冲?你看到的数字是多少?当您收到中断时,它将唤醒micro。因此,如果你得到一束脉冲,或者一个开关反弹,给你8个或更多脉冲,那么你会看到它被打印得更频繁,因为它整个8秒钟都没有休眠。如果是这种情况,你可以尝试将
延迟
放入
for
循环中,给人一种去抖动的效果。我正在使用另一个Arduino的眨眼示意图,它以第二个间隔眨眼。我有一个10K电阻连接在引脚2和地面之间,作为下拉。我最好奇的是当外部中断触发时会发生什么。如果主循环运行,即使中断连接到ISR?中断将关闭
电源
,因此在每次中断时,它将进入
for
循环的下一次迭代。因此,我们预计串行通信大约每8秒进行一次。如果您每次都看到一些东西,那么可能还有其他东西。不过,这可能是针对传入的数据。这似乎没有收到任何消息。是的,ISR正在唤醒它。问题是中断在他想要睡眠的64秒内触发了多少次。ISR仅用于为每次中断事件增加一个计数器(功率变量)。我感兴趣的是,当ISR运行时,计数器是否会增加,而不运行循环,直到ForLoop中的睡眠持续时间结束。可能会在中断中输入
低功率。可能会在中断中断电
?不知道这是否有效…如果你回到ISR内睡觉,一定要给自己留一条出路。不过,那将是为了接收数据。这似乎没有收到任何消息。是的,ISR正在唤醒它。问题是中断在他想要睡眠的64秒内触发了多少次。ISR仅用于为每次中断事件增加一个计数器(功率变量)。我感兴趣的是,当ISR运行时,计数器是否会增加,而不运行循环,直到ForLoop中的睡眠持续时间结束。可能会在中断中输入
低功率。可能会在中断中断电
?不知道这是否有效…如果你回到ISR内睡觉,一定要给自己留一条出路。