Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Опять WatchDog Timer
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
AndreyVN
В коде программы команд сброса сторожевого таймера нет вообще, инициилизирую 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;
}
_Артём_
Цитата(AndreyVN @ Jan 23 2013, 18:46) *
Что я упустил?

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

Цитата(AndreyVN @ Jan 23 2013, 18:46) *
Процессор Atmega64
Fusebits: WDTON=1 MC103=1

Что вы понимаете под MC103=1? Процессор в режиме совместимости или нет?

PS. Можно поробывать убрать команду сброса таймера и посмотреть будет ли тогда сбрасываться.

Палыч
Цитата(AndreyVN @ Jan 23 2013, 20:46) *
Что я упустил?

Упустили значения битов WDP при установке WDCE и WDE.
Посмотрите как это сделано в примере от Atmel
Цитата
/* Write logical one to WDCE and WDE */
WDTCR |= (1<<WDCE) | (1<<WDE);
Ой, не зря это они так сделали !
AndreyVN
Цитата(Палыч @ Jan 23 2013, 21:41) *
Упустили значения битов WDP при установке WDCE и WDE.
Посмотрите как это сделано в примере от Atmel Ой, не зря это они так сделали !


Насколько я понял из описания, бит WDCE=1 разрешает изменение состояния "собаки" и сбрасывается аппаратно через 4 цикла.
То есть, мой вариант манипуляции с WDTCR, вроде должен быть работоспособен.

Попробую как Вы советуете...

Цитата
Что вы понимаете под MC103=1? Процессор в режиме совместимости или нет?

Fusebits активируются нулевым уровнем. Единичка соответствует значению Unprogrammed.
alexeyv
Не парьтесь и воспользуйтесь "avr\wdt.h" :
CODE
...
#include <avr\wdt.h>
...
...
wdt_reset();
wdt_enable(WDTO_2S);
...

И по барабану, какой там AVR-процессор!
И желательно включать Watchdog во Fuse-битах (включается нулем)
Палыч
Цитата(AndreyVN @ Jan 24 2013, 08:14) *
Насколько я понял из описания, бит WDCE=1 разрешает изменение состояния "собаки" и сбрасывается аппаратно через 4 цикла.
То есть, мой вариант манипуляции с WDTCR, вроде должен быть работоспособен.

Да, должен быть работоспособен... Тогда, вариант один - между двумя обращениями к регистру WDTCR проходит более 4 тактов: либо транслятор так "криво" код генерит, либо мешают разрешенные прерывания. Кстати, макросы, которые советует alexeyv, и время обращения к WDTCR выдерживают правильное и от прерываний во время своего выполнения защищены.
AndreyVN
Цитата(Палыч @ Jan 24 2013, 19:59) *
Да, должен быть работоспособен... Тогда, вариант один - между двумя обращениями к регистру 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-таймера, который я не заметил?
Сергей Борщ
QUOTE (AndreyVN @ Jan 25 2013, 11:04) *
советуют перед последовательностью присвоений WDTCR=0x1F; WDTCR=0x0F; запретить оптимизацию кода, иначе компилятор может две команды в одну слепить.
Покажите, где такая чушь написана? Не имеет права компилятор такое делать.
QUOTE (AndreyVN @ Jan 25 2013, 11:04) *
Однако, пока ничего не получилось, не заводится WDT.
Покажите листинг вашей функции WatchDogStart().
AndreyVN
Цитата(Сергей Борщ @ Jan 25 2013, 14:24) *
Покажите, где такая чушь написана? Не имеет права компилятор такое делать.
Покажите листинг вашей функции 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
}
artic
День добрый!

Есть программка в которой с помощью WDT осуществляется RESET.
Есть 2 HEX файла одного и того же исходника полученные в CodeVision. Первый с оптимизацией по размеру, второй по скорости.

Программируем загрузчиком chip45boot2. При загрузки первого файла, WDT
не хочет делать RESET, а при загрузке 2го все работает.
Если заливать софт через программатор, то работают оба.

Господа, может есть у кого какие соображения??? Какая тут может быть связь.? wacko.gif Подскажите плиз.
_Артём_
Цитата(artic @ Feb 14 2013, 14:33) *
Господа, может есть у кого какие соображения??? Какая тут может быть связь.? wacko.gif Подскажите плиз.

Видимо не выполняется "Timed Sequences for Changing the Configuration of the Watchdog Timer" и вотчдог не включается.
artic
Видимо нет.
Память aplication залитая программатором или загрузчиком идентична. (сверена после программирования)
В варианте с загрузчиком, если изменить фьюс BOOTRST при котором
старт начнется с нулевого адреса а не с адреса загрузчика (как оно и должно быть), все работает.


_Артём_
Цитата(artic @ Feb 14 2013, 17:29) *
В варианте с загрузчиком, если изменить фьюс BOOTRST при котором
старт начнется с нулевого адреса а не с адреса загрузчика (как оно и должно быть), все работает.

Возможно в загрузчике выполняются какие-то манипуляции с WDT.

Цитата(artic @ Feb 14 2013, 17:29) *
если изменить фьюс BOOTRST при котором старт начнется с нулевого адреса а не с адреса загрузчика (как оно и должно быть).

Ну. если вам не нужен загрузчик - "как оно и должно быть" - то и не шейте его...раз всё работает.

PS. В каком состоянии остальные байты фузов (там их три). Гадать можно долго.
ARV
Цитата(AndreyVN @ Jan 25 2013, 19:54) *
"Слепить две в одну"- я добавил от себя, а код внизу и совет по поводу отключения оптимизации попался в документах Atmel, где именно уже не вспомню.
если мне склероз не изменяет, то все в апнотах Атмела как раз наоборот было сказано - включать оптимизацию, чтобы код был наиболее коротким, чтобы между записями не было промежуточных команд, т.е. не оказалось больше 4 тактов. и, если не ошибаюсь, прерывания тоже не помешает запретить на это время с той же целью - не допустить паузы между записями в регистр WDTCR
artic
Загрузчик выключает WDT.
Как раз с загрузчиком и должно быть.
Программируются биты BOOTRST BOOTSZ0 BOOTSZ1 ну и биты для работы с кварцем.
Все остальное не запрограммировано. ATmega88.
_Артём_
Цитата(ARV @ Feb 14 2013, 18:29) *
если мне склероз не изменяет, то все в апнотах Атмела как раз наоборот было сказано - включать оптимизацию, чтобы код был наиболее коротким, чтобы между записями не было промежуточных команд,

Наверное лучше реализовать функции запрета/разрешения WDT на ассемблере.


Цитата(artic @ Feb 14 2013, 18:30) *
Загрузчик выключает WDT.

А ваша программа его включить не может, получается?

Цитата(artic @ Feb 14 2013, 18:30) *
ATmega88.

В ATmega88 WDT работает несколько иначе, чем в ATmega64.
На работу WDT влияет состояние флага MCUCSR.WDRF. В вашем буте это как-то учтено?

artic
Да, реализованно на ассемблере. Иначе при компиляции с оптимизацией по размеру
не уложиться в 4 такта.
С флагами, настройками все в порядке. Проверено временем.
Так что типа не так настроил - здесь не проходит. Все строго по даташиту.
Проблема когда загрузчик + компиляция с оптимизацией по размеру.
В остальном все гладко. Не было б загрузчика не было б проблем.)))
В место RESET я получаю зависание. А должен попасть на начало загрузчика.


Что учтено в буте не известно. Бут закрыт.
ILYAUL
Ну так сравни два асм кода с разными оптимизациями и именно то что относится к WDT
artic
Я ж говорю, при любой оптимизации работает если шить программатором.
В чем смысл сравнения?
Повторюсь.
Память aplication залитая программатором или загрузчиком идентична. (сверена после программирования)
В варианте когда загрузчиком, если изменить фьюс BOOTRST при котором
старт начнется с нулевого адреса а не с адреса загрузчика, все работает не
зависимо от того какой оптимизации файл залит.
_Артём_
Цитата(artic @ Feb 14 2013, 19:48) *
Что учтено в буте не известно. Бут закрыт.

Может свой бут написать? Чтоб было известно, что там учтено.

Цитата(artic @ Feb 14 2013, 20:22) *
все работает не
зависимо от того какой оптимизации файл залит.

А что именно не работает после "программного сброса", если первым стартует бут? Как выглядит поведение программы? В чём отличие от таго как должно быть?
artic
После "программного сброса" ничего не работает. (Если вектор сброса указан на загрузчик и оптимизация по размеру. Писал в самом начале.) Ни бут, ни рабочее приложение. Конкретный висюн.
У меня в проге реализован механизм аварийного сброса из зависания если где в проге косяк.
Он использует внешнее прерывание от кнопки а в самой пп обработки прерывания запускается
WDR на RESET. Так и это не помогает выйти из висюна. То есть попытка использовать WDR
для сброса аварийного и сброса рабочего не дает желаемого результата.

Писать свой бут пока нет смысла. Это один случай из мно-ва других безпроблемных. Если
припрет, то напишем бут. Проблему можно обойти если взять мегу с большей памятью и забить на размер кода. Ведь с оптимизацией по скорости все пучком. Но хочется не обойти, а решить!
RabidRabbit
Мож где при инициализации оборудования оптимизатор вместо ldi/out использует sbi, что оставляет часть битов "по умолчанию", что после софтового сброса и приводит к проблемам?
ILYAUL
Цитата
Я ж говорю, при любой оптимизации работает если шить программатором.
В чем смысл сравнения?

Вы шьёте программатром, как я понимаю нет. Вы хотите разобраться почему одна из оптимизаций не работает в варианте с boot , так берите код asm и сравнивайте что компилятор изменил в загрузчике для обеих оптимизациях
artic
Загрузчик не компилирую. Он изначально есть только в hex. Исходника нет.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.