реклама на сайте
подробности

 
 
> Опять WatchDog Timer, Atmega64
AndreyVN
сообщение Jan 23 2013, 16:46
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 754
Регистрация: 29-06-06
Из: Volgograd
Пользователь №: 18 458



В коде программы команд сброса сторожевого таймера нет вообще, инициилизирую 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;
}


Сообщение отредактировал IgorKossak - Jan 23 2013, 19:56
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!!!
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Палыч
сообщение Jan 23 2013, 18:41
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



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

Упустили значения битов WDP при установке WDCE и WDE.
Посмотрите как это сделано в примере от Atmel
Цитата
/* Write logical one to WDCE and WDE */
WDTCR |= (1<<WDCE) | (1<<WDE);
Ой, не зря это они так сделали !
Go to the top of the page
 
+Quote Post
AndreyVN
сообщение Jan 24 2013, 04:14
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 754
Регистрация: 29-06-06
Из: Volgograd
Пользователь №: 18 458



Цитата(Палыч @ Jan 23 2013, 21:41) *
Упустили значения битов WDP при установке WDCE и WDE.
Посмотрите как это сделано в примере от Atmel Ой, не зря это они так сделали !


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

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

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

Fusebits активируются нулевым уровнем. Единичка соответствует значению Unprogrammed.
Go to the top of the page
 
+Quote Post
Палыч
сообщение Jan 24 2013, 15:59
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



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

Да, должен быть работоспособен... Тогда, вариант один - между двумя обращениями к регистру WDTCR проходит более 4 тактов: либо транслятор так "криво" код генерит, либо мешают разрешенные прерывания. Кстати, макросы, которые советует alexeyv, и время обращения к WDTCR выдерживают правильное и от прерываний во время своего выполнения защищены.
Go to the top of the page
 
+Quote Post
AndreyVN
сообщение Jan 25 2013, 09:04
Сообщение #5


Знающий
****

Группа: Свой
Сообщений: 754
Регистрация: 29-06-06
Из: Volgograd
Пользователь №: 18 458



Цитата(Палыч @ 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-таймера, который я не заметил?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jan 25 2013, 11:24
Сообщение #6


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (AndreyVN @ Jan 25 2013, 11:04) *
советуют перед последовательностью присвоений WDTCR=0x1F; WDTCR=0x0F; запретить оптимизацию кода, иначе компилятор может две команды в одну слепить.
Покажите, где такая чушь написана? Не имеет права компилятор такое делать.
QUOTE (AndreyVN @ Jan 25 2013, 11:04) *
Однако, пока ничего не получилось, не заводится WDT.
Покажите листинг вашей функции WatchDogStart().


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
AndreyVN
сообщение Jan 25 2013, 15:54
Сообщение #7


Знающий
****

Группа: Свой
Сообщений: 754
Регистрация: 29-06-06
Из: Volgograd
Пользователь №: 18 458



Цитата(Сергей Борщ @ 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
}
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- AndreyVN   Опять WatchDog Timer   Jan 23 2013, 16:46
- - _Артём_   Цитата(AndreyVN @ Jan 23 2013, 18:46) Что...   Jan 23 2013, 17:16
|- - ARV   Цитата(AndreyVN @ Jan 25 2013, 19:54) ...   Feb 14 2013, 16:29
|- - _Артём_   Цитата(ARV @ Feb 14 2013, 18:29) если мне...   Feb 14 2013, 17:10
|- - artic   Да, реализованно на ассемблере. Иначе при компиляц...   Feb 14 2013, 17:48
|- - _Артём_   Цитата(artic @ Feb 14 2013, 19:48) Что уч...   Feb 14 2013, 19:05
|- - artic   После "программного сброса" ничего не ра...   Feb 15 2013, 05:28
- - alexeyv   Не парьтесь и воспользуйтесь "avr\wdt.h...   Jan 24 2013, 04:14
- - artic   День добрый! Есть программка в которой с помо...   Feb 14 2013, 12:33
|- - _Артём_   Цитата(artic @ Feb 14 2013, 14:33) Господ...   Feb 14 2013, 13:48
|- - artic   Видимо нет. Память aplication залитая программат...   Feb 14 2013, 15:29
|- - _Артём_   Цитата(artic @ Feb 14 2013, 17:29) В вари...   Feb 14 2013, 16:04
|- - artic   Загрузчик выключает WDT. Как раз с загрузчиком и ...   Feb 14 2013, 16:30
- - ILYAUL   Ну так сравни два асм кода с разными оптимизациями...   Feb 14 2013, 18:06
|- - artic   Я ж говорю, при любой оптимизации работает если ши...   Feb 14 2013, 18:22
- - RabidRabbit   Мож где при инициализации оборудования оптимизатор...   Feb 15 2013, 05:51
- - ILYAUL   ЦитатаЯ ж говорю, при любой оптимизации работает е...   Feb 15 2013, 06:32
- - artic   Загрузчик не компилирую. Он изначально есть только...   Feb 15 2013, 07:23


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 13:27
Рейтинг@Mail.ru


Страница сгенерированна за 0.01448 секунд с 7
ELECTRONIX ©2004-2016