如何解决Atmega328P 使用边沿触发中断从掉电模式唤醒
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 上的帖子中证实并记录了这一点。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。