问题描述
Atmega328P 数据表的快照:
根据 Atmega328P 数据表的上述部分,只有电平或引脚更改中断才能从掉电睡眠模式唤醒 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;
}
代码取自“Arduino Interrupts with PIR Motion Sensor”。
我不明白这段代码是如何工作的?
解决方法
Atmel 的数据表让人相信你只能在 MCU 处于睡眠模式时使用 LOW 中断来唤醒它。然而,长期以来确认您可以使用任何类型的中断(上升沿/下降沿/低电平/任何逻辑变化)将 Atmega328p 从睡眠模式唤醒。 Atmel 的数据表上有一个错误。 Nick Gammon 在 Interrupts 上的帖子中证实并记录了这一点。