Алексей, несколько раз пытался перейти с ардуино на PlatformIO. Благодаря Вашим урокам остановился на PLatformIO основательно. Просьба продолжать Ваше дело не смотря ни на что. Помните, мы в ответе за тех кого приручили:) из тем, с которыми у меня возникли вопросы esp8266, хранение настроек во флешпамяти и их загрузка при сбое напряжения ( продолжение программы с места сбоя), примеры настройки распределения памяти для esp, команды lua, nodemcu из среды PlatformIO.
Когда используешь PWD_MODE периферия выключается сама. По сути он так-же как и биты PRR отключает её тактирование. Остается только то, что не требует тактирования и WDT если включен.
ардуино про мини с выпаенным стабилизатором в режиме повердаун но с включенным внутренним сётчиком который отсчитывает время до повторного включения потребляет 7-9 микроампер, питание от 3в.
Спасибо познавательно! Но зачем нужны строчки power_all_disable() и power_all_enable()? Я думал режим SLEEP_MODE_PWR_DOWN и так отключает всю периферию, кроме ADC и BOD.
Собирал часы на atmega8. Подтверждаю что возможно потребление 10 микроампер во сне. При этом еще и таймер в асинхронном режиме работает с часовым кварцем 32кГц считая время. 7 лет уже часы считают от АКБ 720мА, ни разу не заряжал. 7сегментные индикаторы зажигаются от внешнего питания без подзарядки АКБ. Просто отключать всю перифирию нужно. В атмеге328 с этим проще, в ней регистр отклчения периферии есть. ruclips.net/video/IY8YyFwUa60/видео.html
Может кому то пригодиться на эту тему работа Atmega328P от внутреннего RC генератора на частоте 1МГц и питание от 2,4 Вольта Ток потребления в спящем состоянии менее 0,4 мкА, в момент нажатия на кнопку 9 мА ( просыпается только от двух пинов прерывание 0 и 1 ) #include "Arduino.h" #include #define ButtonOne 2 #define ButtonTwo 3 //************************************************************************ void setup() { //Save Power by writing all Digital IO LOW - note that pins just need to be tied one way or another, do not damage devices! for (int i = 0; i < 20; i++) { if(i != ButtonOne || i != ButtonTwo || i != TransmitterPin ){ pinMode(i, OUTPUT); digitalWrite(i,LOW); } } pinMode(ButtonOne, INPUT_PULLUP); pinMode(ButtonTwo, INPUT_PULLUP);
} //************************************************************************** void loop() { // тут код который должен выполняться при пробуждении ( можно обработать с какой именно кнопки нажата и сделать обработку для каждой кнопки свое действие ) ADCSRA = 0; set_sleep_mode (SLEEP_MODE_PWR_DOWN); sleep_enable();
MCUCR = bit (BODS) | bit (BODSE); MCUCR = bit (BODS); noInterrupts(); attachInterrupt(digitalPinToInterrupt(ButtonOne), sleepISR1, FALLING); // LOW attachInterrupt(digitalPinToInterrupt(ButtonTwo), sleepISR2, FALLING); // LOW // LOW - прерывание будет срабатывать всякий раз, когда на выводе присутствует низкий уровень сигнала // CHANGE - прерывание будет срабатывать всякий раз, когда меняется состояние вывода // RISING - прерывание сработает, когда состояние вывода изменится с низкого уровня на высокий // FALLING - прерывание сработает, когда состояние вывода изменится с высокого уровня на низкий. interrupts(); sleep_cpu();
} void sleepISR1() { // Запретить спящий режим, чтобы мы больше не заходили в него, кроме как намеренно, по коду sleep_disable(); // код или действие при пробуждении по этому прерыванию // Отключаем прерывание, которое вывело нас из сна detachInterrupt(digitalPinToInterrupt(ButtonOne)); // Теперь мы продолжаем запуск основной функции Loop () сразу после того, как мы пошли спать } void sleepISR2() { // Запретить спящий режим, чтобы мы больше не заходили в него, кроме как намеренно, по коду sleep_disable(); // код или действие при пробуждении по этому прерыванию // Отключаем прерывание, которое вывело нас из сна detachInterrupt(digitalPinToInterrupt(ButtonTwo)); // Теперь мы продолжаем запуск основной функции Loop () сразу после того, как мы пошли спать }
И чем ваш код интересен? Без нестандартных фьюзов он так же будет использовать внешний кварц на 16 МГц. С программированием предделителя можно и с внешним кварцем получить низкие частоты без проблем. И просыпаться по примеру кода из ролика можно от любого пина, а не только от 2 и 3.
Алексей, несколько раз пытался перейти с ардуино на PlatformIO. Благодаря Вашим урокам остановился на PLatformIO основательно. Просьба продолжать Ваше дело не смотря ни на что. Помните, мы в ответе за тех кого приручили:) из тем, с которыми у меня возникли вопросы esp8266, хранение настроек во флешпамяти и их загрузка при сбое напряжения ( продолжение программы с места сбоя), примеры настройки распределения памяти для esp, команды lua, nodemcu из среды PlatformIO.
Когда используешь PWD_MODE периферия выключается сама. По сути он так-же как и биты PRR отключает её тактирование. Остается только то, что не требует тактирования и WDT если включен.
ардуино про мини с выпаенным стабилизатором в режиме повердаун но с включенным внутренним сётчиком который отсчитывает время до повторного включения потребляет 7-9 микроампер, питание от 3в.
Спасибо познавательно!
Но зачем нужны строчки power_all_disable() и power_all_enable()? Я думал режим SLEEP_MODE_PWR_DOWN и так отключает всю периферию, кроме ADC и BOD.
Спасибо! Взял на вооружение.
Собирал часы на atmega8. Подтверждаю что возможно потребление 10 микроампер во сне. При этом еще и таймер в асинхронном режиме работает с часовым кварцем 32кГц считая время. 7 лет уже часы считают от АКБ 720мА, ни разу не заряжал. 7сегментные индикаторы зажигаются от внешнего питания без подзарядки АКБ. Просто отключать всю перифирию нужно. В атмеге328 с этим проще, в ней регистр отклчения периферии есть. ruclips.net/video/IY8YyFwUa60/видео.html
Можно ли этот пример сделать на atmega8? Будет ли работать также?
Там старый стиль именования регистров, что-то придется переделывать.
Там нет прерывания от всех пинов. На сколько помню INT0, INT1. Даташит полистайте, он переведенный есть.
Спасибо!
а как вы в VS пишите под ардуино?
PlatformIO
А вас в гугле забанили? Два ключевых слова вы здесь написать не поленились, а на поисковик забили. Стыдно, товарищ!
Может кому то пригодиться на эту тему работа Atmega328P от внутреннего RC генератора на частоте 1МГц и питание от 2,4 Вольта Ток потребления в спящем состоянии менее 0,4 мкА, в момент нажатия на кнопку 9 мА ( просыпается только от двух пинов прерывание 0 и 1 ) #include "Arduino.h"
#include
#define ButtonOne 2
#define ButtonTwo 3
//************************************************************************
void setup() {
//Save Power by writing all Digital IO LOW - note that pins just need to be tied one way or another, do not damage devices!
for (int i = 0; i < 20; i++) {
if(i != ButtonOne || i != ButtonTwo || i != TransmitterPin ){
pinMode(i, OUTPUT);
digitalWrite(i,LOW);
}
}
pinMode(ButtonOne, INPUT_PULLUP);
pinMode(ButtonTwo, INPUT_PULLUP);
}
//**************************************************************************
void loop() {
// тут код который должен выполняться при пробуждении ( можно обработать с какой именно кнопки нажата и сделать обработку для каждой кнопки свое действие )
ADCSRA = 0;
set_sleep_mode (SLEEP_MODE_PWR_DOWN);
sleep_enable();
MCUCR = bit (BODS) | bit (BODSE);
MCUCR = bit (BODS);
noInterrupts();
attachInterrupt(digitalPinToInterrupt(ButtonOne), sleepISR1, FALLING); // LOW
attachInterrupt(digitalPinToInterrupt(ButtonTwo), sleepISR2, FALLING); // LOW
// LOW - прерывание будет срабатывать всякий раз, когда на выводе присутствует низкий уровень сигнала
// CHANGE - прерывание будет срабатывать всякий раз, когда меняется состояние вывода
// RISING - прерывание сработает, когда состояние вывода изменится с низкого уровня на высокий
// FALLING - прерывание сработает, когда состояние вывода изменится с высокого уровня на низкий.
interrupts();
sleep_cpu();
}
void sleepISR1() {
// Запретить спящий режим, чтобы мы больше не заходили в него, кроме как намеренно, по коду
sleep_disable();
// код или действие при пробуждении по этому прерыванию
// Отключаем прерывание, которое вывело нас из сна
detachInterrupt(digitalPinToInterrupt(ButtonOne));
// Теперь мы продолжаем запуск основной функции Loop () сразу после того, как мы пошли спать
}
void sleepISR2() {
// Запретить спящий режим, чтобы мы больше не заходили в него, кроме как намеренно, по коду
sleep_disable();
// код или действие при пробуждении по этому прерыванию
// Отключаем прерывание, которое вывело нас из сна
detachInterrupt(digitalPinToInterrupt(ButtonTwo));
// Теперь мы продолжаем запуск основной функции Loop () сразу после того, как мы пошли спать
}
И чем ваш код интересен? Без нестандартных фьюзов он так же будет использовать внешний кварц на 16 МГц.
С программированием предделителя можно и с внешним кварцем получить низкие частоты без проблем. И просыпаться по примеру кода из ролика можно от любого пина, а не только от 2 и 3.
Подписался . 10001