ATtiny13,WatchDog, прерывания без reset'а МК. CVAVR,Proteus

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
axiv
Родился
Сообщения: 11
Зарегистрирован: Ср окт 27, 2010 13:47:56

ATtiny13,WatchDog, прерывания без reset'а МК. CVAVR,Proteus

Сообщение 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'е симулироваться?

Заранее благодарю.
Аватара пользователя
AndyWorld
Прорезались зубы
Сообщения: 209
Зарегистрирован: Вт сен 30, 2008 09:23:14
Откуда: Краснодарский край

Re: ATtiny13,WatchDog, прерывания без reset'а МК. CVAVR,Prot

Сообщение AndyWorld »

Ничего не выйдет! А если выйдет - это не правильное решение. К чему такие извратства? Если прерывание ДОГа случилось то ресет обязательно последует за ним. Опишите точнее поставленную задачу. Хотите будить МК по внешнему сигналу, или что?
stas00n
Вымогатель припоя
Сообщения: 557
Зарегистрирован: Пн мар 23, 2009 04:03:45

Re: ATtiny13,WatchDog, прерывания без reset'а МК. CVAVR,Prot

Сообщение 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;
значит "сделать поразрядное ИЛИ регистра WDTCR со значением 0x40" То бишь - просто установить 6-й бит. Это надо, чтобы заново установить WDTIE (разрешить прерывания от вотчдога) который (бит, в смысле) аппаратно сбрасывается после перехода в обработчик.
Последний раз редактировалось stas00n Чт окт 28, 2010 00:50:35, всего редактировалось 1 раз.
stas00n
Вымогатель припоя
Сообщения: 557
Зарегистрирован: Пн мар 23, 2009 04:03:45

Re: ATtiny13,WatchDog, прерывания без reset'а МК. CVAVR,Prot

Сообщение stas00n »

axiv писал(а):Прочитал
при смене делителя нужно сбрасывать бит WDCE (бит 4), по сему и инициализация WDTCSR производится в две строки.

Где такое написано? Вообще-то этот бит надо как раз таки устанавливать для обновления прескалера и WDE, а сбрасывается он аппаратно, то бишь самостоятельно, спустя 4 такта...
Аватара пользователя
>TEHb<
Друг Кота
Сообщения: 5728
Зарегистрирован: Ср ноя 11, 2009 17:19:30
Откуда: Воронеж
Контактная информация:

Re: ATtiny13,WatchDog, прерывания без reset'а МК. CVAVR,Prot

Сообщение >TEHb< »

Бит надо ставить для включения/выключения, а делитель меняется и так.
"WDTCR|=0x40;" как защита от зависания. Без этой строчки второе прерывание вызовет сброс.
Вообще контроллер усыпляется одной ассемблерной командой sleep. Для этого однажды в программе выставляется MCUCR=48 для power down, а потом в тесте #asm("sleep"). Только учтите, что усыплять контроллер в прерывании НЕЛЬЗЯ! В этом случае он не проснётся никогда. Выставляется какой-либо флаг, который проверяется в основной программе, где уже и усыпляется.
Да, чуть не забыл: протеус скорее всего будет врать безбожно про собаку, а особенно про power down, так что не удивляйтесь если что.
"Привет!" - соврал он.
axiv
Родился
Сообщения: 11
Зарегистрирован: Ср окт 27, 2010 13:47:56

Re: ATtiny13,WatchDog, прерывания без reset'а МК. CVAVR,Prot

Сообщение axiv »

Всем спасибо, разобрался методом проб и ошибок.
Сторожевой пес работает отлично. Использовать его решил чтобы пробуждать МК, ибо прерываниями на INT0 пробуждается он при low-level, а брать его было не откуда, у меня на INT0 только 1 приходит. Мутить инвертирование не было смысла ибо Мк надо было запихнуть в тесное место.
Proteus-таки и с powerdown отработал отлично, как ни странно.
С "WDTCR|=0x40;" в прерывании чегой-то не захотело работать, пришлось в конце обработчика вставлять #asm("wdr"); (может оно тоже самое делает, не знаю пока).
Аватара пользователя
>TEHb<
Друг Кота
Сообщения: 5728
Зарегистрирован: Ср ноя 11, 2009 17:19:30
Откуда: Воронеж
Контактная информация:

Re: ATtiny13,WatchDog, прерывания без reset'а МК. CVAVR,Prot

Сообщение >TEHb< »

WDR сбрасывает счётчик собачки в ноль, а та команда разрешает прерывание вместо сброса. Скорее всего МК у вас не просыпается, а сбрасывается и тем самым выходит из сна.
"Привет!" - соврал он.
Аватара пользователя
слушатель
Первый раз сказал Мяу!
Сообщения: 26
Зарегистрирован: Пт ноя 05, 2010 11:12:51
Контактная информация:

Re: ATtiny13,WatchDog, прерывания без reset'а МК. CVAVR,Prot

Сообщение слушатель »

У меня похожая ситуация

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
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»