Обсуждаем контроллеры компании Atmel.
Ответить

Re: ATtiny24 не стартует WDT...

Чт дек 20, 2012 08:32:49

странно.
для начала уберите все манипуляции с yellow в основном цикле.
если не поможет - возьмите мой код, который работает, перенесите в codevision и постепенно добавляйте свою функциональность. так найдете то, что ломает работоспособность. обратите внимание на то, что у меня 0.5 Гц прерывания WD, а у Вас 15.6 Гц.

Re: ATtiny24 не стартует WDT...

Чт дек 20, 2012 22:08:34

a_skr писал(а):для начала уберите все манипуляции с yellow в основном цикле.
Извиняюсь, это я, наверное, от пережитого. Голова почти "не варит".
a_skr писал(а):возьмите мой код, который работает, перенесите в codevision
Ваш код не компилируется в Code Vision, поскольку она "не знает", что такое WDIE, WDP1, WDP2... В её "хидерах" не прописаны названия битов почти всех регистров, за очень редкими исключениями.
a_skr писал(а):обратите внимание на то, что у меня 0.5 Гц прерывания WD, а у Вас 15.6 Гц.
Именно что-то в районе 15Гц я и планировал, как самую "удобную" частоту опроса состояния портов. К стати, если вам интересно, прикладываю схемку "супердевайса".
Вложения
DL.gif
(32.42 KiB) Скачиваний: 779

Re: ATtiny24 не стартует WDT...

Чт дек 20, 2012 23:07:19

Абсолютный аналог вашего кода в CVAVR. Начинают терзать смутные сомнения по поводу возможности включения этого таймера в CVAVR как таковой. В какой среде компилируете вы?
Вложения
123.ZIP
(24.29 KiB) Скачиваний: 232

Re: ATtiny24 не стартует WDT...

Пт дек 21, 2012 00:45:27

посмотрите в настройках проекта должна быть галка "include IO definitions" или нечто подобное для того, чтобы эти имена корректно обрабатывались в CVAVR.

Re: ATtiny24 не стартует WDT...

Пт дек 21, 2012 08:29:34

ELcat писал(а):Абсолютный аналог вашего кода в CVAVR. Начинают терзать смутные сомнения по поводу возможности включения этого таймера в CVAVR как таковой. В какой среде компилируете вы?
ну аналог не совсем абсолютный, у меня вместо 0x42 пишется 0x46 (1 сек) ;) , но это не принципиально. еще CV в начале программы запрещает WD, но это не должно влиять. компилирую в WinAVR. сегодня будет возможность поиграться с tiny13, попробую WinAVR и CV - отпишусь.

Re: ATtiny24 не стартует WDT...

Пт дек 21, 2012 10:12:33

a_skr, хорошо.

vitalik_1984 писал(а):...в настройках проекта должна быть галка "include IO definitions" или нечто подобное...
Ничего подобного не нашёл. CVAVR версии 1.25.5. Но описание битов не относится ни к проекту, ни к версии среды. Оно должно задаваться в "хидерах" конкретных МК, например, в tiny24.h, tiny13.h, mega8.h и т.п. из папки ...\cvavr\inc\*.*

Re: ATtiny24 не стартует WDT...

Пт дек 21, 2012 11:37:41

у меня 2.05.0 все биты есть в хэдэрах. галочка Project->Configure->C Compiler внизу

Re: ATtiny24 не стартует WDT...

Пт дек 21, 2012 13:43:40

a_skr писал(а):у меня 2.05.0 все биты есть в хэдэрах. галочка Project->Configure->C Compiler внизу
CV.png
(59.02 KiB) Скачиваний: 434
tiny24.h
(2.11 KiB) Скачиваний: 575
:dont_know:

Re: ATtiny24 не стартует WDT...

Пт дек 21, 2012 15:07:42

поставьте версию по-новее, у Вас 2005 года, у меня 2009:

tiny24_bits.h:
...
/* ***** WATCHDOG ********************* */
/* WDTCSR - Watchdog Timer Control Register */
#define WDP0 0 // Watch Dog Timer Prescaler bit 0
#define WDP1 1 // Watch Dog Timer Prescaler bit 1
#define WDP2 2 // Watch Dog Timer Prescaler bit 2
#define WDE 3 // Watch Dog Enable
#define WDCE 4 // Watchdog Change Enable
#define WDP3 5 // Watchdog Timer Prescaler Bit 3
#define WDIE 6 // Watchdog Timeout Interrupt Enable
#define WDIF 7 // Watchdog Timeout Interrupt Flag
...

tiny24.h:
...
#ifdef _IO_BITS_DEFINITIONS_
#include <tiny24_bits.h>
#endif
...

попробовал на tiny13 - действительно. светодиод не мигает при компиляции в CV :shock:
через WinAVR все работает. сижу разбираюсь, даже интересно стало.

Re: ATtiny24 не стартует WDT...

Пт дек 21, 2012 16:04:02

нашел причину.
CodeVisionAVR в функциях задержки (delay_ms и т.д.) всегда сбрасывает WD командой wdr, независимо от того, стоит ли в настройках проекта использование WD или нет. вот такие пироги. так что, если нужны прерывания от WD - или не используйте задержки, или...

Re: ATtiny24 не стартует WDT...

Пт дек 21, 2012 16:37:12

:shock: Вот это дааа! Delay использовался вообще-то как временная "заглушка". Но чтоб вот такие тщательно припрятанные "грабли" - не ожидал. Вы мне очень помогли. Благодарю.

Закомментировал delay_ и действительно пошли прерывания от WD!

Re: ATtiny24 не стартует WDT...

Пн дек 24, 2012 08:07:31

ELcat, сэкономлю Вам 4 байта кода ;) : строчка WDTCSR = 0x18; (WDCE и WDE) не нужна, если WD используется только для генерации прерываний. для включения прерываний достаточно установить WDIE и задать частоту с помощью WDPx одной записью в управляющий регистр. ну и про глобальное разрешение прерываний не забыть. проверено на tiny13.

Re: ATtiny24 не стартует WDT...

Пн дек 24, 2012 23:41:52

Спасибо. Я это в даташите находил. Мне, в принципе, удобнее прерывание и затем сброс. Сейчас воюю с АЦП - почему-то считывается какой-то шум вместо кодов предполагаемой величины.

Watchdog в Watchdog-е

Пт апр 12, 2013 17:19:46

Всем привет!!! Все необходимые для нашей системы функции управления мы реализовали в Watchdog-е,осталось позаботиться только о самом МК!! Решили написать код по перезагрузке МК в случае чего!! Хотел узнать у Вас, как проверить правильность работы кода? я к тому, что сброса таймера внутреннего Ватчдога я не делаю, но Ватчдог обрабатывает все команды, хотя по сути должен непрерывно перезагружаться!!

Камень - Atmega8a
Вот мой код (WDTON fuse стоит с галочкой в uniprof-е):

void WDT_Init(void)
{
//disable interrupts
cli();
//reset watchdog
wdt_reset();
//set up WDT interrupt
WDTCR = (1<<WDCE)|(1<<WDE);
//Start watchdog timer with 2.2s prescaler
WDTCR = (1<<WDE)|(1<<WDP2)|(1<<WDP1)|(1<<WDP0);
//Enable global interrupts
sei();
}

правильно я понимаю, что Ватчдог , сидящий внутри, должен ребутать МК каждые 2 секунды? и почему не ребутает тогда? или ребутает все же, просто быстро очень все делает и потому запросы обрабатываются ? Помогите разобраться плиз с этим неведомым зверьком)) Самое главное, проверить как, чтобы просто успокоиться, что все готово!)

wdt_reset() у меня уже понапихан во все возможные места кода ( пока закомментирован ).

Re: Watchdog в Watchdog-е

Пт апр 12, 2013 20:57:08

А почему бы не воспользоваться
wdt_enable(WDTO_2S);
вместо записи в WDTCR регистр?

Вроде твой код должен работать, но только если оптимизация включена,
и ты успеваешь как написанно в документации за 4 цикла сделать запись.

Re: Watchdog в Watchdog-е

Пн апр 15, 2013 09:31:05

wdt_enable() - все что надо для инициализации??

для сброса - wdt_reset() ?????

и какие значения может принимать параметр внутри wdt_enable() ?я так понимаю , это время до перезапуска платы? просо по документации я ставлю максимальное значение , и оно равно 2.1 s...

Re: Watchdog в Watchdog-е

Пн апр 15, 2013 11:30:06

Steve_g писал(а):я так понимаю , это время до перезапуска платы?
это время до возникновения события таймера, в случае, если в течение этого времени не было сброса таймера командой wdt_reset()
какое конкретно действие выполнится при возниковении события - решать Вам. можете работать в прерывании, можете сразу сбрасывать, можете прерваться и после этого сбросить (список зависит от типа микроконтроллера).

Re: Watchdog в Watchdog-е

Пн апр 15, 2013 11:39:20

Спасибо, мне желательно, чтобы плата перезагружалась по переполнению!! Это стандартное поведение в случае, Ели за время прескайла не было команды wdt_reset()??

Re: Watchdog в Watchdog-е

Пн апр 15, 2013 11:51:11

перечитал Ваш пост, ознакомился с главой Watchdog timer из даташита на ATMega8A : в Вашем коде все верно. Достаточно вызвать эту функцию в начале программы (не в цикле), после этого все должно сброситься через 2 секунды. Если не получается, попробуйте уменьшить время. Подробнее про время в даташит ATMega8A - таблица 10-1, page 44 :) good luck!

Re: Watchdog в Watchdog-е

Пн апр 15, 2013 14:47:22

Steve_g писал(а):wdt_enable() - все что надо для инициализации??
для сброса - wdt_reset() ?????


Загляни в h файл, в котором объявлены функции wdt_enable, wdt_reset. Там тебе будет и описание, что функции делают и константы которые можно туда ставить.
Ответить