Форум РадиоКот https://radiokot.ru/forum/ |
|
ATtiny13,WatchDog, прерывания без reset'а МК. CVAVR,Proteus https://radiokot.ru/forum/viewtopic.php?f=20&t=36814 |
Страница 1 из 1 |
Автор: | axiv [ Ср окт 27, 2010 14:02:01 ] |
Заголовок сообщения: | ATtiny13,WatchDog, прерывания без reset'а МК. CVAVR,Proteus |
Здраствуйте Извините за глупый и простой вопрос (ибо начинающий), но всё же... Необходимо реализовать вот что: по прерыванию 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 [ Ср окт 27, 2010 22:16:14 ] |
Заголовок сообщения: | Re: ATtiny13,WatchDog, прерывания без reset'а МК. CVAVR,Prot |
Ничего не выйдет! А если выйдет - это не правильное решение. К чему такие извратства? Если прерывание ДОГа случилось то ресет обязательно последует за ним. Опишите точнее поставленную задачу. Хотите будить МК по внешнему сигналу, или что? |
Автор: | stas00n [ Чт окт 28, 2010 00:32:45 ] |
Заголовок сообщения: | Re: ATtiny13,WatchDog, прерывания без reset'а МК. CVAVR,Prot |
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:49:01 ] |
Заголовок сообщения: | Re: ATtiny13,WatchDog, прерывания без reset'а МК. CVAVR,Prot |
axiv писал(а): Прочитал Цитата: при смене делителя нужно сбрасывать бит WDCE (бит 4), по сему и инициализация WDTCSR производится в две строки. Где такое написано? Вообще-то этот бит надо как раз таки устанавливать для обновления прескалера и WDE, а сбрасывается он аппаратно, то бишь самостоятельно, спустя 4 такта... |
Автор: | >TEHb< [ Чт окт 28, 2010 13:15:34 ] |
Заголовок сообщения: | Re: ATtiny13,WatchDog, прерывания без reset'а МК. CVAVR,Prot |
Бит надо ставить для включения/выключения, а делитель меняется и так. "WDTCR|=0x40;" как защита от зависания. Без этой строчки второе прерывание вызовет сброс. Вообще контроллер усыпляется одной ассемблерной командой sleep. Для этого однажды в программе выставляется MCUCR=48 для power down, а потом в тесте #asm("sleep"). Только учтите, что усыплять контроллер в прерывании НЕЛЬЗЯ! В этом случае он не проснётся никогда. Выставляется какой-либо флаг, который проверяется в основной программе, где уже и усыпляется. Да, чуть не забыл: протеус скорее всего будет врать безбожно про собаку, а особенно про power down, так что не удивляйтесь если что. |
Автор: | axiv [ Чт окт 28, 2010 16:07:24 ] |
Заголовок сообщения: | Re: ATtiny13,WatchDog, прерывания без reset'а МК. CVAVR,Prot |
Всем спасибо, разобрался методом проб и ошибок. Сторожевой пес работает отлично. Использовать его решил чтобы пробуждать МК, ибо прерываниями на INT0 пробуждается он при low-level, а брать его было не откуда, у меня на INT0 только 1 приходит. Мутить инвертирование не было смысла ибо Мк надо было запихнуть в тесное место. Proteus-таки и с powerdown отработал отлично, как ни странно. С "WDTCR|=0x40;" в прерывании чегой-то не захотело работать, пришлось в конце обработчика вставлять #asm("wdr"); (может оно тоже самое делает, не знаю пока). |
Автор: | >TEHb< [ Пт окт 29, 2010 09:48:35 ] |
Заголовок сообщения: | Re: ATtiny13,WatchDog, прерывания без reset'а МК. CVAVR,Prot |
WDR сбрасывает счётчик собачки в ноль, а та команда разрешает прерывание вместо сброса. Скорее всего МК у вас не просыпается, а сбрасывается и тем самым выходит из сна. |
Автор: | слушатель [ Ср дек 29, 2010 21:26:18 ] |
Заголовок сообщения: | 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 |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |