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

 
 
> Подскажите со сторожевым таймером, При сбросе от сторожевого таймера программа виснет
StasAga
сообщение Sep 4 2007, 08:11
Сообщение #1





Группа: Новичок
Сообщений: 6
Регистрация: 19-04-07
Пользователь №: 27 165



Использую процессор ATmega2560. Инсталяция сторожевого таймера написана в соответствии с мануалом:

void instal_wdt(void)
{
asm("cli"); //запрет прерываний
asm("wdr"); //сброс сторожевого таймера

MCUSR &= ~0x80; //Clear WDRF
WDTCSR |= 0x18; //Write logical one to WDCE and WDE
WDTCSR = 0x0F; //WDE=1; WDCE=0; 2c

asm("sei"); //разрешение прерываний
return;
}

Для проверки из программы стираю сброс сторожевого таймера. При переполнении сброса не происходит, а программа просто зависает...

Подскажите пожалуйста, в чем может быть проблема? (или может я что-то упустил из виду)
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 6)
Igor26
сообщение Sep 4 2007, 08:20
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 521
Регистрация: 10-02-05
Пользователь №: 2 544



Цитата(StasAga @ Sep 4 2007, 12:11) *
Использую процессор ATmega2560. Инсталяция сторожевого таймера написана в соответствии с мануалом:

void instal_wdt(void)
{
asm("cli"); //запрет прерываний
asm("wdr"); //сброс сторожевого таймера

MCUSR &= ~0x80; //Clear WDRF
WDTCSR |= 0x18; //Write logical one to WDCE and WDE
WDTCSR = 0x0F; //WDE=1; WDCE=0; 2c

asm("sei"); //разрешение прерываний
return;
}

Для проверки из программы стираю сброс сторожевого таймера. При переполнении сброса не происходит, а программа просто зависает...

Подскажите пожалуйста, в чем может быть проблема? (или может я что-то упустил из виду)

Замените строку WDTCSR |= 0x18; на WDTCSR |= 0x1F;
Go to the top of the page
 
+Quote Post
StasAga
сообщение Sep 5 2007, 07:03
Сообщение #3





Группа: Новичок
Сообщений: 6
Регистрация: 19-04-07
Пользователь №: 27 165



Замена строки WDTCSR |= 0x18; на WDTCSR |= 0x1F;

ни к чему не приводит. В регистр WDTCSR первый раз все равно записывается 0x18... Установка битов WDCE и WDE для изменения конфигурации сторожевого таймера... После в течение четырех тактов записывается новая конфигурация таймера, что делает следующая строка.
По крайней мере так написано в мануале на мегу2560.

Причем в прошлом своем топике я не точно выразился. Процессор не зависает, а переходит в "спящий" режим. И при первом выключении/включение питания проц не выходит из "сна". Выходит в нормальный режим только при повторном выключении/включении...

И это не смотря на то, что "спящий" режим вообще запрещен сбросом бита SE регистра SMCR в 0.
Go to the top of the page
 
+Quote Post
ae_
сообщение Sep 5 2007, 09:22
Сообщение #4


Участник
***

Группа: Свой
Сообщений: 462
Регистрация: 2-04-07
Из: Иркутск
Пользователь №: 26 695



Цитата(StasAga @ Sep 5 2007, 16:03) *
...
В регистр WDTCSR первый раз все равно записывается 0x18... Установка битов WDCE и WDE для изменения конфигурации сторожевого таймера... После в течение четырех тактов записывается новая конфигурация таймера, что делает следующая строка.
...

Может в том и дело, что проходит более 4х тактов между этими сторками, например, при отлюченной оптимизации? Вы проверяли по asm листингу полученный код?
Go to the top of the page
 
+Quote Post
StasAga
сообщение Sep 5 2007, 10:35
Сообщение #5





Группа: Новичок
Сообщений: 6
Регистрация: 19-04-07
Пользователь №: 27 165



ae_ сторожевой таймер программируется. Это я проверял. В регистрах.
Проц уходит в спящий режим по истечении заданого в конфигурации собаки времени. То есть, таймер настроен на две секунды... Две секунды прога работает, после вместо сброса уходит "спать"...
Go to the top of the page
 
+Quote Post
fmdost
сообщение Sep 5 2007, 11:23
Сообщение #6


Местный
***

Группа: Свой
Сообщений: 479
Регистрация: 8-05-07
Из: г. Ставрополь. Северный Кавказ. Россия
Пользователь №: 27 606



Вполне возможно что WDT работает не на сброс, а на прерывание.
Попробуйте заменить
MCUSR &= ~0x80; //Clear WDRF
WDTCSR |= 0x18; //Write logical one to WDCE and WDE на WDTCSR = 0x18
WDTCSR = 0x0F; //WDE=1; WDCE=0; 2c
И сделайте пустую функцию прерывания по $0x18 (в IARе можно поставить галочку "запонить вектора прерываний командой RETI" Если у вас CAVR, то там в подобных местах кода, быват ошибки компиляции.

Сообщение отредактировал Т.Достоевский - Sep 5 2007, 11:24
Go to the top of the page
 
+Quote Post
arttab
сообщение Sep 6 2007, 01:07
Сообщение #7


Профессионал
*****

Группа: Свой
Сообщений: 1 432
Регистрация: 7-12-04
Из: Новосибирск
Пользователь №: 1 371



В качестве предположения:
А может проблема возникает после сброса по таймеру? Если для Вашей проги важны начальные значения переменных, а Вы их не иницилизируете, то после сброса в них неизвестно что может быть


--------------------
OrCAD, Altium,IAR, AVR....
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 20th July 2025 - 18:33
Рейтинг@Mail.ru


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