Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: RTC в ATmega
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
zombi
Никогда ранее не использовал режимы пониженного потребления в AVR, а сейчас возникла необходимость в счетчике реального времени.
Помогите разобраться что к чему:
Как я понял нужно подключить к ногам TOSC1 и TOSC2 кварцевый резонатор на 32.768kHz и запитать проц от батарейки.
Настроить прерывание раз в секунду и просто инкрементировать 32-х битный счетчик в озу процессора.
При этом чтобы реализовать счет времени при отключеном внешнем питании процессор должен
обязательно тактироваться от внешнего или внутреннего резонатора но ни как не от внешнего генератора?
Diusha

Цитата(zombi @ Dec 27 2010, 21:46) *
При этом чтобы реализовать счет времени при отключеном внешнем питании процессор должен
обязательно тактироваться от внешнего или внутреннего резонатора но ни как не от внешнего генератора?

Что Вы называете внутренним резонатором? У AVR такого нет. Может внутренний RC-осциллятор? Для меньшего потребления хорошо бы использовать его, 128 кГц, но в том случае, если точность тактовой не важна (точные интервалы задаются часовым кварцем). Противопоказаний против внешнего генератора не вижу.


Цитата(zombi @ Dec 27 2010, 21:46) *
Настроить прерывание раз в секунду и просто инкрементировать 32-х битный счетчик в озу процессора.

Раз в секунду, 32-х битный...
2^32 = 4294967296 сек = 136 лет
Зачем так много?
777777
Цитата(zombi @ Dec 27 2010, 21:46) *
Как я понял нужно подключить к ногам TOSC1 и TOSC2 кварцевый резонатор на 32.768kHz и запитать проц от батарейки.
Настроить прерывание раз в секунду и просто инкрементировать 32-х битный счетчик в озу процессора.

У него есть прескалер на 128. Если его включить, то переполнения будут происходить каждую секунду: 128*256 = 32768
А почему обязательно 32-битный? Это уж как удобно, можно отдельно инкрементировать байт с секундами, при достижении 60 инкрементиоровать минуты и т.д. А в остальное время находиться в power save mode.
Цитата(zombi @ Dec 27 2010, 21:46) *
При этом чтобы реализовать счет времени при отключеном внешнем питании процессор должен
обязательно тактироваться от внешнего или внутреннего резонатора но ни как не от внешнего генератора?

Ну почему никак? Если найдете генератор, работающий от батарейки длительное время, то какие проблемы?
zombi
Цитата(777777 @ Dec 28 2010, 11:00) *
Ну почему никак? Если найдете генератор, работающий от батарейки длительное время, то какие проблемы?

Боюсь из ширпотреба такой врядли найду, а с экзотикой связываться не хочется.
Обычно у генераторов потребление в пределах 5-20 ma.

32-х разрядный счетчик для уменьшения времени обработки 1сек прерывания.
А распаковкой заниматься при наличии основного питания.
rx3apf
Цитата(zombi @ Dec 28 2010, 14:42) *
Боюсь из ширпотреба такой врядли найду, а с экзотикой связываться не хочется.
Обычно у генераторов потребление в пределах 5-20 ma.

Вот и противопоказание к использованию внешнего. А внутренний - RC, конечно, менее точный (если вдруг критично), зато не тратит время на "разгон" (как кварц).
Цитата
32-х разрядный счетчик для уменьшения времени обработки 1сек прерывания.
А распаковкой заниматься при наличии основного питания.

Обратите внимание на особенности работы таймера в асинхронном режиме. Из прерывания нельзя выходить раньше 1/32768 sec. В случае тактирования системного тактового генератора от кварца это некритично (он типично дольше "разгоняется"), а вот в случае RC - рекомендую ОЧЕНЬ внимательно почитать раздел, связанный с этими особенностями. И времени, кстати, на обработку "настоящего" RTC там будет вагон (200+ тактов при тактовой 8 MHz, раньше выйти нельзя). И потребление мизерное, даже если не то что раз в секунду, а хоть бы и 16 раз в секунду, работающий опорник сам по себе больше жрет (в старых, не A/PA, вариантах). И еще надо грамотно реализовать переход на резервное питание.
zombi
Цитата(rx3apf @ Dec 28 2010, 17:02) *
200+ тактов при тактовой 8 MHz, раньше выйти нельзя.

Ну да, в таком случае действительно экономить нечего.

А можно ли както сделать так чтоб при отсутсвии основного питания проц тактировался от внутреннего RC ну или от чегото другого малопотребляющего,
а при подаче питания от внешнего генератора?

777777
Цитата(rx3apf @ Dec 28 2010, 16:02) *
Из прерывания нельзя выходить раньше 1/32768 sec.

Это еще что за предрассудки? Нельзя ли цитату из даташита? А то у меня в часах обработка прерывания существенно меньше 30 мкс, а никаких приблем я не заметил.
zombi
Цитата(777777 @ Dec 28 2010, 17:29) *
Это еще что за предрассудки? Нельзя ли цитату из даташита? А то у меня в часах обработка прерывания существенно меньше 30 мкс, а никаких приблем я не заметил.

Код
• If Timer/Counter2 is used to wake the device up from Power-save or Extended
Standby mode, precautions must be taken if the user wants to re-enter one of these
modes: The interrupt logic needs one TOSC1 cycle to be reset. If the time between
wake-up and re-entering sleep mode is less than one TOSC1 cycle, the interrupt will
not occur, and the device will fail to wake up. If the user is in doubt whether the time
before re-entering Power-save or Extended Standby mode is sufficient, the following
algorithm can be used to ensure that one TOSC1 cycle has elapsed:
1. Write a value to TCCR2, TCNT2, or OCR2.
2. Wait until the corresponding Update Busy Flag in ASSR returns to zero.
3. Enter Power-save or Extended Standby mode.

Курил DS. Вот тут вроде об этом речь? Но я в англицком не силен. Это оно или нет?
rx3apf
Цитата(zombi @ Dec 28 2010, 16:43) *
Курил DS. Вот тут вроде об этом речь? Но я в англицком не силен. Это оно или нет?

Да, оно самое. И для переполнения и для OC. Пренеприятнейшая вещь....

Цитата(zombi @ Dec 28 2010, 16:28) *
А можно ли както сделать так чтоб при отсутсвии основного питания проц тактировался от внутреннего RC ну или от чегото другого малопотребляющего,
а при подаче питания от внешнего генератора?

Нельзя, к тому же у AVR есть ограничение на скорость изменения тактовой частоты. Ну, RC тоже неплохой вариант, его можно откалибровать по часовому и, при желании, подстраивать. Для прецизионных измерений непригодно, а вот для корректной работы UART - вполне даже нормально. В конце концов, если в режиме батарейного питания нужны только часы - взять готовый чип.
algidim
Цитата(Diusha @ Dec 28 2010, 05:19) *
Что Вы называете внутренним резонатором? У AVR такого нет. Может внутренний RC-осциллятор? Для меньшего потребления хорошо бы использовать его, 128 кГц, но в том случае, если точность тактовой не важна (точные интервалы задаются часовым кварцем). Противопоказаний против внешнего генератора не вижу.

Почему нет ? Например в Amega48,88,8 и многих других есть внутренний генератор на 8 мГц. Все очень просто AVR тактируется именно от внутреннего кварцевого резонатора. Внешний резонатор 32678 Гц (часовой) используется для работы таймера 2 в асинхронном режиме. Таймер2 формирует прерывание раз в 1 сек, в этом прерывании инкрементируете необходимые переменные в ОЗУ, делаете то что вам нужно и переходите в режим Pover Save.
Мне нужно было для прибора делать дешевые часы и с дополнительными функциями, который выполняет Atmega. Читает время из неё основной контроллер по i2c. Вообщем получился аналог RTC с дополнительными функциями. Ток потребления у меня получился 8 мка. Контроллер лучше брать с буквой V на конце, у него расширенный диапазон питающего напряжения. Так что если вам это интересно – разберетесь, примеров полно !



rx3apf
Цитата(algidim @ Dec 29 2010, 15:21) *
Почему нет ? Например в Amega48,88,8 и многих других есть внутренний генератор на 8 мГц.

_Генератор_.
Цитата
Все очень просто AVR тактируется именно от внутреннего кварцевого резонатора.

_Резонатор_. Разницу не чувствуете ? Ну, тогда поищите этот самый "внутренний резонатор" в даташите. Производитель, наверное, очень удивился бы...


algidim
Цитата(rx3apf @ Dec 29 2010, 15:37) *
_Генератор_.

_Резонатор_. Разницу не чувствуете ? Ну, тогда поищите этот самый "внутренний резонатор" в даташите. Производитель, наверное, очень удивился бы...

Да я забыл biggrin.gif
Mega у меня тактируется от встроенного генератора с внутренней RC цепочкой на 8 мГц и включен делитель на 8. И того 1 мГц А резонатор – это просто кварц !
xelax
Цитата(zombi @ Dec 28 2010, 16:43) *
Код
• If Timer/Counter2 is used to wake the device up from Power-save or Extended
Standby mode, precautions must be taken if the user wants to re-enter one of these
modes: The interrupt logic needs one TOSC1 cycle to be reset. If the time between
wake-up and re-entering sleep mode is less than one TOSC1 cycle, the interrupt will
not occur, and the device will fail to wake up. If the user is in doubt whether the time
before re-entering Power-save or Extended Standby mode is sufficient, the following
algorithm can be used to ensure that one TOSC1 cycle has elapsed:
1. Write a value to TCCR2, TCNT2, or OCR2.
2. Wait until the corresponding Update Busy Flag in ASSR returns to zero.
3. Enter Power-save or Extended Standby mode.

Курил DS. Вот тут вроде об этом речь? Но я в англицком не силен. Это оно или нет?


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

Менять источник тактирования mcu в атмеге на лету нельзя, смиритесь. Единственное что можно сделать это понизить делителями тактовую, снять тактовую с неиспользуемых переферийных узлов и в рабочем режиме постоянно, находиться в IDLE, вместо суперпетли или планировщика (в случае ОС). Закончив обработку основных алгоритмов, сваливаться в power-save.
Если на вашем девайсе есть что-нибудь, что может дать пинка mcu для просыпания, то можно даже в power-down уходить.

У меня получилось добиться в power-save 6 мкА, в power-down <1 мкА.

А вообще тумана в этой теме нагнали..... Если бы я не знал очём идёт речь, то решил бы что всё жутко сложно.
rx3apf
Цитата(xelax @ Dec 30 2010, 10:49) *
Здесь же речь идёт о том, что нельзя сразу же повторно входить в режим сна, после просыпания. Необходимо дать время асинхронной логике обработки прерывания сброситься и для этого рекоммендуют записать данные в асинхронный регистр и подождать пока они там окажуться. И нет не слова о том чтобы сидеть всё это время в прерывании. Можно вообще ничего не ждать дополнительно, если сразу же засыпать не собираетесь.

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



algidim
Цитата(xelax @ Dec 30 2010, 10:49) *
Здесь же речь идёт о том, что нельзя сразу же повторно входить в режим сна, после просыпания. Необходимо дать время асинхронной логике обработки прерывания сброситься и для этого рекоммендуют записать данные в асинхронный регистр и подождать пока они там окажуться. И нет не слова о том чтобы сидеть всё это время в прерывании. Можно вообще ничего не ждать дополнительно, если сразу же засыпать не собираетесь.

Менять источник тактирования mcu в атмеге на лету нельзя, смиритесь. Единственное что можно сделать это понизить делителями тактовую, снять тактовую с неиспользуемых переферийных узлов и в рабочем режиме постоянно, находиться в IDLE, вместо суперпетли или планировщика (в случае ОС). Закончив обработку основных алгоритмов, сваливаться в power-save.
Если на вашем девайсе есть что-нибудь, что может дать пинка mcu для просыпания, то можно даже в power-down уходить.

У меня получилось добиться в power-save 6 мкА, в power-down <1 мкА.

А вообще тумана в этой теме нагнали..... Если бы я не знал очём идёт речь, то решил бы что всё жутко сложно.

Полностью согласен Понаписали какую то ересть, похоже тут всетаки в основном теоретики.
Да и зачем Вам на лету менять источник тактирования ? Cмысла нет, так как чем частота генератора выше, тем быстрее проц выполнит основную задачу и войдет в режим сна, соответственно средний ток будет примерно одинаковым. Единственное, при 8 мГц мгновенное потребление тока естественно выше, чем от 1 Мгц, а средний ток примерно одинаковым. И по поводу потребления тока подтверждаю у меня тож гдето 6 – 8 мкА при режиме power-save, естественно зависит от напряжения питания. Задача то тривиальная, нужно только желание чтобы её решить.
777777
Цитата(xelax @ Dec 30 2010, 10:49) *
И нет не слова о том чтобы сидеть всё это время в прерывании. Можно вообще ничего не ждать дополнительно, если сразу же засыпать не собираетесь.

Да это понятно. Но вот я выхожу из прерывания сразу после инкремента и сразу засыпаю. Тактирование от внутреннего RC-генератора 8 МГц, поэтому на всё уходит явно меньше 30 мкс. Однако часы почему-то работают.
rx3apf
Цитата(777777 @ Dec 30 2010, 13:04) *
Да это понятно. Но вот я выхожу из прерывания сразу после инкремента и сразу засыпаю. Тактирование от внутреннего RC-генератора 8 МГц, поэтому на всё уходит явно меньше 30 мкс. Однако часы почему-то работают.

Ну, короче, каждый делает так, как считает нужным. Мое дело - предупредить (поскольку я на это уже успел наступить два раза, и с переполнением, и с OC, и было весьма неприятно).
xelax
Цитата(777777 @ Dec 30 2010, 13:04) *
Да это понятно. Но вот я выхожу из прерывания сразу после инкремента и сразу засыпаю. Тактирование от внутреннего RC-генератора 8 МГц, поэтому на всё уходит явно меньше 30 мкс. Однако часы почему-то работают.


Если работает не по даташиту, а вопреки, то это недокументированная возможность. И не факт, например, что в следующей партии будет работать так же.
zombi
Цитата(xelax @ Dec 30 2010, 11:49) *
Можно вообще ничего не ждать дополнительно, если сразу же засыпать не собираетесь.

В том то и дело что именно сразу засыпать и собираемся!
777777
Цитата(xelax @ Dec 30 2010, 13:52) *
Если работает не по даташиту, а вопреки, то это недокументированная возможность. И не факт, например, что в следующей партии будет работать так же.

Если бы это была errata, то можно было бы предположить, что мне попалась ревизия, в которой это исправлено. Но это не баг, а фича, причем даже понятно почему так должно работать - поскольку этот узел асинхронный, требуется синхронизация с внутренним клоком.
xelax
Цитата(777777 @ Jan 2 2011, 22:06) *
Если бы это была errata, то можно было бы предположить, что мне попалась ревизия, в которой это исправлено. Но это не баг, а фича, причем даже понятно почему так должно работать - поскольку этот узел асинхронный, требуется синхронизация с внутренним клоком.


Просто время которое тратиться на пролог, тело и эпилог прерывания оказывается большим чем один цикл на TOSC1, необходимый для сброса логики прерывания, поэтому у вас и работает повторный вход в режим сна. Никакая это не фича, по крайней мере не фича микроконтроллера.

При более быстром тактировании эта фича легко превратится в багу, правда выше 8 МГц от внутреннего осциллятора всё равно не может тактироваться. Так что программа может жить и с этой фичей rolleyes.gif
zombi
Цитата(xelax @ Jan 11 2011, 12:54) *
Просто время которое тратиться на пролог, тело и эпилог прерывания оказывается большим чем один цикл на TOSC1,

Цитата(777777 @ Dec 30 2010, 14:04) *
Тактирование от внутреннего RC-генератора 8 МГц, поэтому на всё уходит явно меньше 30 мкс.

777777 утвеждает что меньше 30 мкс.

На 8-ми MHz это примерно 244 такта. Думаю достаточно для простого увеличения счетчика (секунд).
А может всетаки меньше 8MHz ?
А какое резервное питание? Внутренний RC обеспечивает 8 MHz при резервном питании ?
rx3apf
Цитата(zombi @ Jan 11 2011, 17:59) *
777777 утвеждает что меньше 30 мкс.

Вот помнится мне, что этот эффект (повторный вход в прерывание) даже при времени выполнения меньше 30uS проявляется вовсе не каждый раз, я долго не мог въехать, почему какие-то подозрительные импульсы проскакивают нерегулярно, и часы спешат, но не очень сильно. Когда понял причину, поправил и специально не исследовал. Но в памяти что-то такое отложилось...

Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.