Обсуждаем контроллеры компании Atmel.
Ответить

Re: WatchDog Timer в AVR

Пт фев 07, 2014 13:40:45

Итак, товарищи.
Все темы непосредственно о стороже я собрал в одну и прилепил, благо они не пересекаются по времени.

Хотелось бы чтобы кто-нибудь поделился опытом использования САБЖа по "прямому" назначению, т.е. контроль за зависанием МК, а не вывод из спящего режима или ещё что, как то:
— как часто пользуется;
— на каком этапе написания кода / разработки алгоритма он продумывается;
и т.д. и т.п.

Делаю приборчик с автоотключением питания и боюсь что если МК зависнет, то аккумы сядут в ноль :)))

Re: Вопросы по С/С++ (СИ)

Ср фев 26, 2014 15:12:32

подскажите правильна ли реализация сторожевого таймера (AVRStudio5)
особое внимание к строчкам с !!!!!!!!!!!

Код:
#include <avr/io.h> \\attiny13A
#include <avr/interrupt.h>
unsigned char k;

//из даташита скопировано       !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
void WDT_off(void)
{
cli();
/* Clear WDRF in MCUSR */
MCUSR &= ~(1<<WDRF);
/* Write logical one to WDCE and WDE */
/* Keep old prescaler setting to prevent unintentional time-out */
WDTCR |= (1<<WDCE) | (1<<WDE);
/* Turn off WDT */
WDTCR = 0x00;
sei();
}


ISR(ADC_vect)
{
   k++;
   if (k>20)
   {
      asm ("wdr");              !!!!!!!!!!!!!!!!!!!!!!!!!
      ....что-то тут еще делается...
                                 .................
   k=0;
   }
}

int main(void)
{
   DDRB = 0b00000011;
   PORTB = 0b00000000;
   ADMUX = 0b00100010;
   ADCSRA =0b11111111;
   WDT_off(); вроде как инициализация?     !!!!!!!!!!!!!!!!   
                 sei(); // Глобально разрешаем прерывания
    while(1){}
}


вроде работает но мало ли...
Заранее спасибо.
Последний раз редактировалось Gudd-Head Чт фев 27, 2014 12:11:12, всего редактировалось 1 раз.
Причина: Сюда перенёс

Re: Вопросы по С/С++ (СИ)

Ср фев 26, 2014 18:45:04

вроде как инициализация?


Э-э-э, ну, так-то это, вообще-то выключение сторожевого таймера...

А к слову, зачем он Вам вообще нужен? Обычно в 90% случаев в нем нет особой необходимости.

Re: Вопросы по С/С++ (СИ)

Ср фев 26, 2014 19:47:58

есть, т.к. зависает очень часто, скорее всего из-за помех от релюшек.
да выключает, тогда почему работает? как его правильно тогда инициализировать?
фьюз то я активировал как сказано в даташите.
MCUSR
WDTCR
оба регистра надо выставлять или только последний?

Re: Вопросы по С/С++ (СИ)

Ср фев 26, 2014 22:36:42

зависает очень часто, скорее всего из-за помех от релюшек


Проблемы с регулярными помехами надо решать прежде всего грамотной трассировкой и вдумчивым конструированием.

оба регистра надо выставлять или только последний?


Чтобы запустить таймер, делаем так:

1. Выставляем фьюз WDTON (либо включаем таймер битами в WDTCR).
2. В WDTCR выбираем нужное значение предделителя.

Все. Это описано в документации. Раздел 8.3.

MCUSR только содержит информацию о причине сброса.

тогда почему работает? ... фьюз то я активировал как сказано в даташите.


Из-за фьюза и работает. Фьюз имеет приоритет над настройками регистра. И это тоже написано в даташите.

Re: Вопросы по С/С++ (СИ)

Чт фев 27, 2014 08:30:46

аааа, если фьюз активирован, то программно счетчик уже не вырубить, вот поэтому то он и работает, правда предделитель на минимальном значении 16ms так как в WDTCR у битов предделителя должны быть все нули после WDTCR=0х00;.
а сброс счетчика получается я правильно реализовал?

Re: Вопросы по С/С++ (СИ)

Чт фев 27, 2014 10:13:30

YS писал(а):А к слову, зачем он Вам вообще нужен? Обычно в 90% случаев в нем нет особой необходимости.

Я бы сказал что он обязательно нужен в устройствах, работающих непрерывно. А такие достаточно частое явление, кмк :)

Re: Вопросы по С/С++ (СИ)

Чт фев 27, 2014 10:29:54

Еще обязательно нужен, если девайс питается от батареек и никогда не выключается, то есть спать ложится.

Re: Вопросы по С/С++ (СИ)

Чт фев 27, 2014 12:00:54

Я бы сказал что он обязательно нужен в устройствах, работающих непрерывно.


Зависит от критичности устройства. Если устройство неответственное (от него не зависят жизни) и стоит рядом с человеком, то проще в случае чего тыкнуть сброс/передернуть питание. Вообще, мне крайне редко встречались такие отказы.

Ну а если устройство стоит где-то на чердаке или в скважине, до него лезть два часа чтобы перезагрузить, оно работает круглосуточно и необслуживаемо, то там, конечно, стоит заморочиться на watchdog (может даже внешний).

В любом случае, простое включение watchdog'а и его тупое обнуление в цикле не принесет пользы. Всегда надо тщательно думать, как оптимальнее расположить команды сброса оного, чтобы таймер обеспечивал надежность, а не просто был включен. Это отдельная задача, и не всегда имеет смысл над ней думать, учитывая частоту таких отказов.

Re: Вопросы по С/С++ (СИ)

Чт фев 27, 2014 12:09:31

YS писал(а):В любом случае, простое включение watchdog'а и его тупое обнуление в цикле не принесет пользы.

Почему же... Вы, коллега, видимо не сталкивались с таким явлением, когда из десятка одновременно круглосуточно работающих одинаковых устройств примерно раз в неделю кто-то из них зависает. И отвисает обычным ресетом (не по питанию) МК.

Re: WatchDog Timer Сторожевой таймер в AVR

Чт фев 27, 2014 20:43:32

Почему же...


Если функционал расположен (бывает такое, конечный автомат, например) в главной программе, а WDT циклически обнуляется в прерывании (есть любители такое делать), то как бы по факту все ни висело, WDT не поможет... Это самое первое, что приходит в голову.

Опять же, если WDT обнуляется каждый раз в конце главного цикла, а в том же конечном автомате что-то пошло не так, но не привело к зависанию, WDT снова не поможет. Мораль - надо вводить затычки-циклы в места отлова ошибок, чтобы МК гарантированно зависал, и т.п. То есть, определенная работа мысли необходима.

Re: WatchDog Timer Сторожевой таймер в AVR

Чт фев 27, 2014 21:07:18

YS писал(а):а WDT циклически обнуляется в прерывании

ну право же, это крайность :)
Согласен, что ресет собаки надо делать осмысленно. Использовать его ведь ничего не стоит. Почему ж не поставить, если это повышает стабильность работы устройства? Хотя бы теоретически. Приведу пример - электронные счетчики, электроэнергии, воды, газа... Что будет если он зависнет? Плохо будет :) А если рестартанет, то и фиг с ним. В Швеции ребята рассказывают, на группу счетчиков стоит большой "ресеттер" раз в сутки их перезапускающий, но это уже конечно крайность и криворукость в изготовлении.
Второй момент это использование собаки в сложных системах из десятков-сотен модулей, порой сторонних. Ничего не стоит использовать эту штуку, а опять же, стабильность повышает. Если быть аккуратным с прерываниями и многопоточными системами.
Одно дело писать кривой код, другое дело защитится от возможных помех и прочей ерунды. Жалко что-ли его включить :)
:beer:

Re: WatchDog Timer Сторожевой таймер в AVR

Чт фев 27, 2014 21:24:02

Я только "за". :)) Просто я акцентирую внимание на том, что просто включение таймера - не панацея. Это лишь инструмент, сам по себе он ничего не улучшит, если не продумать архитектуру в соответствующем ключе. Факт очевидный, но важный. :beer:

Re: WatchDog Timer Сторожевой таймер в AVR

Чт фев 27, 2014 23:03:41

Согласен :) Просто я хотел сказать что проволоку плоскогубцами крутить легче все же чем пальцами :)
:beer:

Re: WatchDog Timer Сторожевой таймер в AVR

Вс июл 27, 2014 18:01:19

YS писал(а):что просто включение таймера - не панацея.


И еще - для программера соблазн не отлаживать дотошно прогу, чтоб все возможные программные зависы выковырять, а понадеяться на собаку.

Re: WatchDog Timer Сторожевой таймер в AVR

Ср ноя 26, 2014 11:04:25

Народ, подскажите пожалуйста. Устройство на tiny25 работает от батареек. Функционал маленький, поэтому основное время контроллер будет спать. А просыпаться бы хотелось от сторожевого таймера. Накрапал код:

Код:
#include <avr/io.h>
#include <avr/interrupt.h>

ISR (SIG_WATCHDOG_TIMEOUT)
{
   PORTB ^= 0x01;
}

int main(void)
{
   DDRB = 0x01;
   
   WDTCR |= (1<<WDCE)|(1 << WDE);
   WDTCR |= (1 << WDIE)|(1 << WDP0);
   
   sei();
   
    while(1)
    {
        asm volatile("nop"::);
    }
}

Симулирую в proteus. Ничего с выводом PB0 не происходит. Перечитал несколько раз даташит, вроде все логично сделал. Может действительно я чего-то не догоняю или протеус не моделирует собаку?

Re: WatchDog Timer Сторожевой таймер в AVR

Ср ноя 26, 2014 11:07:51

Там вроде где-то задаётся что будет от переполнения собаки — сброс или прерывание.

Re: WatchDog Timer Сторожевой таймер в AVR

Ср ноя 26, 2014 11:13:01

И я о том же. Если верить табл. 8-2 на стр.45 даташита, то получается что при установленных битах WDE и WDIE собака работает и по переполнению вызывается прерывание. У меня эти биты установлены.

Re: WatchDog Timer Сторожевой таймер в AVR

Ср ноя 26, 2014 11:15:20

А помимо глобального, от самой собаки прерывание разрешено? А если не прерывание, а ресет?

Re: WatchDog Timer Сторожевой таймер в AVR

Ср ноя 26, 2014 11:32:56

Бит WDIE отвечает за прерывание от собаки. Я его взвожу. С ресетом проверил, работает отлично, контроллер перегружается.
Ответить