Dimon007 Опубликовано 9 июля, 2009 Поделиться Опубликовано 9 июля, 2009 (изменено) Всем привет! Пытаюсь включить режим 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 не было (и при эмуляции в протеусе и в железе). Что я не так делаю?) Изменено 9 июля, 2009 пользователем wowa Исправил... Wowa. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Геннадий Опубликовано 9 июля, 2009 Поделиться Опубликовано 9 июля, 2009 У 8515 есть еще один регистр управления и состояния - MCUCSR, в котором бит 5 есть SM2 (заметь не в MCUCR). У тебя не видно "работы" (предустановок) с этим регистром. Возможно из-за этого. Опусти в нем 5-й бит. Также выход по внешнему прерыванию происходит по НИЗКОМУ уровню (особо указано). Проверь в каком состоянии у тебя находятся при работе INT-ы, должны быть в единице. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
20% скидка на весь каталог электронных компонентов в ТМ Электроникс!Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!Перейти на страницу акции Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849
Dimon007 Опубликовано 9 июля, 2009 Автор Поделиться Опубликовано 9 июля, 2009 (изменено) Хмм. Насчёт низкого уровня я не учёл, завтра посмотрю) А остальные регистры по умолчанию в нуле. Хотя в даташите вроде просто про изменение уровня говорится, нет? Only an External Reset, aWatchdog Reset, a Brown-out Reset, an External level interrupt on INT0 or INT1, or an External interrupt on INT2 can wake up the MCU. Изменено 9 июля, 2009 пользователем Dimon007 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>> Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161
Геннадий Опубликовано 10 июля, 2009 Поделиться Опубликовано 10 июля, 2009 (изменено) Я немного запутался с низким уровнем, извиняюсь. Все же обрати внимание на регистр MCUCSR. Лучше прописывать режимы полностью, не надеясь на значения по-умолчанию. В твоем случае, нужно выставить SE, SM1 в единицу, а SM2 в ноль. И если по какой-нибудь случаности (алгоритму) бит SM2 в MCUCSR оказывается установленным в 1, то ты попадаешь в режим Standby вместо Power Down, а он доступен только при работе с внешним резонатором. Изменено 10 июля, 2009 пользователем Геннадий 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Dimon007 Опубликовано 13 июля, 2009 Автор Поделиться Опубликовано 13 июля, 2009 (изменено) Поставил MCUCSR=0x00; EMCUCR=0x00; EMCUCR содержит SM0. В протеусе работает, в железе - нет. МК просто не засыпает, хотя сигналов на INT0 точно нет (там прерывание по нарастанию). Изменено 13 июля, 2009 пользователем Dimon007 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Геннадий Опубликовано 14 июля, 2009 Поделиться Опубликовано 14 июля, 2009 (изменено) А разве EMCUCR у 8515 существует? По моим данным он присутствует только у ATmega161x. А вот еще вопрос. Сторожевой таймер у тебя задействован? Нет ли сброса от него или аппаратного (вывод Reset подтянут к + Uпит.?) или от схемы BOD (уровень питания в норме?). И обрати внимание на то, что при изменении значения MCUCR (зачем только ты с ним "играешься" в цикле) с 0Х03 на 0Х30 ты выставляешь генерацию внешнего прерывания ПО НИЗКОМУ уровню на входе (а не по фронту), для генерации по фронту надо прописывать 0Х33. Изменено 14 июля, 2009 пользователем Геннадий 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Dimon007 Опубликовано 14 июля, 2009 Автор Поделиться Опубликовано 14 июля, 2009 (изменено) EMCUCR существует) Сторожевой таймер отключён. Питание стабильное, ресет тоже (подтянут к + через 6,8 Ком). Скорей всего проблема в MCUCR`е, но если поставить 0x33 (тут я конечно ошибся, спасибо), то МК засыпает, но не просыпается уже. А играюсь я с ним потому что где-то читал, что лучше в 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. Изменено 14 июля, 2009 пользователем Dimon007 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Dimon007 Опубликовано 14 июля, 2009 Автор Поделиться Опубликовано 14 июля, 2009 Да, проблема в типе прерывания, если поставить на INT1 low level, то прекрасно просыпается, правда пока что в протеусе тестировал)) 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Геннадий Опубликовано 16 июля, 2009 Поделиться Опубликовано 16 июля, 2009 (изменено) Обнаружение фронтов на выводах INT осуществляется СИНХРОННО, а выход из режима Power Down осуществляется только по внешним прерываниям обнаруживаемым АСИНХРОННОГО, т.к. все тактовые сигналы отключаются и все синхронные модули не работают (только асинхронные остаются). Поэтому, по фронту камень не проснется, т.к. не будет сгенерировано прерывание! Остается только генерировать прерывание ПО НИЗКОМУ уровню, подвесить(подпереть) выводы INT к плюсу питания через резисторы, установить на выходе подключаемого устр-ва к входу INT (если таковое имеется) лог. 1 в режиме ожидания (спокойствия или по-умолчанию). И генерировать лог. 0 не меннее 2-х тактов сторожевого таймера или >2 мкс. Насчет SE, есть такая рекомендация... Только что такое "непреднамеренное переключение" непонятно. Если следовать рекомендации, то и меняй только флаг SE, не трогая биты конфигурации (SMx). Изменено 16 июля, 2009 пользователем Геннадий 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Dimon007 Опубликовано 18 июля, 2009 Автор Поделиться Опубликовано 18 июля, 2009 Только вот проблема в том, что в данном устройстве очень удобно использовать прерывание по возрастающему уровню. Собственно, устройство спидометр для велосипеда. Как датчик - геркон на вилке + магнит на колесе. Использовать прерывание по низкому уровню здесь неудобно. Учитывая время прохождения магнита мимо геркона прерываний будет много генерироваться, а если колесо остановится так, что магнит будет на уровне геркона, то вообще МК сходит с ума) Как выход для пробуждения можно сделать отдельную кнопку, но всё же хотелось, чтобы всё происходило автоматически. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Геннадий Опубликовано 18 июля, 2009 Поделиться Опубликовано 18 июля, 2009 Вся бяка в том, что за время импульса (при единственном возможном варианте выхода из Power Down - генерации прерывания ПРИ НИЗКОМ уровне на входе INT) происходит многократная генерация прерывания (за один импульс). В таком варианте и счетчик переполнится, и МК заснет и проснется. На твой взгляд это и выглядит как "незасыпание" вообще. Тут надо схемотехникой брать. На вход ставить D-триггер. Приходящий импульс будет его опрокидывать по фронту, а в прерывании одной линией порта этот триггер возвращать обратно. Получится одноразовое срабатывание при любой длительности импульса. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Dimon007 Опубликовано 19 июля, 2009 Автор Поделиться Опубликовано 19 июля, 2009 Спасибо за идею, буду реализовывать) 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
acorn Опубликовано 20 июля, 2009 Поделиться Опубликовано 20 июля, 2009 Тут надо схемотехникой брать. На вход ставить D-триггер. Приходящий импульс будет его опрокидывать по фронту, а в прерывании одной линией порта этот триггер возвращать обратно. Получится одноразовое срабатывание при любой длительности импульса. Можно программно. Отключить это прерывание по первому возникновению, потом (в основном цикле) по таймауту разрешить. И от дребезга защита будет. Или использовать другой режим слипа на некоторое время, а потом переключаться на пауэрдаун, и выходить в две стадии, соответственно. Есть и еще варианты, и аппаратный триггер лучшим решением не выглядит. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Геннадий Опубликовано 21 июля, 2009 Поделиться Опубликовано 21 июля, 2009 D-триггер не претендует на гениальную идею. Это один из вариантов решения данной проблемы. Можно и одновибратор поставить, и простую дифференцирующую RC-цепь, подобрав номиналы. D-триггер просто позволяет организовать стабильный узел, не зависящий от внешних факторов. Программно решить вопрос сна и пробуждения в момент установки магнита напротив датчика (при стоянке) вряд ли удастся, т.к. все пробуждения по INT происходят асинхронно в большинстве режимов сна (а возможно и во всех). Да и возможность управлять аппаратным пробуждением, так кам нам иногда хочется, разработчики AVR нам не оставили. Поэтому камешек не уснет, а точнее будет "тренироваться подъем-отбой!!!", как в армии , пока магнит не съедет с датчика и на входе INT не появится лог.1. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.