странно.
для начала уберите все манипуляции с yellow в основном цикле.
если не поможет - возьмите мой код, который работает, перенесите в codevision и постепенно добавляйте свою функциональность. так найдете то, что ломает работоспособность. обратите внимание на то, что у меня 0.5 Гц прерывания WD, а у Вас 15.6 Гц.
a_skr писал(а):
для начала уберите все манипуляции с yellow в основном цикле.
Извиняюсь, это я, наверное, от пережитого. Голова почти "не варит".
a_skr писал(а):возьмите мой код, который работает, перенесите в codevision
Ваш код не компилируется в Code Vision, поскольку она "не знает", что такое WDIE, WDP1, WDP2... В её "хидерах" не прописаны названия битов почти всех регистров, за очень редкими исключениями.
a_skr писал(а):обратите внимание на то, что у меня 0.5 Гц прерывания WD, а у Вас 15.6 Гц.
Именно что-то в районе 15Гц я и планировал, как самую "удобную" частоту опроса состояния портов. К стати, если вам интересно, прикладываю схемку "супердевайса".
Абсолютный аналог вашего кода в CVAVR. Начинают терзать смутные сомнения по поводу возможности включения этого таймера в CVAVR как таковой. В какой среде компилируете вы?
посмотрите в настройках проекта должна быть галка "include IO definitions" или нечто подобное для того, чтобы эти имена корректно обрабатывались в CVAVR.
ELcat писал(а):Абсолютный аналог вашего кода в CVAVR. Начинают терзать смутные сомнения по поводу возможности включения этого таймера в CVAVR как таковой. В какой среде компилируете вы?
ну аналог не совсем абсолютный, у меня вместо 0x42 пишется 0x46 (1 сек) , но это не принципиально. еще CV в начале программы запрещает WD, но это не должно влиять. компилирую в WinAVR. сегодня будет возможность поиграться с tiny13, попробую WinAVR и CV - отпишусь.
vitalik_1984 писал(а):...в настройках проекта должна быть галка "include IO definitions" или нечто подобное...
Ничего подобного не нашёл. CVAVR версии 1.25.5. Но описание битов не относится ни к проекту, ни к версии среды. Оно должно задаваться в "хидерах" конкретных МК, например, в tiny24.h, tiny13.h, mega8.h и т.п. из папки ...\cvavr\inc\*.*
нашел причину.
CodeVisionAVR в функциях задержки (delay_ms и т.д.) всегда сбрасывает WD командой wdr, независимо от того, стоит ли в настройках проекта использование WD или нет. вот такие пироги. так что, если нужны прерывания от WD - или не используйте задержки, или...
Вот это дааа! Delay использовался вообще-то как временная "заглушка". Но чтоб вот такие тщательно припрятанные "грабли" - не ожидал. Вы мне очень помогли. Благодарю.
Закомментировал delay_ и действительно пошли прерывания от WD!
ELcat, сэкономлю Вам 4 байта кода : строчка WDTCSR = 0x18; (WDCE и WDE) не нужна, если WD используется только для генерации прерываний. для включения прерываний достаточно установить WDIE и задать частоту с помощью WDPx одной записью в управляющий регистр. ну и про глобальное разрешение прерываний не забыть. проверено на tiny13.
Спасибо. Я это в даташите находил. Мне, в принципе, удобнее прерывание и затем сброс. Сейчас воюю с АЦП - почему-то считывается какой-то шум вместо кодов предполагаемой величины.
Всем привет!!! Все необходимые для нашей системы функции управления мы реализовали в 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() у меня уже понапихан во все возможные места кода ( пока закомментирован ).
и какие значения может принимать параметр внутри wdt_enable() ?я так понимаю , это время до перезапуска платы? просо по документации я ставлю максимальное значение , и оно равно 2.1 s...
Steve_g писал(а):я так понимаю , это время до перезапуска платы?
это время до возникновения события таймера, в случае, если в течение этого времени не было сброса таймера командой wdt_reset()
какое конкретно действие выполнится при возниковении события - решать Вам. можете работать в прерывании, можете сразу сбрасывать, можете прерваться и после этого сбросить (список зависит от типа микроконтроллера).
Спасибо, мне желательно, чтобы плата перезагружалась по переполнению!! Это стандартное поведение в случае, Ели за время прескайла не было команды wdt_reset()??
перечитал Ваш пост, ознакомился с главой Watchdog timer из даташита на ATMega8A : в Вашем коде все верно. Достаточно вызвать эту функцию в начале программы (не в цикле), после этого все должно сброситься через 2 секунды. Если не получается, попробуйте уменьшить время. Подробнее про время в даташит ATMega8A - таблица 10-1, page 44 good luck!
Steve_g писал(а):wdt_enable() - все что надо для инициализации??
для сброса - wdt_reset() ?????
Загляни в h файл, в котором объявлены функции wdt_enable, wdt_reset. Там тебе будет и описание, что функции делают и константы которые можно туда ставить.