ATtiny816 Пробуждение резервного компаратора при прерывании

Ищу совет о том, как лучше всего спать и будить 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, если вы потом не сможете использовать его в режиме ожидания?

Что касается флага RUNSTDBY, прочтите раздел 29.3.5 Работа в спящем режиме таблицы данных ATtiny816. Он описывает ясно. Как упоминалось ранее, существует 3 спящих режима, возможно, вам следует запустить режим ожидания вместо режима PowerDown, всегда существует компромисс между временем автономной работы и доступностью периферийных устройств.

hcheung 21.07.2024 14:05

Режим ожидания — единственное, что я пробовал с компаратором, так как да, режим PowerDown полностью отключает компаратор. Я заставил его работать, используя отдельную микросхему, чтобы обеспечить прерывание низкого уровня на выводе во время полного отключения питания, но если я смогу заставить его работать с меньшим количеством компонентов, это было бы хорошо.

KG-DROID 21.07.2024 15:46
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
2
78
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Для микроконтроллеров 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? поскольку мне это чертовски легче понять, лол.

KG-DROID 03.07.2024 22:22

К сожалению, некоторые расширенные функции просто недоступны в Arduino Framework. Даже megaTinyCore использует изрядное количество «голого» кода . Но большую часть кода все равно можно запустить под megaTinyCore, например, sleep_enable(); за сценой под названием SLPCTRL.CTRLA |= SLPCTRL_SEN_bm;, и это именно то, что я использовал. Кстати, я не использую Microchip Studio, я использую свою собственную настройку.

hcheung 04.07.2024 02:32

Итак, я поигрался с PIT, но поскольку прерывание компаратора должно быть очень отзывчивым, поскольку оно по сути действует как переключатель для включения схемы, к тому времени, когда она засыпает, просыпается, проверяется наличие прерывания компаратора для достаточно долгое время, чтобы он начал реагировать, а затем снова заснул, на самом деле это не экономит много энергии. Мне действительно нужно, чтобы компаратор работал постоянно, пока остальная часть чипа находится в режиме ожидания, если это возможно?

KG-DROID 20.07.2024 17:03

Забыл упомянуть, что теперь мне нужно, чтобы 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;

KG-DROID 20.07.2024 18:09

Я думаю, что для вас лучше отредактировать исходное сообщение, добавив раздел «Обновить» и опубликовать там код с дополнительной информацией о том, что вы сделали для решения проблемы, чем опубликовать его здесь как комментарий, опубликовать код как комментарий сложно. читать...

hcheung 21.07.2024 02:42

Сколько времени вам нужно для пробуждения? 2 Гц — это пробуждение каждые 500 мс, оно, конечно, не будет реагировать.

hcheung 21.07.2024 02:53

Сейчас я обновил основной текст. Да, в этом-то и проблема: просто он недостаточно отзывчив, я думаю, единственный способ — постоянно контролировать компаратор.

KG-DROID 21.07.2024 12:34

Другие вопросы по теме