Ищу совет о том, как лучше всего спать и будить ATtiny816, запуская megatinycore в Arduino.
У меня встроенный компаратор настроен так:
#include <Comparator.h>
// Configure Piezo knock detection comparator parameters
Comparator.input_p = comparator::in_p::in0;
Comparator.reference = comparator::ref::vref_0v55;
Comparator.input_n = comparator::in_n::vref;
Comparator.hysteresis = comparator::hyst::large;
// Initialize comparator
Comparator.init();
Comparator.attachInterrupt(tapInterrupt, RISING);
// Enable the Analog Comparator to run in standby mode, and set to low power mode
AC_t& AC_struct = Comparator.getPeripheral();
AC_struct.CTRLA |= AC_LPMODE_bm | AC_RUNSTDBY_bm;
// Start comparator
Comparator.start();
Это прекрасно работает, и он отлично запускает TapInterrupt. Проблема в том, что теперь я хочу перевести чип в режим ожидания, чтобы сэкономить заряд батареи, например:
wdt_disable();
set_sleep_mode(SLEEP_MODE_STANDBY);
sleep_enable();
sleep_cpu();
sleep_disable();
Проблема в том, что, несмотря на то, что я настроил компаратор на продолжение работы в режиме ожидания, прерывание не срабатывает, что, как я предполагаю, связано с этим разделом в руководстве ATtiny816:
В режиме ожидания кондиционер по умолчанию отключен. Если бит «Работа в режиме ожидания» (RUNSTDBY) в элементе управления A (ACn.CTRLA) записывается в
1
, AC продолжит работать, но регистр состояния не будет обновляться, и прерывания не генерируются, если другие модули не запрашивают CLK_PER, но события и вывод пэда будут обновлено.
Итак, я предполагаю, что мне нужно разрешить какому-то другому модулю/периферийному устройству оставаться активным в режиме ожидания, но мой вопрос в том, что еще мне следует включить в режиме ожидания, чтобы выполнить это требование, а также использовать наименьшее количество батареи? И как я бы включил его в Arduino?
Я видел, что режим простоя тоже будет работать, но в идеале я хочу, чтобы он потреблял как можно меньше заряда батареи.
Обновлять: Итак, я поигрался с PIT, но поскольку прерывание компаратора должно быть очень отзывчивым, поскольку оно по сути действует как переключатель для включения схемы, к тому времени, когда она засыпает, просыпается, проверяется наличие прерывания компаратора для достаточно долгое время, чтобы он начал реагировать, а затем снова заснул, на самом деле это не экономит много энергии. Мне действительно нужно, чтобы компаратор работал постоянно, пока остальная часть чипа находится в режиме ожидания, если это возможно?
Вот что мне нужно сейчас, чтобы поддерживать работу RTC, в надежде, что это позволит компаратору работать в режиме ожидания:
// Set the sleep mode
set_sleep_mode(SLEEP_MODE_STANDBY);
// RTC initialization and configuration
while (RTC.STATUS > 0)
{
; /* Wait for all register to be synchronized */
}
RTC.CLKSEL = RTC_CLKSEL_INT32K_gc; /* 32.768kHz Internal Ultra-Low-Power Oscillator (OSCULP32K) */
RTC.PITCTRLA = RTC_PERIOD_CYC16384_gc /* RTC Clock Cycles 16384, resulting in 32.768kHz/16384 = 2Hz */
| RTC_PITEN_bm;
RTC.CTRLA = RTC_RUNSTDBY_bm;
Однако кажется, что прерывания компаратора по-прежнему не работают. Но тогда, если вы не можете использовать компаратор в режиме ожидания, я не понимаю цели использования флага RUNSTDBY, если вы потом не сможете использовать его в режиме ожидания?
Режим ожидания — единственное, что я пробовал с компаратором, так как да, режим PowerDown полностью отключает компаратор. Я заставил его работать, используя отдельную микросхему, чтобы обеспечить прерывание низкого уровня на выводе во время полного отключения питания, но если я смогу заставить его работать с меньшим количеством компонентов, это было бы хорошо.
Для микроконтроллеров tinyAVR серий 0, 1 и 2 предусмотрено 3 спящих режима: режим ожидания, режим ожидания и режим PowerDown. Более подробную информацию см. в таблицах 11.1 и 11.2 в техническом паспорте. Короче говоря, в режиме ожидания в спящем режиме работает только подмножество периферийных устройств (не так много), в регистре которых есть бит RUNSTDBY. RTC — одно из тех периферийных устройств, которые имеют бит RUNSTDBY в регистре CTRLA и могут использоваться в качестве источника синхронизации через внутренние часы ULP_32.738k. В режиме Power Down PIT (как часть RTC) является единственным периферийным устройством (наряду с сномоходом с адресом TWI), которое можно настроить для выхода из режима сна PowerDown. Вы можете настроить прерывание RTC/PIT (в зависимости от того, хотите ли вы использовать режим ожидания или режим PowerDown) для пробуждения и обработки переменного тока.
Прочтите главу 11 технического описания и AVR Low Power Techniques примечания по применению для получения более подробной информации или взгляните на мою Визитную карточку + ATtiny3227 Dev Board о том, как я настраиваю PIT (и другие конфигурации) для достижения тока сна. 1 мкА.
Похоже, все ваши примеры основаны на C в чем-то вроде студии Microchip, возможно ли это только в Arduino? поскольку мне это чертовски легче понять, лол.
К сожалению, некоторые расширенные функции просто недоступны в Arduino Framework. Даже megaTinyCore использует изрядное количество «голого» кода . Но большую часть кода все равно можно запустить под megaTinyCore, например, sleep_enable();
за сценой под названием SLPCTRL.CTRLA |= SLPCTRL_SEN_bm;
, и это именно то, что я использовал. Кстати, я не использую Microchip Studio, я использую свою собственную настройку.
Итак, я поигрался с PIT, но поскольку прерывание компаратора должно быть очень отзывчивым, поскольку оно по сути действует как переключатель для включения схемы, к тому времени, когда она засыпает, просыпается, проверяется наличие прерывания компаратора для достаточно долгое время, чтобы он начал реагировать, а затем снова заснул, на самом деле это не экономит много энергии. Мне действительно нужно, чтобы компаратор работал постоянно, пока остальная часть чипа находится в режиме ожидания, если это возможно?
Забыл упомянуть, что теперь мне нужно, чтобы RTC продолжал работать: // RTC initialization and configuration while (RTC.STATUS > 0) { ; /* Wait for all register to be synchronized */ } RTC.CLKSEL = RTC_CLKSEL_INT32K_gc; /* 32.768kHz Internal Ultra-Low-Power Oscillator (OSCULP32K) */ RTC.PITCTRLA = RTC_PERIOD_CYC16384_gc /* RTC Clock Cycles 16384, resulting in 32.768kHz/16384 = 2Hz */ | RTC_PITEN_bm; RTC.CTRLA = RTC_RUNSTDBY_bm;
Я думаю, что для вас лучше отредактировать исходное сообщение, добавив раздел «Обновить» и опубликовать там код с дополнительной информацией о том, что вы сделали для решения проблемы, чем опубликовать его здесь как комментарий, опубликовать код как комментарий сложно. читать...
Сколько времени вам нужно для пробуждения? 2 Гц — это пробуждение каждые 500 мс, оно, конечно, не будет реагировать.
Сейчас я обновил основной текст. Да, в этом-то и проблема: просто он недостаточно отзывчив, я думаю, единственный способ — постоянно контролировать компаратор.
Что касается флага
RUNSTDBY
, прочтите раздел 29.3.5 Работа в спящем режиме таблицы данных ATtiny816. Он описывает ясно. Как упоминалось ранее, существует 3 спящих режима, возможно, вам следует запустить режим ожидания вместо режима PowerDown, всегда существует компромисс между временем автономной работы и доступностью периферийных устройств.