Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
25.06.2003, 19:27
|
|
junior
Гость
|
Правильно ли я активизирую собаку для авр?
WDTCR=0x0f;
....
...
...
_WDR();
|
|
|
|
25.06.2003, 23:08
|
|
Временная регистрация
Регистрация: 22.05.2003
Сообщений: 55
Сказал спасибо: 0
Сказали Спасибо 18 раз(а) в 18 сообщении(ях)
|
|
|
|
|
31.03.2008, 02:09
|
|
Прописка
Регистрация: 14.01.2008
Сообщений: 121
Сказал спасибо: 1
Сказали Спасибо 19 раз(а) в 18 сообщении(ях)
|
Я делаю это так:
void WDOG_Init()
{
WDTCR = (1 ‹‹ WDP1);
#asm("WDR");
WDTCR |= (1 ‹‹ WDE);
}
И потом в каком-то прерывании которое выполняется постоянно или в основном цикле пишу:
#asm("WDR");
естественно в начале проги в разделе инициализаций нужно прописать
WDOG_Init();
Установка битов WDTCR влияет на время реакции собаки на зависание. См. Datasheet.
|
|
|
Сказали "Спасибо" alex28411
|
|
|
31.03.2008, 08:20
|
|
Временная регистрация
Регистрация: 11.12.2007
Сообщений: 79
Сказал спасибо: 0
Сказали Спасибо 1 раз в 1 сообщении
|
сбрасывать собаку в прерывании - это моветон, оно может не наступить. Вот обсуждение в тему
http://www.microchip.su/showthread.p...&highlight=wdt
|
|
|
|
31.03.2008, 13:00
|
|
Вид на жительство
Регистрация: 28.02.2008
Сообщений: 437
Сказал спасибо: 0
Сказали Спасибо 2 раз(а) в 2 сообщении(ях)
|
Re: Правильно ли я активизирую собаку для авр?
Сообщение от junior
|
WDTCR=0x0f;
....
...
...
_WDR();
|
Дык прошей прогу в твой девайс и убедись правильно или нет. Или в симуляторе прогони
|
|
|
Сказали "Спасибо" Don_Ambrosio
|
|
|
02.04.2008, 02:53
|
|
Прописка
Регистрация: 14.01.2008
Сообщений: 121
Сказал спасибо: 1
Сказали Спасибо 19 раз(а) в 18 сообщении(ях)
|
Если у меня прерывание по переполнению таймера управляет динамической индикацией, то поверьте, что это прерывание вызывается 200 раз в с. И оно наступает всегда. Иначе на сесисегментный индикатор ничего не будет выводиться. А если вы не используете прерывание, то бросать кость собаке можно и в основном бесконечном цикле, как я уже говорил. Смотря по какому алгоритму вы строите свою прогу.
|
|
|
Сказали "Спасибо" alex28411
|
|
|
02.04.2008, 02:55
|
|
Прописка
Регистрация: 14.01.2008
Сообщений: 121
Сказал спасибо: 1
Сказали Спасибо 19 раз(а) в 18 сообщении(ях)
|
А при таком алгоритме:
WDTCR=0x0f;
....
...
...
_WDR();
собака вообще никогда не проснется. Читайте Datasheet!
|
|
|
Сказали "Спасибо" alex28411
|
|
|
02.04.2008, 12:39
|
|
Прописка
Регистрация: 16.03.2005
Сообщений: 244
Сказал спасибо: 78
Сказали Спасибо 85 раз(а) в 55 сообщении(ях)
|
to Junior, если _WDR(), тоже, что и #asm("WDR") то упринципе пойдёть. Маленькое замечание. Собака нужна для защиты от сбоев это как говориться прописная истина. Но давайте посмотрим что убивает нормальную работу контроллера: 1.-остановка тактового генератора.
2.- запись в регист счетчика команд "неверного" адреса. 3.- сбой стековой памяти.и т.д. и т.п. список можно продолжать и продолжать. кстати ни кто не запрещает таймеру собаки остановиться от помехи. Короче говоря, чем дольше работаю с АВР тем больше убеждаюсь- сделана эта часть контроллера через это как его ну вы поняли. И вобще помехозащищенность у АВР никуда, хотя сам контроллер имет очень много преимуществ главные из которых цена и доступность. Теперь маленький простенький совет по использованию собаки: если вы сбрасываете собаку при выполнении прерывания считайте, что в 90% случаев при возникновении сбоя работы программы контроллер будет работать работать работать аки батарейки энейджайзер. Для того чтобы исключить такого рода ситуацию я делаю следующее: объявляю глобальную пременную, которую использую отдельно для флагов "нормальной работы программы" которые устанавливаю в разных местах программы- прерывания там всякие вычисления прочие, короче говоря во всех местах где надо проверить правильную работу и затем в укромном месте проверяю именно эту переменную, ее обнуляю и сбрасываю сабаку. Вот так вот- мааленький советик.
P.S. огромная радость объяла меня, когда узнал, что новые меги могут выполнять прерывание при переполнении собаки а не тупо все сбрасывать
|
|
|
Сказали "Спасибо" mike7815
|
|
|
03.04.2008, 14:19
|
|
Прописка
Регистрация: 14.01.2008
Сообщений: 121
Сказал спасибо: 1
Сказали Спасибо 19 раз(а) в 18 сообщении(ях)
|
Цитата:
|
to Junior, если _WDR(), тоже, что и #asm("WDR") то упринципе пойдёть.
|
Эта команда только сбрасывает сторожевой таймер. Но его еще нужно правильно запустить. Привожу цитату из книги:
"Для запуска сторожевого таймеранеобходимо в ходе программы выполнить команду WDR и затем установить в единичное состояние разряд WDE регистра WDTCR.
Для остановки сторожевого таймера необходимо установить в единичное состояние разряд WDTOE регистра WDTCR и одновременно повторно установить в единичное состояние разряд WDE, затем не позднее, чем через четыре такта после этого сбросить в нулевое состояние разряд WDE. Разряд WDTOE сбрасывается в нулевое состояние аппаратно через четыре такта после установка его в единичное состояние.
Программа, в которой предусмотрено использование сторожевого таймера, должна периодически с интервалом меньшим, чем период формирования запроса прерывания WDT Reset, с использованием команды WDR перезапускать сторожевой таймер. Если при появлении сбоя команда WDR своевременно не выполняется, происходит перезапуск микроконтроллера."
---------------------
Читайте книжки, господа!
|
|
|
Сказали "Спасибо" alex28411
|
|
|
03.04.2008, 16:11
|
|
Прописка
Регистрация: 16.03.2005
Сообщений: 244
Сказал спасибо: 78
Сказали Спасибо 85 раз(а) в 55 сообщении(ях)
|
инициализация зависит от типа контроллера так, что книжку в печку
|
|
|
Сказали "Спасибо" mike7815
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 01:00.
|
|