Перейти к содержанию
    

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Что я упустил?

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

 

Процессор Atmega64

Fusebits: WDTON=1 MC103=1

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

 

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

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Что я упустил?

Упустили значения битов WDP при установке WDCE и WDE.

Посмотрите как это сделано в примере от Atmel

/* Write logical one to WDCE and WDE */

WDTCR |= (1<<WDCE) | (1<<WDE);

Ой, не зря это они так сделали !

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Упустили значения битов WDP при установке WDCE и WDE.

Посмотрите как это сделано в примере от Atmel Ой, не зря это они так сделали !

 

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

То есть, мой вариант манипуляции с WDTCR, вроде должен быть работоспособен.

 

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

 

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

Fusebits активируются нулевым уровнем. Единичка соответствует значению Unprogrammed.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не парьтесь и воспользуйтесь "avr\wdt.h" :

...
#include <avr\wdt.h> 
...
...
wdt_reset();
wdt_enable(WDTO_2S);
...

И по барабану, какой там AVR-процессор!

И желательно включать Watchdog во Fuse-битах (включается нулем)

Изменено пользователем alexeyv

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

То есть, мой вариант манипуляции с WDTCR, вроде должен быть работоспособен.

Да, должен быть работоспособен... Тогда, вариант один - между двумя обращениями к регистру WDTCR проходит более 4 тактов: либо транслятор так "криво" код генерит, либо мешают разрешенные прерывания. Кстати, макросы, которые советует alexeyv, и время обращения к WDTCR выдерживают правильное и от прерываний во время своего выполнения защищены.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да, должен быть работоспособен... Тогда, вариант один - между двумя обращениями к регистру 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-таймера, который я не заметил?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

советуют перед последовательностью присвоений WDTCR=0x1F; WDTCR=0x0F; запретить оптимизацию кода, иначе компилятор может две команды в одну слепить.
Покажите, где такая чушь написана? Не имеет права компилятор такое делать.

Однако, пока ничего не получилось, не заводится WDT.
Покажите листинг вашей функции WatchDogStart().

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Покажите, где такая чушь написана? Не имеет права компилятор такое делать.

Покажите листинг вашей функции 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
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

День добрый!

 

Есть программка в которой с помощью WDT осуществляется RESET.

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

 

Программируем загрузчиком chip45boot2. При загрузки первого файла, WDT

не хочет делать RESET, а при загрузке 2го все работает.

Если заливать софт через программатор, то работают оба.

 

Господа, может есть у кого какие соображения??? Какая тут может быть связь.? :wacko: Подскажите плиз.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Господа, может есть у кого какие соображения??? Какая тут может быть связь.? :wacko: Подскажите плиз.

Видимо не выполняется "Timed Sequences for Changing the Configuration of the Watchdog Timer" и вотчдог не включается.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Видимо нет.

Память aplication залитая программатором или загрузчиком идентична. (сверена после программирования)

В варианте с загрузчиком, если изменить фьюс BOOTRST при котором

старт начнется с нулевого адреса а не с адреса загрузчика (как оно и должно быть), все работает.

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В варианте с загрузчиком, если изменить фьюс BOOTRST при котором

старт начнется с нулевого адреса а не с адреса загрузчика (как оно и должно быть), все работает.

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

 

если изменить фьюс BOOTRST при котором старт начнется с нулевого адреса а не с адреса загрузчика (как оно и должно быть).

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

 

PS. В каком состоянии остальные байты фузов (там их три). Гадать можно долго.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

"Слепить две в одну"- я добавил от себя, а код внизу и совет по поводу отключения оптимизации попался в документах Atmel, где именно уже не вспомню.
если мне склероз не изменяет, то все в апнотах Атмела как раз наоборот было сказано - включать оптимизацию, чтобы код был наиболее коротким, чтобы между записями не было промежуточных команд, т.е. не оказалось больше 4 тактов. и, если не ошибаюсь, прерывания тоже не помешает запретить на это время с той же целью - не допустить паузы между записями в регистр WDTCR

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Загрузчик выключает WDT.

Как раз с загрузчиком и должно быть.

Программируются биты BOOTRST BOOTSZ0 BOOTSZ1 ну и биты для работы с кварцем.

Все остальное не запрограммировано. ATmega88.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...