阁楼 85 睡眠模式

ATTINY 85 SLEEP MODE

我是微控制器编程新手,刚开始使用 Attiny85。我正在尝试为带触觉开关的 LED 构建电路。每次按下触觉开关时,它都会将 LED 跳到下一个操作状态。因为它是电池供电的,所以当 LED 熄灭时,我希望 attiny 85 消耗尽可能低的电流。截至目前,当 LED 在没有睡眠模式的情况下关闭时,它消耗 4mA。所以我尝试了 Attiny 85 的断电模式,但我是如何陷入断电模式的

if(count == 8){
          analogWrite(0,LOW);
          //Serial.println("I am OFF");
          //Serial.println(count);
          set_sleep_mode(SLEEP_MODE_PWR_DOWN); //Power down everything
          sleep_mode();
          sleep_disable();
        }

进入睡眠模式成功,但无法退出。可以请人帮忙。我希望 Attiny 85 在再次按下触觉开关时退出睡眠模式。开关在引脚 7 上,即 attiny 85 的 PB2。

请参阅第 34 页的 datasheet 部分 7.1 睡眠模式

在table中可以看到,在掉电模式下只有3个源可以唤醒CPU:

  1. INT0,只有电平中断和引脚变化中断
  2. USI模块启动条件
  3. 看门狗中断

这意味着,如果您希望部件在按下按钮时唤醒,那么最好的选择是配置引脚更改中断。

首先你需要配置一个中断服务程序(ISR)。 ISR 只需要处理中断事件,没有它程序将重新启动。由于不需要任何操作,ISR 可以为空:

#include <avr/interrupt.h>

EMPTY_INTERRUPT(PCINT0_vect);

接下来需要配置pin change interrupt(参考datasheet中的9.2 External Interrupts部分) 例如:

// I don't know which pin do you use for the button
// Let's assue it is PB0 which corresponds to PCINT0 
// (see section 1. Pin Configurations)
PCMSK = (1 << PCINT0); // set pin change mask to PCINT0
GIMSK = (1 << PCIE); // enable pin change interrupt
sei(); // enable global interrupts

就是这样。配置中断后,输入端的任何逻辑电平变化都会导致 CPU 唤醒。