Hello, All ! AVR. До сих пор использовал собаку по назначению, чтобы тявкнула в случае засыпания, пиная ее время от времени wdr - ом. Все устройства были сетевые, и вопрос экономии не возникал. Сейчас нужно усыплять дивайс, будя его периодически собакой. Но, с одной стороны, разбуженный проц идет вроде бы на следующую команду после sllep, с другой стороны, по WDT выдается прерывание на вектор, общий с ресетным. Биты причины в MCUSR какие-то странные - чтобы использовать POPF,EXTF "должны быть установлены в программе рано, как только возможно. Проверка POPF,EXTF исполнена перед тем, как биты установлены. Если биты установлены перед тем, как произошел внешний или WDT ресет, источник прерываний может быть определен по следующей таблице ..." (Перевод мой по AТ90S8535). Ничего не понимаю, видно, кто-то из нас дурак. Получив прерывание по ресету, сразу бегу анализировать биты - от чего ресет. Но при включении питания эти биты не определены, я их сам должен выставить "as early as pоssible" Т.е. "пан атаман, ваш приказ выполнен еще до приказа". Ну да бог с ним. Я проанализирую пару ячеек памяти, по включении там случайное число, а затем я задвину туда чего-нибудь определенное. И прервавшись по собаке, по этим битам и определю - да, это не power on, а WDR reset. Но по включении питания я сразу инициализирую стек, порты, а по WDT этого не надо, видимо - rjmp на инструкцию, следующую за sleep ? Странно это как-то. В аппликухах ничего не нашел, симулятор на sleep вообще нуль внимания ( по крайней мере, 3.53)
WDT - щас идиотский вопрос задам (AVR)
Jul 22, 2004
5 Replies
EG> И прервавшись по собаке, по этим битам и определю - да, это не power ^^^^^^^^^^^^^ EG> on, а WDR reset.
Да перегрелся, видимо - "по этим байтам" WBR Eugene
Привет Eugene!
22 Jul 04 17:48, Eugene Gavruk писал All:EG> AVR. EG> До сих пор использовал собаку по назначению, чтобы тявкнула EG> в случае засыпания, пиная ее время от времени wdr - ом. EG> Все устройства были сетевые, и вопрос экономии не возникал. EG> Сейчас нужно усыплять дивайс, будя его периодически EG> собакой. Hо, с одной стороны, разбуженный проц идет вроде EG> бы на следующую команду после sllep, с другой стороны, по EG> WDT выдается прерывание на вектор, общий с ресетным.
Hет. Разбуженный процессор передает управление на вектор разбудившего его исключения. Если это был reset (не важно, внешний или от wdt), то управление передается на вектор сброса.
EG> Hо по включении питания я сразу инициализирую стек, EG> порты, а по WDT этого не надо,
Как так? "All user programs must initialize the SP in the reset routine..."
- это из даташита на 90S8515. В 90S8535 не так? Порты, конечно, можно не инициализировать, если они работают на ввод (reset устанавливает им режим ввода), но тогда и при power up их не обязательно инициализировать...
EG> видимо - rjmp на инструкцию, следующую EG> за sleep ?
? Возврат к инструкции, следующей за sleep, выполняется если avr разбужен прерыванием после завершения обработчика этого прерывания. Если его разбудил reset ты волен передать управление куда захочешь, в том числе и на следующую за sleep команду. Все зависит от решаемой задачи...
Я уже давно с avr плотно не работал, поэтому мог ошибиться, но помню именно так.
Всего наилучшего, [Team PCAD 2000] Алексей М. ... Дареному письму в клуджи не смотрят.
Hello,Alex! AM> Hет. Разбуженный процессор передает управление на вектор разбудившего его AM> исключения. Если это был reset (не важно, внешний или от wdt), то управление AM> передается на вектор сброса.
Я так и считал. Счас попробую, за выходные.
EG>> Hо по включении питания я сразу инициализирую стек, EG>> порты, а по WDT этого не надо,
AM> Как так? "All user programs must initialize the SP in the reset routine..." AM> - это из даташита на 90S8515. В 90S8535 не так ?
Все так и у 35-го. Но по слипу питание не сбрасывалось, стек по идее должен стоять там, где его поставили, и порты тоже. Да и программные инициализацонные процедуры ( чистка массивов, флагов и пр. ) по собаке тоже делать не надо - там уже храниться рабочая инфа. AM> инициализировать, если они работают на ввод (reset устанавливает им режим AM> ввода), но тогда и при power up их не обязательно инициализировать...
Да нет же, конечно, которые на ввод, которые на вывод. Но слип, я думаю, эти регистры портов не сбрасывает.
EG>> видимо - rjmp на инструкцию, следующую EG>> за sleep ?
AM> ? Возврат к инструкции, следующей за sleep, выполняется если avr разбужен AM> прерыванием после завершения обработчика этого прерывания. Если его разбудил AM> reset ты волен передать управление куда захочешь, в том числе и на следующую за AM> sleep команду. Все зависит от решаемой задачи...
Я так и думаю, но сомневаюсь :-) По 0-му вектору вместо rjmp START поставлю анализ признака, и когда убедюсь, что по WDT, то не rjmp START, а rjmp <addr_sleep>+1
Если не отзовусь после выходных, то погиб в борьбе со sleep'ом ! WBR Eugene
Привет Eugene!
23 Jul 04 16:06, Eugene Gavruk писал Alex Mogilnikov:AM>> Как так? "All user programs must initialize the SP in the reset EG> routine..." AM>> - это из даташита на 90S8515. В 90S8535 не так ?
EG> Все так и у 35-го. Hо по слипу питание не сбрасывалось, стек по идее EG> должен стоять там, где его поставили, и порты тоже.
Hет, не должны. Цитата из того же даташита: "During reset (заметь, _reset_, а не power up!), all I/O registers are set to their initial values...". Поэтому не смотря на то, что питание не падало, сброс устанавливает в SP значение 0. Поскольку регистры управления портами тоже являются I/O регистрами, то же самое справедливо и для них.
EG> Да и EG> программные инициализацонные процедуры ( чистка массивов, флагов EG> и пр. ) по собаке тоже делать не надо - там уже храниться рабочая EG> инфа.
А вот это правда - содержимое ОЗУ при сбросе сохраняется.
EG> Да нет же, конечно, которые на ввод, которые на вывод. Hо слип, EG> я думаю, эти регистры портов не сбрасывает.
Их сбрасывает не команда sleep, конечно. Их сбрасывает reset, которым ты пробуждаешь процессор от спячки. В течение всей спячки порты будут находиться в том режиме, который им установили.
EG> Если не отзовусь после выходных, то погиб в борьбе со sleep'ом ! EG> WBR Eugene
Hу ты это, лучше отзывайся. :)
Всего наилучшего, [Team PCAD 2000] Алексей М. ... Искать смысл - бессмысленно...
Привет Alex!
25 Jul 04 15:20, Alex Mogilnikov писал Eugene Gavruk:EG>> Да и EG>> программные инициализацонные процедуры ( чистка массивов, флагов EG>> и пр. ) по собаке тоже делать не надо - там уже храниться рабочая EG>> инфа.
AM> А вот это правда - содержимое ОЗУ при сбросе сохраняется.
Вдогонку по поводу сохранения содержимого: если ты собираешься различать power up и wdt reset по содержимому нескольких байтов ОЗУ, всегда есть опасность принять первый случай за второй - легко может случиться, что при кратковременном проседании питания часть важных данных испортится, а твои проверочные байты останутся неискаженными. Так что советую использовать более честный способ.
Всего наилучшего, [Team PCAD 2000] Алексей М. ... Западно-уральское региональное общество добровольных учредителей.
Join the Discussion
Have something to add? Share your thoughts — no account required.
Didn't find your answer?
Ask the community — no account required