Перейти к содержанию

Power Down На Atmega8515


Dimon007

Рекомендуемые сообщения

Всем привет! Пытаюсь включить режим power down на mega8515, не выходит.

В основной программе:

void main(void)
{ 
	CNT0=0x00;
	OCR0=0x00;

	GICR|=0x40;
	MCUCR=0x03;	//0x03
	GIFR=0x40;
	TIMSK=0x02;
	ACSR=0x80;

	TCCR0=0x02;

	........

while (1)
{ 
 .......

 if(k>=2) 
 {	   
  #asm("cli");
  MCUCR=0x30;
  #asm("sei"); 
  #asm("sleep");
  MCUCR=0x03;
  k=0;		
  };
};

Прерывания:

interrupt [EXT_INT0] void ext_int0_isr(void)
{	 
	flag=1;
}

interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
	Tov=Tov+1; 
	if (Tov>=2441) 
	{
			Tov=0;  
			k=k+1;
	}
}

В даташите указано, что для включения power down нужно установить в регистре MCUCR биты SE (включение режима сна) и SM1 (powerdown).

По даташиту это 5-й и 4-й биты.

Выход из сна осуществляется только прерываниями по INTx, у меня это INT0.

В коде прерывания INT0 только устанавливается флаг обработки данных.

Счётчик k для подсчёта времени, через которое нужно заснуть.

В итоге мк просто продолжает работать, хотя прерываний по INT0 не было (и при эмуляции в протеусе и в железе).

Что я не так делаю?)

Изменено пользователем wowa
Исправил... Wowa.
Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

У 8515 есть еще один регистр управления и состояния - MCUCSR, в котором бит 5 есть SM2 (заметь не в MCUCR). У тебя не видно "работы" (предустановок) с этим регистром. Возможно из-за этого. Опусти в нем 5-й бит. Также выход по внешнему прерыванию происходит по НИЗКОМУ уровню (особо указано). Проверь в каком состоянии у тебя находятся при работе INT-ы, должны быть в единице.

Ссылка на комментарий
Поделиться на другие сайты

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Хмм. Насчёт низкого уровня я не учёл, завтра посмотрю) А остальные регистры по умолчанию в нуле.

Хотя в даташите вроде просто про изменение уровня говорится, нет?

Only an External Reset, a

Watchdog Reset, a Brown-out Reset, an External level interrupt on INT0 or INT1, or an

External interrupt on INT2 can wake up the MCU.

Изменено пользователем Dimon007
Ссылка на комментарий
Поделиться на другие сайты

Выбираем схему BMS для заряда литий-железофосфатных (LiFePO4) аккумуляторов

Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Я немного запутался с низким уровнем, извиняюсь. 

Все же обрати внимание на регистр MCUCSR. Лучше прописывать режимы полностью, не надеясь на значения по-умолчанию. В твоем случае, нужно выставить SE, SM1 в единицу, а SM2 в ноль. И если по какой-нибудь случаности (алгоритму) бит SM2 в MCUCSR оказывается установленным в 1, то ты попадаешь в режим Standby вместо Power Down, а он доступен только при работе с внешним резонатором.

Изменено пользователем Геннадий
Ссылка на комментарий
Поделиться на другие сайты

Поставил

MCUCSR=0x00;
EMCUCR=0x00;

EMCUCR содержит SM0.

В протеусе работает, в железе - нет. :(

МК просто не засыпает, хотя сигналов на INT0 точно нет (там прерывание по нарастанию).

Изменено пользователем Dimon007
Ссылка на комментарий
Поделиться на другие сайты

А разве EMCUCR у 8515 существует? По моим данным он присутствует только у ATmega161x.

А вот еще вопрос. Сторожевой таймер у тебя задействован? Нет ли сброса от него или аппаратного (вывод Reset подтянут к + Uпит.?) или от схемы BOD (уровень питания в норме?).

И обрати внимание на то, что при изменении значения MCUCR (зачем только ты с ним "играешься" в цикле) с 0Х03 на 0Х30 ты выставляешь генерацию внешнего прерывания ПО НИЗКОМУ уровню на входе (а не по фронту), для генерации по фронту надо прописывать 0Х33.

Изменено пользователем Геннадий
Ссылка на комментарий
Поделиться на другие сайты

EMCUCR существует)

Сторожевой таймер отключён.

Питание стабильное, ресет тоже (подтянут к + через 6,8 Ком).

Скорей всего проблема в MCUCR`е, но если поставить 0x33 (тут я конечно ошибся, спасибо), то МК засыпает, но не просыпается уже. :unsure:

А играюсь я с ним потому что где-то читал, что лучше в SE не держать единицу во время работы)

P.S. Что-то у меня возникло подозрение, что прерывание по возрастающему уровню просто не работает в режиме power-down:

Note that recognition of falling or rising edge interrupts on
INT0 and INT1 requires the presence of an I/O clock, described in “Clock Systems and
their Distribution” on page 33. Low level interrupts on INT0/INT1 and the edge interrupt
on INT2 are detected asynchronously. This implies that these interrupts can be used for
waking the part also from sleep modes other than Idle mode. The I/O clock is halted in
all sleep modes except Idle mode.

Изменено пользователем Dimon007
Ссылка на комментарий
Поделиться на другие сайты

Обнаружение фронтов на выводах INT осуществляется СИНХРОННО, а выход из режима Power Down осуществляется только по внешним прерываниям обнаруживаемым АСИНХРОННОГО, т.к. все тактовые сигналы отключаются и все синхронные модули не работают (только асинхронные остаются). Поэтому, по фронту камень не проснется, т.к. не будет сгенерировано прерывание! 

Остается только генерировать прерывание ПО НИЗКОМУ уровню, подвесить(подпереть) выводы INT к плюсу питания через резисторы, установить на выходе подключаемого устр-ва к входу INT (если таковое имеется) лог. 1 в режиме ожидания (спокойствия или по-умолчанию). И генерировать лог. 0 не меннее 2-х тактов сторожевого таймера или >2 мкс.

Насчет SE, есть такая рекомендация... Только что такое "непреднамеренное переключение" непонятно. Если следовать рекомендации, то и меняй только флаг SE, не трогая биты конфигурации (SMx).

Изменено пользователем Геннадий
Ссылка на комментарий
Поделиться на другие сайты

Только вот проблема в том, что в данном устройстве очень удобно использовать прерывание по возрастающему уровню.

Собственно, устройство спидометр для велосипеда. Как датчик - геркон на вилке + магнит на колесе. Использовать прерывание по низкому уровню здесь неудобно. Учитывая время прохождения магнита мимо геркона прерываний будет много генерироваться, а если колесо остановится так, что магнит будет на уровне геркона, то вообще МК сходит с ума)

Как выход для пробуждения можно сделать отдельную кнопку, но всё же хотелось, чтобы всё происходило автоматически.

Ссылка на комментарий
Поделиться на другие сайты

Вся бяка в том, что за время импульса (при единственном возможном варианте выхода из Power Down - генерации прерывания ПРИ НИЗКОМ уровне на входе INT) происходит многократная генерация прерывания (за один импульс). В таком варианте и счетчик переполнится, и МК заснет и проснется. На твой взгляд это и выглядит как "незасыпание" вообще. Тут надо схемотехникой брать. На вход ставить D-триггер. Приходящий импульс будет его опрокидывать по фронту, а в прерывании одной линией порта этот триггер возвращать обратно. Получится одноразовое срабатывание при любой длительности импульса.

Ссылка на комментарий
Поделиться на другие сайты

Тут надо схемотехникой брать. На вход ставить D-триггер. Приходящий импульс будет его опрокидывать по фронту, а в прерывании одной линией порта этот триггер возвращать обратно. Получится одноразовое срабатывание при любой длительности импульса.

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

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

Есть и еще варианты, и аппаратный триггер лучшим решением не выглядит.

Ссылка на комментарий
Поделиться на другие сайты

D-триггер не претендует на гениальную идею. Это один из вариантов решения данной проблемы. Можно и одновибратор поставить, и простую дифференцирующую RC-цепь, подобрав номиналы. D-триггер просто позволяет организовать стабильный узел, не зависящий от внешних факторов.

Программно решить вопрос сна и пробуждения в момент установки магнита напротив датчика (при стоянке) вряд ли удастся, т.к. все пробуждения по INT происходят асинхронно в большинстве режимов сна (а возможно и во всех). Да и возможность управлять аппаратным пробуждением, так кам нам иногда хочется, разработчики AVR нам не оставили. Поэтому камешек не уснет, а точнее будет "тренироваться подъем-отбой!!!", как в армии :) , пока магнит не съедет с датчика и на входе INT не появится лог.1.

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
  • Сообщения

    • собирай на 4558, будет работать 100%...  чуток более нелинейных искажений и чуток более шумов.. но на слух ты их скорее не определишь..
    • То, что вы называете "перекосом" (на одном плече 200 на другом 150) - это результат работы разделительной ёмкости С3. Она убрала постоянную составляющую, возникшую из-за лишнего импульса в нижнем плече. Начните с внимательной проверки каскада раскачки на Q3 Q4. Что на базы приходит, что на коллекторах получается, что на выходных обмотках. Надо найти причину возникновения этого лишнего импульса.
    • проверяйте на емкость и ЭПС. Все базовые цепи надо проверить. В любом случае, при замере напряжения к-э силовых ключей, разница будет видна при сухом конденсаторе
    • Если это нормальные оригинальные (или хотя бы просто нормальные) 4558 а не самая дикая китайская паль, то обычному человеку их боооолее чем хватит.  Вот такая схема, можете спокойно по ней собирать. Питание тут однополярное, 4558 прекрасно в ней работать будет. C3 только увеличить до 1-10 мкФ (микрофарад) и R2 убрать. PR1 регулирует усиление, от 1 до 100 раз. Если усилитель возбуждается (скорее всего так и будет), поставьте параллельно выводам резистора PR1 конденсатор на 47-100 пФ (пикофарад). У TL072 и 4558 в корпусах DIP8 и SOIC 8 распиновка одинаковая. 
    • Спасибо за помощь. Понял что эта схема не подходит но все таки хотелось бы именно на 4558.
    • С9 и С10 по 0,1 мкФ стоят, но не керамика, а плёнка. Думаете надо их заменить на керамику? И поставить непосредственно на выводы микросхемы?  По коррекции попробовать увеличить С6? Сейчас 5пф.
    • Возможно, подвозбуд в активном режиме. Стоит попробовать специальную NiZn ферритовую бусину на затвор. Нужно одеть бусину непосредственно на ножку, ближе к кристаллу. Eмкостная связь разрывается, условий для генерации емкостной трехточки уже не будет. Простое увеличение затворного сопротивления, как правило, в этом случае не эффективно. Марганец-цинковый феррит или амрфные/нанокристаллические сердечники тоже не очень хороши в этом месте.
×
×
  • Создать...