Страница 1 из 1
ATtiny13,WatchDog, прерывания без reset'а МК. CVAVR,Proteus
Добавлено: Ср окт 27, 2010 14:02:01
axiv
Здраствуйте
Извините за глупый и простой вопрос (ибо начинающий), но всё же...
Необходимо реализовать вот что: по прерыванию WDT проверять состояние PIN'а, если он =0 -> sleep_enable();powerdown(); Иначе ->выполнять некоторые действия.
Но при этом не делать Reset МКCVAVR выдаёт шаблон (wdt: 1024k)
Код: Выделить всё
#include <tiny13.h>
interrupt [WDT] void wdt_timeout_isr(void)
{
WDTCR|=0x40;
// Place your code here
......
}
void main(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
AndyWorld
Ничего не выйдет! А если выйдет - это не правильное решение. К чему такие извратства? Если прерывание ДОГа случилось то ресет обязательно последует за ним. Опишите точнее поставленную задачу. Хотите будить МК по внешнему сигналу, или что?
Re: ATtiny13,WatchDog, прерывания без reset'а МК. CVAVR,Prot
Добавлено: Чт окт 28, 2010 00:32:45
stas00n
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); //инициализаця вотчдога
по идее должно работать. Если все-таки надо в две строки, (хз зачем, может какая заморочка есть), тогда так:
Код: Выделить всё
WDTCR=(1<<WDTIE|WDP_mask); //инициализаця вотчдога
WDTCR|=(1<<WDCE);
И обрати внимание на фьюз WDTON (табл. 8-1) - он должен быть незапрограммирован
Note: 1. WDTON fuse set to “0“ means programmed and “1“ means unprogrammed.
AndyWorld писал(а):...Если прерывание ДОГа случилось то ресет обязательно последует за ним...
Не болтайте ерундой. В аврках вотчдог во многих случаях можно использовать вместо нормального таймера, освободив последний для более важных забот. Сбрасывать или не сбрасывать МК по вотчдогу - настраивается фьюзом WDTON и регистром WDTCR. Об том собственно и речь.
axiv писал(а):И еще. В обработчике прерывания присутствует WDTCR|=0x40;. Для чего и надо ли её править для моей задачи.
Опять же - читаем даташит. Строчка
значит "сделать поразрядное ИЛИ регистра WDTCR со значением 0x40" То бишь - просто установить 6-й бит. Это надо, чтобы заново установить WDTIE (разрешить прерывания от вотчдога) который (бит, в смысле) аппаратно сбрасывается после перехода в обработчик.
Re: ATtiny13,WatchDog, прерывания без reset'а МК. CVAVR,Prot
Добавлено: Чт окт 28, 2010 00:49:01
stas00n
axiv писал(а):Прочитал
при смене делителя нужно сбрасывать бит WDCE (бит 4), по сему и инициализация WDTCSR производится в две строки.
Где такое написано? Вообще-то этот бит надо как раз таки устанавливать для обновления прескалера и WDE, а сбрасывается он аппаратно, то бишь самостоятельно, спустя 4 такта...
Re: ATtiny13,WatchDog, прерывания без reset'а МК. CVAVR,Prot
Добавлено: Чт окт 28, 2010 13:15:34
>TEHb<
Бит надо ставить для включения/выключения, а делитель меняется и так.
"WDTCR|=0x40;" как защита от зависания. Без этой строчки второе прерывание вызовет сброс.
Вообще контроллер усыпляется одной ассемблерной командой sleep. Для этого однажды в программе выставляется MCUCR=48 для power down, а потом в тесте #asm("sleep"). Только учтите, что усыплять контроллер в прерывании НЕЛЬЗЯ! В этом случае он не проснётся никогда. Выставляется какой-либо флаг, который проверяется в основной программе, где уже и усыпляется.
Да, чуть не забыл: протеус скорее всего будет врать безбожно про собаку, а особенно про power down, так что не удивляйтесь если что.
Re: ATtiny13,WatchDog, прерывания без reset'а МК. CVAVR,Prot
Добавлено: Чт окт 28, 2010 16:07:24
axiv
Всем спасибо, разобрался методом проб и ошибок.
Сторожевой пес работает отлично. Использовать его решил чтобы пробуждать МК, ибо прерываниями на INT0 пробуждается он при low-level, а брать его было не откуда, у меня на INT0 только 1 приходит. Мутить инвертирование не было смысла ибо Мк надо было запихнуть в тесное место.
Proteus-таки и с powerdown отработал отлично, как ни странно.
С "WDTCR|=0x40;" в прерывании чегой-то не захотело работать, пришлось в конце обработчика вставлять #asm("wdr"); (может оно тоже самое делает, не знаю пока).
Re: ATtiny13,WatchDog, прерывания без reset'а МК. CVAVR,Prot
Добавлено: Пт окт 29, 2010 09:48:35
>TEHb<
WDR сбрасывает счётчик собачки в ноль, а та команда разрешает прерывание вместо сброса. Скорее всего МК у вас не просыпается, а сбрасывается и тем самым выходит из сна.
Re: ATtiny13,WatchDog, прерывания без reset'а МК. CVAVR,Prot
Добавлено: Ср дек 29, 2010 21:26:18
слушатель
У меня похожая ситуация
Chip type : ATtiny13
Clock frequency : 4,800000 MHz
...................
// Watchdog timeout interrupt service routine
interrupt [WDT] void wdt_timeout_isr(void){
WDTCR|=0x40;
ADCSRA|=0x40;
}
..................
// Watchdog Timer initialization
// Watchdog Timer Prescaler: OSC/32k
// Watchdog Timer interrupt: On
#pragma optsize-
WDTCR=0x1C;
WDTCR=0x4C;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif
..................
надо чтоб по пррыванию собаки запускался АЦП, но прерывание не происходит, а сразуже резет. Сброс тоже нужен. Т0 использовать не могу,
так как он задействован для других целей. симулировал в AVR Studio 4