StasAga
Sep 4 2007, 08: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;
}
Для проверки из программы стираю сброс сторожевого таймера. При переполнении сброса не происходит, а программа просто зависает...
Подскажите пожалуйста, в чем может быть проблема? (или может я что-то упустил из виду)
Цитата(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
Sep 5 2007, 07:03
Замена строки WDTCSR |= 0x18; на WDTCSR |= 0x1F;
ни к чему не приводит. В регистр WDTCSR первый раз все равно записывается 0x18... Установка битов WDCE и WDE для изменения конфигурации сторожевого таймера... После в течение четырех тактов записывается новая конфигурация таймера, что делает следующая строка.
По крайней мере так написано в мануале на мегу2560.
Причем в прошлом своем топике я не точно выразился. Процессор не зависает, а переходит в "спящий" режим. И при первом выключении/включение питания проц не выходит из "сна". Выходит в нормальный режим только при повторном выключении/включении...
И это не смотря на то, что "спящий" режим вообще запрещен сбросом бита SE регистра SMCR в 0.
Цитата(StasAga @ Sep 5 2007, 16:03)

...
В регистр WDTCSR первый раз все равно записывается 0x18... Установка битов WDCE и WDE для изменения конфигурации сторожевого таймера... После в течение четырех тактов записывается новая конфигурация таймера, что делает следующая строка.
...
Может в том и дело, что проходит более 4х тактов между этими сторками, например, при отлюченной оптимизации? Вы проверяли по asm листингу полученный код?
StasAga
Sep 5 2007, 10:35
ae_ сторожевой таймер программируется. Это я проверял. В регистрах.
Проц уходит в спящий режим по истечении заданого в конфигурации собаки времени. То есть, таймер настроен на две секунды... Две секунды прога работает, после вместо сброса уходит "спать"...
Вполне возможно что 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, то там в подобных местах кода, быват ошибки компиляции.
В качестве предположения:
А может проблема возникает после сброса по таймеру? Если для Вашей проги важны начальные значения переменных, а Вы их не иницилизируете, то после сброса в них неизвестно что может быть
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.