Здраствуйте Извините за глупый и простой вопрос (ибо начинающий), но всё же... Необходимо реализовать вот что: по прерыванию WDT проверять состояние PIN'а, если он =0 -> sleep_enable();powerdown(); Иначе ->выполнять некоторые действия. Но при этом не делать Reset МК CVAVR выдаёт шаблон (wdt: 1024k)
Код:
#include<tiny13.h> interrupt [WDT] voidwdt_timeout_isr(void) { WDTCR|=0x40; // Place your code here ...... } voidmain(void) { ..... #pragma optsize- WDTCR=0x39; WDTCR=0x69; #ifdef _OPTIMIZE_SIZE_ #pragma optsize+ #endif
#asm("sei") while (1){}; }
Почитал, что CVAVR выдает в шаблоне WDE=1 и WDIE=1 что приводит к reset'у. Соответственно WDTCR надо бы сделать равным 0b0110001. Прочитал
Цитата:
при смене делителя нужно сбрасывать бит WDCE (бит 4), по сему и инициализация WDTCSR производится в две строки.
. Здесь не понял. То что в две строчки - видно из шаблона, но что и в какую строку...?
И еще. В обработчике прерывания присутствует WDTCR|=0x40;. Для чего и надо ли её править для моей задачи.
И будет ли данная программа в Proteus'е симулироваться?
Заголовок сообщения: Re: ATtiny13,WatchDog, прерывания без reset'а МК. CVAVR,Prot
Добавлено: Ср окт 27, 2010 22:16:14
Прорезались зубы
Зарегистрирован: Вт сен 30, 2008 09:23:14 Сообщений: 209 Откуда: Краснодарский край
Рейтинг сообщения:0
Ничего не выйдет! А если выйдет - это не правильное решение. К чему такие извратства? Если прерывание ДОГа случилось то ресет обязательно последует за ним. Опишите точнее поставленную задачу. Хотите будить МК по внешнему сигналу, или что?
axiv, мыслишь верно. Смотри стр41-43 даташита, там все есть.
Цитата:
• Bit 4 - WDCE: Watchdog Change Enable This bit is used in timed sequences for changing WDE and prescaler bits. To clear the WDE bit, and/or change the prescaler bits, WDCE must be set. Once written to one, hardware will clear WDCE after four clock cycles.
тебе нужно сбросить бит WDE, ну и прескалер настроить.
Код:
#define WDP_mask 0b110 //прескалер настраиваем например, на 1с (табл. 8-2) . . . WDTCR=(1<<WDTIE|1<<WDCE|WDP_mask); //инициализаця вотчдога
по идее должно работать. Если все-таки надо в две строки, (хз зачем, может какая заморочка есть), тогда так:
И обрати внимание на фьюз WDTON (табл. 8-1) - он должен быть незапрограммирован
Цитата:
Note: 1. WDTON fuse set to “0“ means programmed and “1“ means unprogrammed.
AndyWorld писал(а):
...Если прерывание ДОГа случилось то ресет обязательно последует за ним...
Не болтайте ерундой. В аврках вотчдог во многих случаях можно использовать вместо нормального таймера, освободив последний для более важных забот. Сбрасывать или не сбрасывать МК по вотчдогу - настраивается фьюзом WDTON и регистром WDTCR. Об том собственно и речь.
axiv писал(а):
И еще. В обработчике прерывания присутствует WDTCR|=0x40;. Для чего и надо ли её править для моей задачи.
Опять же - читаем даташит. Строчка
Код:
WDTCR|=0x40;
значит "сделать поразрядное ИЛИ регистра WDTCR со значением 0x40" То бишь - просто установить 6-й бит. Это надо, чтобы заново установить WDTIE (разрешить прерывания от вотчдога) который (бит, в смысле) аппаратно сбрасывается после перехода в обработчик.
Последний раз редактировалось stas00n Чт окт 28, 2010 00:50:35, всего редактировалось 1 раз.
при смене делителя нужно сбрасывать бит WDCE (бит 4), по сему и инициализация WDTCSR производится в две строки.
Где такое написано? Вообще-то этот бит надо как раз таки устанавливать для обновления прескалера и WDE, а сбрасывается он аппаратно, то бишь самостоятельно, спустя 4 такта...
Бит надо ставить для включения/выключения, а делитель меняется и так. "WDTCR|=0x40;" как защита от зависания. Без этой строчки второе прерывание вызовет сброс. Вообще контроллер усыпляется одной ассемблерной командой sleep. Для этого однажды в программе выставляется MCUCR=48 для power down, а потом в тесте #asm("sleep"). Только учтите, что усыплять контроллер в прерывании НЕЛЬЗЯ! В этом случае он не проснётся никогда. Выставляется какой-либо флаг, который проверяется в основной программе, где уже и усыпляется. Да, чуть не забыл: протеус скорее всего будет врать безбожно про собаку, а особенно про power down, так что не удивляйтесь если что.
Всем спасибо, разобрался методом проб и ошибок. Сторожевой пес работает отлично. Использовать его решил чтобы пробуждать МК, ибо прерываниями на INT0 пробуждается он при low-level, а брать его было не откуда, у меня на INT0 только 1 приходит. Мутить инвертирование не было смысла ибо Мк надо было запихнуть в тесное место. Proteus-таки и с powerdown отработал отлично, как ни странно. С "WDTCR|=0x40;" в прерывании чегой-то не захотело работать, пришлось в конце обработчика вставлять #asm("wdr"); (может оно тоже самое делает, не знаю пока).
WDR сбрасывает счётчик собачки в ноль, а та команда разрешает прерывание вместо сброса. Скорее всего МК у вас не просыпается, а сбрасывается и тем самым выходит из сна.
надо чтоб по пррыванию собаки запускался АЦП, но прерывание не происходит, а сразуже резет. Сброс тоже нужен. Т0 использовать не могу, так как он задействован для других целей. симулировал в AVR Studio 4
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения