Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Подскажите со сторожевым таймером
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
StasAga
Использую процессор 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;
}

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

Подскажите пожалуйста, в чем может быть проблема? (или может я что-то упустил из виду)
Igor26
Цитата(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;
StasAga
Замена строки WDTCSR |= 0x18; на WDTCSR |= 0x1F;

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

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

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

Может в том и дело, что проходит более 4х тактов между этими сторками, например, при отлюченной оптимизации? Вы проверяли по asm листингу полученный код?
StasAga
ae_ сторожевой таймер программируется. Это я проверял. В регистрах.
Проц уходит в спящий режим по истечении заданого в конфигурации собаки времени. То есть, таймер настроен на две секунды... Две секунды прога работает, после вместо сброса уходит "спать"...
fmdost
Вполне возможно что 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, то там в подобных местах кода, быват ошибки компиляции.
arttab
В качестве предположения:
А может проблема возникает после сброса по таймеру? Если для Вашей проги важны начальные значения переменных, а Вы их не иницилизируете, то после сброса в них неизвестно что может быть
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.