0

我是编程微控制器的新手,我刚刚开始使用 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。

4

1 回答 1

2

请参阅数据表第 34 页的第7.1 节睡眠模式。

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

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

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

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

#include <avr/interrupt.h>

EMPTY_INTERRUPT(PCINT0_vect);

接下来您需要配置引脚更改中断(请参阅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 唤醒。

于 2020-01-29T14:35:20.337 回答