Библиотека GyverPower.h на ATtiny85

ForZe

✩✩✩✩✩✩✩
2 Май 2024
7
0
Доброго времени суток, господа. Намедне решил изучить возможности камушка ATtiny85 и пощупать библиотеку энергосбережения от Александра. И проблема в том, что я не могу понять как вывести этот камень из сна по прерыванию... Контроллер девственно голый, чисто сама ATtiny85 в DIP - панельке.

C++:
/* Светодиод подключен к 6 ноге контроллера (PB1).
Кнопка TTP223 подключена к 7 ноге контроллера (PB2) и настроенно прерывание.
*/

#include <GyverPower.h>  //Подключаем библиотеку
bool flag;               // Флаг состояния прерывания
void setup() {
  pinMode(PB1, OUTPUT);                 // Настройка порта вывода для светодиода
  pinMode(PB2, INPUT);                  // Настройка порта ввода для прерывания
  attachInterrupt(0, wakeUp, RISING);   // Оглавление прерывания по высокому уровню
  power.setSleepMode(POWERDOWN_SLEEP);  // Выбор максимально глубокого режима сна
}
void loop() {
  digitalWrite(PB1, flag);  // Зажигаем светодиод вместе с флагом из прерывания
}
void wakeUp() {
  flag = !flag;      // Инверсия флага прерывания
  if (flag == 1) {   //Проверка условия состояния флага при срабатывании прерывания
    power.wakeUp();  // Будим контроллер
    loop();  // Уходим в основной цикл
  } else {
    digitalWrite(PB1, 0);        // Тушим светодиод
    power.sleep(SLEEP_FOREVER);  // Уходим в сон
  }
}

После включения контроллера к питанию, схема потребляет около 6-7мА. Светодиод не горит, что вполне логично, ибо после функции setup, значение переменной flag по умолчанию равно 0. Нажимаю сенсорную кнопку. Светодиод загорается. Всё хорошо. Нажимаю ещё раз Светодиод тухнет, потребление "плюхается" до отметки в 5мкА. Прекрасно. Только после этого, кнопкой можно "утыкаться", т.к. контроллер просыпаться отказывается напрочь.

Попытался подсунуть другие режимы сна:

IDLE_SLEEP - энергопотребление не меняется вообще.
ADC_SLEEP - энергопотребление не меняется вообще.
POWERDOWN_SLEEP - Энергопотребление фантастическое, но просыпаться камень отказывается.
STANDBY_SLEEP - Компилироваться отказывается
POWERSAVE_SLEEP - Компилироваться отказывается
EXTSTANDBY_SLEEP - Компилироваться отказывается

На этом-же форуме наткнулся на тему "Прблема с просипанием в Attiny85.". Если сунуть в код из этой темы для обращения к регистрам:
C++:
void wakeUp() {
  flag = !flag;      // Инверсия флага прерывания
  if (flag == 1) {   //Проверка условия состояния флага при срабатывании прерывания
    power.wakeUp();  // Будим контроллер
    PCMSK = 0b00000100;
    GIMSK |= 0b00100000;
    loop();  // Уходим в основной цикл
  } else {
    digitalWrite(PB1, 0);        // Тушим светодиод
    power.sleep(SLEEP_FOREVER);  // Уходим в сон
  }
}
То при нажатии кнопки (сенсора), светодиод моргает на долю секунды и контроллер опять валиться спать. Но хотя бы видно, что прерывания контроллер видит и как-то пытается на него реагировать, что уже хорошо....

Но блин, как организовать скетч так, чтобы он засыпал полностью от кнопки и просыпался полностью? Я уже голову сломал. Пересмотрел несколько раз видео и Гайвера и Ничикона, перечитал в доль и поперёк форум, почитал аннотацию к библиотеке... Везде основной упор ставят либо на просыпание по таймеру с какой-то периодичностью, либо по кнопке, но после отработки задачи снова автоматом уходит в сон до следующей побудки либо по таймеру, либо по прерыванию. Есть ли способ его заставить проснуться бессрочно?