Прерывать каждую секунду на ATTiny84 (и спать все остальное)

Я создаю цифровые часы, как в этом посте, за исключением того, что я использую ATTiny84. Однако у ATTiny84 нет асинхронного Timer2, как у ATMega328, и нет режима энергосбережения, поэтому он не может проснуться от прерывания Timer2, как предлагается в этом посте.

Мне нужно увеличивать счетчик секунд каждую секунду, и мне нужно делать это точно, чтобы не терять/выигрывать время (поэтому я не могу использовать сторожевой таймер, который, как я понимаю, не использует кварцевый генератор, а скорее собственные неточные часы). Я планировал просто оставить ЦП включенным и использовать внешний кристалл, но, похоже, это требует много энергии (~ 3 мА). Даже с SLEEP_MODE_IDLE я смог снизить потребляемый ток примерно до (~1,2 мА).

Как предложил Ник Гэммон в этом посте, я считаю, что реальное решение – это спать, не меняя счетчик. Есть ли способ проснуться через определенное время в режимах POWER_DOWN или STAND_BY?

, 👍2


1 ответ


Лучший ответ:

3

Можно ли как-нибудь проснуться по прошествии определенного времени в Режимы POWER_DOWN или STAND_BY?

Боюсь, что нет. Вам придется использовать таймер. Так как ATtiny84 делает нет асинхронного таймера, вам придется сохранить свой таймер часы. Это означает, что домен часов clkIO должен оставаться активный. Теперь взгляните на таблицу «Домены Active Clock и Wake-up Источники в разных спящих режимах», на странице 33 ATtiny84. техническое описание. Он показал, что «Idle» — это единственный спящий режим. который поддерживает этот домен часов активным.

Даже с SLEEP_MODE_IDLE я мог получить только текущий розыгрыш примерно до (~1,2 мА).

Есть способы уменьшить это. Во-первых, это сборник функции с именем power_*_disable() в avr-libc. Вы можете использовать они отключают все периферийные устройства, кроме одного таймера, вы будете использовать.

Самое главное, вы можете сэкономить электроэнергию, снизив тактовую частоту. С эти устройства имеют чрезвычайно малый ток утечки, потребляемый ток примерно пропорционально тактовой частоте. Тогда вы сможете добиться огромного экономия энергии за счет резкого снижения этой частоты. Очевидно, ваш вычислительная мощность также пострадает, но это может не быть проблемой для простые двоичные часы.

Я думаю, что лучший вариант для вас — отключить синхронизацию ATtiny84 от Часовой кристалл 32,768 кГц. См. раздел 6.2.4 – Низкочастотный кварцевый генератор в техническом описании. Эти кристаллы могут быть очень точными, так как они специально разработаны для учета времени. И частота настолько низкая, что ток потребляется от MCU, вероятно, будет незначительным по сравнению с любыми другими компонентами в ваших часах.

ОБНОВЛЕНО: ответ на вопрос в комментарии.

Не будет ли при выходе из режима ожидания использовать сторожевой таймер? Или есть способ проснуться на основе кристалла 32,768 кГц?

Поскольку сторожевой таймер слишком неточен, он вам бесполезен. Вместо этого вы должны использовать Таймер 0 или Таймер 1 и настроить его на выдавать прерывание каждые 32 768 циклов процессора. Это прерывание будет быть источником пробуждения с частотой 1 Гц.

Это можно сделать с любым таймером, в режиме CTC или в быстром режиме PWM. Ты необходимо настроить предварительный делитель и значение TOP таким образом, чтобы

prescaler_factor × (TOP + 1) = 32 768

Затем включите соответствующее прерывание и определите соответствующий ISR. это ускорит ваши часы на одну секунду.

,

Спасибо, похоже, что мощность, используемая кристаллом 32,768 кГц, достаточно мала для меня, если он работает в режиме ожидания. Не будет ли пробуждение из режима ожидания по-прежнему использовать сторожевой таймер? Или есть способ пробуждения на основе кристалла 32,768 кГц?, @Anubhav

@AnubhavSrivastava: см. развернутый ответ., @Edgar Bonet