Страница 1 из 1

ATMEGA48V + WDT + CVAVR

Добавлено: Ср мар 03, 2010 11:52:37
AlexVM
Доброго времени суток!

1. Что есть:
Делаю приборчик с батарейным питанием, который делает измерение чего-либо, передает результаты куда либо и засыпает. Использую WDT для пробуждения со сбросом через каждые примерно 8 секунд.
2. Что хотелось бы:
Чтобы измерения и передача проходили один раз примерно в 40 секунд. Как я понимаю, необходимо использовать прерывание от WDT, инкрементировать счетчик, проверять его значение и засыпать, если значение не равно 5-и. Если равно 5-ти, то измерять, передавать, обнулять счетчик и засыпать.

Так вот тут то и затык. Как это сделать? У меня не получается - почему то и по прерыванию происходит сброс контролера.
А если по первому варианту использовать запись в еепромину значения счетчика каждые 8 секунд, то её хватит на сутки, наверное :(

Заранее спасибо!

Добавлено: Ср мар 03, 2010 14:22:47
Danko
Совершенно верно. Сторожевой таймер выполняет сброс МК.
Для пробуждения МК нужно другое событие: например внешнее прерывание от генератора на 40 секунд.

Лично сам не делал но в сети видел схемы на полевиках с задержкой на несколько минут. Если конечно не нужна точность в 40 секунд.

Добавлено: Ср мар 03, 2010 14:26:47
AlexVM
Так в 48 меге есть прерывание от собаки. Вот его то использовать и не получается.

Re: ATMEGA48V + WDT + CVAVR

Добавлено: Ср мар 03, 2010 14:52:56
stas00n
AlexVM писал(а):...почему то и по прерыванию происходит сброс контролера.

А битики WDE и WDIE в регистре WDTCSR правильно выставлены?

Добавлено: Ср мар 03, 2010 15:04:12
stas00n
Вроде в вашем случае WDTCSR должен быть 0b01110001 = 71h

Добавлено: Ср мар 03, 2010 16:21:51
Danko
AlexVM, Вы наверняка пользовались "волшебником", который генерирует такой код

Код: Выделить всё

// Watchdog Timer initialization
// Watchdog Timer Prescaler: OSC/1024k
// Watchdog Timer interrupt: On
#pragma optsize-
#asm("wdr")
WDTCSR=0x39;
WDTCSR=0x69;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif


по которому и WDE (бит 3) и WDIE (бит 6) равны 1 т.е. вызывается прерывание с последующим сбросом.

для работы прерывания должно быть: WDE=0, WDIE=1.

при смене делителя нужно сбрасывать бит WDCE (бит 4), по сему и инициализация WDTCSR производится в две строки.

Волшебник класная штука, но песенку Пугачевой не стоит забывать. :))

Добавлено: Ср мар 03, 2010 18:21:39
stas00n
И кстати, проверь, не запрограммирован ли (случайно или нарочно) собачий фьюз (WDTON), если запрограммирован, по переполнению вотчдога всегда будет сброс, независимо от того, что ты напишешь в коде, - надо вернуть в исходное (1). Между прочим, все это есть на 53-й странице даташита, читал?

TNX

Добавлено: Чт мар 04, 2010 18:05:11
AlexVM
Огромное спасибо всем, особенно коту Danko! ;)

Так и получилось - визард с WDE накосячил и я за ним.