arduino - 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 中断”。
我不明白这段代码是如何工作的?
解决方案
Atmel 的 datasheet 让人相信只能在 MCU 处于睡眠模式时使用 LOW 中断来唤醒 MCU。然而,长期确认您可以使用任何类型的中断(上升沿/下降沿/低电平/任何逻辑变化)将 Atmega328p 从睡眠模式唤醒。Atmel 的数据表上有一个错误。Nick Gammon 在他关于Interrupts的帖子中证实并记录了这一点。
推荐阅读
- react-native - React Navigation:直接移动到最后一页,onBack 转到上一个屏幕
- javascript - 如何使用 JS ES6 和 jQuery 将特定数据从本地存储加载到新页面?
- c - Scanf / Printf 意外行为
- ios - SwiftUI 列表行在点击后更改其背景颜色
- python - 使用 itertools 将数组行循环到方程中
- wpf - 在嵌套样式/DataGrid DataTemplates 中找不到参考绑定源
- c# - 异常信息:调用 C++ Dll 时出现 System.AccessViolationException
- xml - xPath Expression v1.0 [迭代器,如果有的话]
- joomla - JCE 2.8.3 错误:“服务器返回了无效的 JSON 响应”
- git - git/SourceTree 本地“分支”删除?