GYVERPOWER и Attiny 13

_Quasar_

✩✩✩✩✩✩✩
30 Июл 2021
52
0
Доброго времени. Подскажите как эта библиотека работает с Attiny 13, в инструкции на библиотеку v1.7 написано Совместимость: Atmega2560/32u4/328, Attiny85/84/167, Про 13 ни слова. Вот чтобы кирпич не словить хотел бы это выяснить.

Мне просто надо уйти в глубокий сон с отключением WTD и проснуться от внешнего прерывания.
 
Изменено:

_Quasar_

✩✩✩✩✩✩✩
30 Июл 2021
52
0
Ладно сам отвечу.. Вчера проверил все работает. На простом блинке вся конструкция занимает около 300байт. Еще 700 можно для программы оставить. Спит тинька при токе 1мкА.. На сколько позволяет измерить мой мультимитр.
 

AlexGyver

★★★★★★✩
Команда форума
30 Июл 2018
357
564
возможно получится снизить вес, если спать не инструментами avr-libs (как реализовано в GyverPower), а напрямую командами по даташиту, вот например дядька возился https://vk.com/wall-97877471_721165
 

N0rdling

★✩✩✩✩✩✩
15 Янв 2020
154
18
Всех приветствую!
Собрал простую схему на 13й тиньке
2024-02-25_18-55-19.png
Это обычный трехкнопочный пульт с передатчиком 433MHz. Питать планирую от литиевой таблетки, соответственно актуально снижение энергопотребления.
Загрузил скетч:
Скетч:
#define butt1 PB3 //вкл/выкл
#define butt2 PB4 //+
#define butt3 PB2 //-


uint8_t data[2];
bool fl = 0;


#define RADIO_VCC  PB0

#include <Gyver433.h>
Gyver433_TX <PB1> tx;
#include <GyverPower.h>
#include <util/delay.h>


void setup() {

  pinMode(RADIO_VCC, OUTPUT);           // Питание радио
  pinMode(butt1, INPUT_PULLUP);           // Кнопки
  pinMode(butt2, INPUT_PULLUP);           // Кнопки
  pinMode(butt3, INPUT_PULLUP);           // Кнопки


  power.hardwareDisable(PWR_ALL);       // Отключаем всю периферию
  power.setSleepMode(POWERDOWN_SLEEP);  // Самый глубокий сон

  // Для тини 13 активируем прерывания по смене уровня пинов PB2 PB3 PB4

  PCMSK |= 1 << PCINT2;
  PCMSK |= 1 << PCINT3;
  PCMSK |= 1 << PCINT4;
  GIMSK |= 1 << PCIE;
}


void loop() {

  power.sleep(SLEEP_FOREVER);           // Уходим в сон
}

// Для тини 13

ISR(PCINT0_vect) {
  wakeUp();
}

void wakeUp() {

  _delay_ms(70);                         // ждем для антидребезга
  if (!digitalRead(butt1))         data[1] = 1;
  else if (!digitalRead(butt2))    data[1] = 3;
  else if (!digitalRead(butt3))    data[1] = 4;

  _delay_ms(250);                         // ждем для определения долгого нажатия

  if (!digitalRead(butt1))          data[1] = 2;
  else if (!digitalRead(butt2))     data[1] = 5;
  else if (!digitalRead(butt3))     data[1] = 6;

  fl = !fl;
  if (fl) {
    digitalWrite(RADIO_VCC, HIGH);        // Запитываем
    _delay_ms(1);                         // Немного ждем
    data[0] = 0x7D;                       // Адрес
    tx.sendData(data);                    // Отправляем пакет
    digitalWrite(RADIO_VCC, LOW);         // Отключаем и идем спать
  }
}
Потребление схемы 0,2mA, в момент нажатия кнопок подскакивает до 5.5mA.
Потребление во сне должно быть меньше микроампера.
В чем моя ошибка?
 

Bruzzer

★★★✩✩✩✩
23 Май 2020
312
100
Как бы сделал я.
Сначала написал простой скетч, который моргает светодиодом когда не спит,
По нажатию одной кнопки гасит светодиод и уходит в сон, по нажатию другой кнопки просыпается (и значит снова моргает ).
Тогда было бы видно, спит или нет. И на этом скетче измерил бы токи потребления.

По программе.
Вы делаете всю работу в прерывании. В общем случае это не правильный подход.
В прерывании после сна обычно делают только необходимый минимум.
 

N0rdling

★✩✩✩✩✩✩
15 Янв 2020
154
18
@Bruzzer, согласен с вами по поводу не правильности делать всю работу в прерывании в общем случае, но в данном коде и работы-то минимум, да и сам код взят с канала Заметки Ардуинщика из видео про Сеть беспроводных датчиков. Там товарищ nich1con замерил энергопотребление, которое и оказалось меньше 1 микроАмпера. Собственно его скетч я переделал минимально: прописал свои порты, 3 кнопки вместо одной, на эти 3 Пина разрешил прерывания по смене уровня. Соответственно обработчик самого прерывания свой. Но что касается спящего режима и его настроек - один в один, ничего не менял.
Строки кода 26, 27 и 40 отвечают за глубокий сон, и Тони должна по идее меньше микроАмпера потреблять, но у меня на мультимеьре 0,2 мА.
 

Геннадий П

★★★★★★✩
14 Апр 2021
1,799
579
44
@N0rdling, для начала выкиньте светодиод и передатчик, попробуйте на минимальной обвязке, а затем постепенно все подключайте и смотрите энергопотребление.
 

N0rdling

★✩✩✩✩✩✩
15 Янв 2020
154
18
@Геннадий П, пробовал, дело не в обвязке, именно голый камень потребляет. Более того, грешил на мультиметр, подключил схему последовательно через резистор, и замерил падение напряжения на нём. По закону Ома ток все те же 0.2мА.
Возможно ли повышенное потребление из-за того, что у меня кнопки подключены с внутренней подтяжкой INPUT_PULLUP?
 
Изменено:

N0rdling

★✩✩✩✩✩✩
15 Янв 2020
154
18
@Геннадий П, не понял вопрос. Тиньку прошиваю программатором USB ASP. Если попытаться прошить в нее загрузчик,вроде меняются только фьюзы, а сам загрузчик не шьется. Фьюзы прошивал (менял BOD - результата не дало). Если уменьшить частоту, то перестает работать радио (потребление при этом так же не меняется...)

Возможно ли как-то на время сна отключать сторожевой таймер? Похоже, что он и потребляет...

Короче, ребята, код у меня правильный, библиотеки работают, как надо, вопрос исчерпан. Проблема была в том, что мне попалась какая-то бракованная тинька, скетч на ней работает, но потребление во сне высокое. Взял другую и, о чудо, потребление настолько низкое, что смог замерить его только с костылями (0.5мкА), т.к. мой мультиметр умеет измерять только до сотых миллиАмпера.
 
Изменено: