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

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-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 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 пользователей онлайн

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

    • Точило это ногами видимо крутить, оборотов до 200 в мин. А если шлифмашина или заточной станок с оборотами от 2000 и выше то не только разлетается но и травмирует не хило.
    • Правильней будет сказать: никто не видел, чтобы его били. Ещё подсветку проверьте - сильно ли нагревается экранчик от неё?
    • С каких пор микросхема стабилизатора напряжения, включенная по схеме стабилизатора же напряжения, стала работать ещё и ограничителем тока?
    • Ну вот, пока готовил эскиз, на все вопросы ответили :-) Действительно, в 3D моделях DipTrace нет (или не нашёл) модели корпуса ТО220 с распайкой с нижней стороны и креплением к радиатору - по этому и получился такой 3D-портрет платы. Задуманная конструкция выглядит примерно так:  По факту, для наладки, сейчас подключаю транзисторы, закрепленные на радиаторе, проводами.
    • Чтобы потом не допиливать паровоз до истребителя. Заводские варианты схемотехники куда более предсказуемы. Из "вольностей" в первую очередь как-то решать проблему коммутации, подходящий переключатель для режимов искать история долгая и грустная. Что-то там с реле. На диапазоны 6п4н вроде же ?  пг2 хрен найдёшь, п2г тугое неудобство(  Рассыпушный ацп делать, боже упаси. Ну разве что был грешен, побаловался когда-то пнч-ацп. С 1108пп1 и 155 серией
    • Но зачем повторять 1в1? Там дана просто топология   Но не совсем же с нуля. Маловероятно, что вы найдете расширение диапазона 7135 до 200мВ по тому же методу, что это реализовано в В7-38, тем не менее, это вполне реализуемо. А вот до 20мВ я спустить диапазон не смог Что-то предусилитель интегратора отказывается вести себя хорошо   Для сравнения, та же точка (вход интегратора) при 200мв пределе, усиление х10   Ну и 2В Госпаде боже лтц2400, на этой штуке можно и 6 разрядник собрать, лютый АЦП, какие 4.5 разряда Цена на него сейчас конечно негуманная кстати.
×
×
  • Создать...