首页 > 解决方案 > Atmega328P 使用边沿触发中断从掉电模式唤醒

问题描述

Atmega328P 数据表的快照:

在此处输入图像描述

根据 Atmega328P 数据表的上述部分,只有电平或引脚变化中断才能将 CPU 从掉电休眠模式唤醒。

但是,在以下代码中,上升沿用于将 CPU 从掉电模式中唤醒。

#include <LowPower.h>

const byte led_pin = 8;
const byte interrupt_pin = 2;
volatile byte state = LOW;

void setup() {
  Serial.begin(9600);
  pinMode(led_pin,OUTPUT);
}

void loop() {
  // the interrupt must be attached each loop
  attachInterrupt(digitalPinToInterrupt(interrupt_pin), interrupt_routine, RISING);
  LowPower.powerDown(SLEEP_FOREVER,ADC_OFF,BOD_OFF);     // sleep until interrupt
  detachInterrupt(digitalPinToInterrupt(interrupt_pin)); // remove interrupt

  // the usual wake routine that turns on the LED
  if (state == HIGH) {
    digitalWrite(led_pin, HIGH);
    delay(500);
  }

  if (state == HIGH){
    state = LOW;
    digitalWrite(led_pin,LOW);
  }
}

void interrupt_routine() {
  state = HIGH;
}

代码取自“带有 PIR 运动传感器的 Arduino 中断”。

我不明白这段代码是如何工作的?

标签: arduinoarduino-unoatmegaarduino-c++

解决方案


Atmel 的 datasheet 让人相信只能在 MCU 处于睡眠模式时使用 LOW 中断来唤醒 MCU。然而,长期确认您可以使用任何类型的中断(上升沿/下降沿/低电平/任何逻辑变化)将 Atmega328p 从睡眠模式唤醒。Atmel 的数据表上有一个错误。Nick Gammon 在他关于Interrupts的帖子中证实并记录了这一点。


推荐阅读