AndreyVN 0 23 января, 2013 Опубликовано 23 января, 2013 (изменено) · Жалоба В коде программы команд сброса сторожевого таймера нет вообще, инициилизирую WD-таймер, хочу увидеть, как каждые 2 секунды будет моргать экран и инициализироваться меню, однако, после инициализации WD-таймера ничего не происходит. Что я упустил? Процессор Atmega64 Fusebits: WDTON=1 MC103=1 void WatchDogStart() { #asm("wdr") //на всякий случай сбросить сторожевой таймер WDTCR=0x1F; //WDCE=1, WDE=1, делитель 2 сек. WDTCR=0x0F; //WDCE=0, WDE=1, } void WatchDogStop() { #asm("wdr") //сбросить сторожевой таймер WDTCR = 0x1F; //выключить сторожевой таймер WDTCR = 0x00; } Изменено 23 января, 2013 пользователем IgorKossak [codebox] для длинного кода, [code] - для короткого!!! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Артём__ 0 23 января, 2013 Опубликовано 23 января, 2013 · Жалоба Что я упустил? Возможно компилятор выдал код, который выполняется слишком долго. Смотрите в дизассемблере или в симуляторе, выполняются ли требования по быстродействию. Процессор Atmega64 Fusebits: WDTON=1 MC103=1 Что вы понимаете под MC103=1? Процессор в режиме совместимости или нет? PS. Можно поробывать убрать команду сброса таймера и посмотреть будет ли тогда сбрасываться. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Палыч 9 23 января, 2013 Опубликовано 23 января, 2013 · Жалоба Что я упустил? Упустили значения битов WDP при установке WDCE и WDE. Посмотрите как это сделано в примере от Atmel /* Write logical one to WDCE and WDE */ WDTCR |= (1<<WDCE) | (1<<WDE); Ой, не зря это они так сделали ! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AndreyVN 0 24 января, 2013 Опубликовано 24 января, 2013 · Жалоба Упустили значения битов WDP при установке WDCE и WDE. Посмотрите как это сделано в примере от Atmel Ой, не зря это они так сделали ! Насколько я понял из описания, бит WDCE=1 разрешает изменение состояния "собаки" и сбрасывается аппаратно через 4 цикла. То есть, мой вариант манипуляции с WDTCR, вроде должен быть работоспособен. Попробую как Вы советуете... Что вы понимаете под MC103=1? Процессор в режиме совместимости или нет? Fusebits активируются нулевым уровнем. Единичка соответствует значению Unprogrammed. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alexeyv 0 24 января, 2013 Опубликовано 24 января, 2013 (изменено) · Жалоба Не парьтесь и воспользуйтесь "avr\wdt.h" : ... #include <avr\wdt.h> ... ... wdt_reset(); wdt_enable(WDTO_2S); ... И по барабану, какой там AVR-процессор! И желательно включать Watchdog во Fuse-битах (включается нулем) Изменено 24 января, 2013 пользователем alexeyv Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Палыч 9 24 января, 2013 Опубликовано 24 января, 2013 · Жалоба Насколько я понял из описания, бит WDCE=1 разрешает изменение состояния "собаки" и сбрасывается аппаратно через 4 цикла. То есть, мой вариант манипуляции с WDTCR, вроде должен быть работоспособен. Да, должен быть работоспособен... Тогда, вариант один - между двумя обращениями к регистру WDTCR проходит более 4 тактов: либо транслятор так "криво" код генерит, либо мешают разрешенные прерывания. Кстати, макросы, которые советует alexeyv, и время обращения к WDTCR выдерживают правильное и от прерываний во время своего выполнения защищены. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AndreyVN 0 25 января, 2013 Опубликовано 25 января, 2013 · Жалоба Да, должен быть работоспособен... Тогда, вариант один - между двумя обращениями к регистру WDTCR проходит более 4 тактов: либо транслятор так "криво" код генерит, либо мешают разрешенные прерывания. Кстати, макросы, которые советует alexeyv, и время обращения к WDTCR выдерживают правильное и от прерываний во время своего выполнения защищены. Лазил по документам Atmel, советуют перед последовательностью присвоений WDTCR=0x1F; WDTCR=0x0F; запретить оптимизацию кода, иначе компилятор может две команды в одну слепить. Однако, пока ничего не получилось, не заводится WDT. Работает только вариант включения WDT через Fusebits WDTON=0. Тут все работает на ура, собачий таймер стартует по включению питания экран моргает как бешеный. Но меня этот режим не устраивает, мне надо включать таймер, только в том случае, если регистратор запущен на длительный режим сбора данных. В остальное время услуги собаки не требуются. У меня в CodeVision библиотеки wdt.h нет. Можно её где-то скачать? И желательно включать Watchdog во Fuse-битах (включается нулем) Эта фраза не понятна, в Fusebits можно выбрать разные режимы безопасности, но во всех режимах можно включить WDT командой или последовательностью команд. Может помимо WDTON и MC103 есть еще какой-то Fusebits, влияющий на работу WD-таймера, который я не заметил? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 128 25 января, 2013 Опубликовано 25 января, 2013 · Жалоба советуют перед последовательностью присвоений WDTCR=0x1F; WDTCR=0x0F; запретить оптимизацию кода, иначе компилятор может две команды в одну слепить.Покажите, где такая чушь написана? Не имеет права компилятор такое делать. Однако, пока ничего не получилось, не заводится WDT.Покажите листинг вашей функции WatchDogStart(). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AndreyVN 0 25 января, 2013 Опубликовано 25 января, 2013 · Жалоба Покажите, где такая чушь написана? Не имеет права компилятор такое делать. Покажите листинг вашей функции WatchDogStart(). "Слепить две в одну"- я добавил от себя, а код внизу и совет по поводу отключения оптимизации попался в документах Atmel, где именно уже не вспомню. //FuseBits: WDTON=1 MC103=1 void WatchDogStart() { StringPrepare("WDT On"); Scroll(); ScrollUpdate(); #asm("wdr") //сбросить сторожевой таймер #pragma optsize- WDTCR=0x1F; WDTCR=0x0F; #ifdef _OPTIMIZE_SIZE_ #pragma optsize+ #endif } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
art07 0 14 февраля, 2013 Опубликовано 14 февраля, 2013 · Жалоба День добрый! Есть программка в которой с помощью WDT осуществляется RESET. Есть 2 HEX файла одного и того же исходника полученные в CodeVision. Первый с оптимизацией по размеру, второй по скорости. Программируем загрузчиком chip45boot2. При загрузки первого файла, WDT не хочет делать RESET, а при загрузке 2го все работает. Если заливать софт через программатор, то работают оба. Господа, может есть у кого какие соображения??? Какая тут может быть связь.? Подскажите плиз. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Артём__ 0 14 февраля, 2013 Опубликовано 14 февраля, 2013 · Жалоба Господа, может есть у кого какие соображения??? Какая тут может быть связь.? Подскажите плиз. Видимо не выполняется "Timed Sequences for Changing the Configuration of the Watchdog Timer" и вотчдог не включается. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
art07 0 14 февраля, 2013 Опубликовано 14 февраля, 2013 · Жалоба Видимо нет. Память aplication залитая программатором или загрузчиком идентична. (сверена после программирования) В варианте с загрузчиком, если изменить фьюс BOOTRST при котором старт начнется с нулевого адреса а не с адреса загрузчика (как оно и должно быть), все работает. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Артём__ 0 14 февраля, 2013 Опубликовано 14 февраля, 2013 · Жалоба В варианте с загрузчиком, если изменить фьюс BOOTRST при котором старт начнется с нулевого адреса а не с адреса загрузчика (как оно и должно быть), все работает. Возможно в загрузчике выполняются какие-то манипуляции с WDT. если изменить фьюс BOOTRST при котором старт начнется с нулевого адреса а не с адреса загрузчика (как оно и должно быть). Ну. если вам не нужен загрузчик - "как оно и должно быть" - то и не шейте его...раз всё работает. PS. В каком состоянии остальные байты фузов (там их три). Гадать можно долго. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ARV 0 14 февраля, 2013 Опубликовано 14 февраля, 2013 · Жалоба "Слепить две в одну"- я добавил от себя, а код внизу и совет по поводу отключения оптимизации попался в документах Atmel, где именно уже не вспомню.если мне склероз не изменяет, то все в апнотах Атмела как раз наоборот было сказано - включать оптимизацию, чтобы код был наиболее коротким, чтобы между записями не было промежуточных команд, т.е. не оказалось больше 4 тактов. и, если не ошибаюсь, прерывания тоже не помешает запретить на это время с той же целью - не допустить паузы между записями в регистр WDTCR Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
art07 0 14 февраля, 2013 Опубликовано 14 февраля, 2013 · Жалоба Загрузчик выключает WDT. Как раз с загрузчиком и должно быть. Программируются биты BOOTRST BOOTSZ0 BOOTSZ1 ну и биты для работы с кварцем. Все остальное не запрограммировано. ATmega88. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться