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

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

Сб сен 01, 2018 07:51:05

Ну почему вы не пользуетесь готовыми либами, которые стандартно имеются в вашем компиляторе?! Почему вы постоянно изобретаете свой велосипед?! Ну изучите стандартные возможности вашего инструмента, в конце-то концов!
Настройка, запуск и сброс WDT делается красиво в 1 строку, и никаких ручных манипуляций с битами!

Добавлено after 2 minutes 37 seconds:
https://simple-devices.ru/attachments/a ... 2_2011.pdf

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

Вс сен 02, 2018 02:14:53

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

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

Вт сен 04, 2018 19:02:47

Подскажите,а как же с помощью стандартной библиотеки настроить wdt так,что бы прерывание не вызывалось,а сразу была перезагрузка?

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

Пн сен 17, 2018 11:05:26

В каком состоянии будет счетчик wdt после перезагрузки? Скорее всего брошен, но поинтересуюсь на всякий случай

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

Пн сен 17, 2018 13:21:12

vovik15 писал(а):В каком состоянии будет счетчик wdt после перезагрузки?
Что об этом пишут в документации. :) Прочитайте и нам расскажите. :)

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

Чт ноя 08, 2018 17:35:55

Господа, та же история: не могу увеличить время предделителя собаки, контроллер правда Мега8А-pu(фьюзы по дефолту 1МГц и тд), пробую только в железе. В практике были и другие контроллеры: меги тини на них как то такой проблемы не возникало, ставил 2 сек и без проблем, с мегой8 ну не в какую.
При чтении WDP2, WDP1, WDP0 всегда 0 0 0 хотя в даташите написано что вроде читать эти биты можно, тем не менее время срабатывания тоже не меняется.
Бит WDE читается и пишется без проблем.

Интересно что за магическая сила, я где то не дочитал или пока магазину(местному) претензии предъявить? :kill:

ARV писал(а):Ну почему вы не пользуетесь готовыми либами, которые стандартно имеются в вашем компиляторе?!

В моём компиляторе нет такой либы, оптимизатор отключен.

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

Сб ноя 10, 2018 18:01:44

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

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

Пт дек 28, 2018 15:13:48

С удивлением для себя обнаружил, что в attinyx4 инструкция wdt_reset() не работает. Но по порядку. Читаем даташит:
If the reset period expires without another Watchdog Reset, the ATtiny24A/44A/84A resets and executes from the Reset Vector.

Ну то бишь когда поднят бит WDIE, по срабатыванию wdt мы уйдем на вектор WATCHDOG_vect. Если не сделать сброс, то при повторном срабатывании wdt мы уже уходим на вектор reset. Это хорошо, если код зациклился, а специально взводить wdt (если он уже используется) не надо - при грамотно написанном коде МК перезагрузится. ОК. Есть у меня такой код:
Код:
WDT_int_125mS;
......
Sleep (SLEEP_MODE_PWR_DOWN)
......
wdt_reset();
......
Sleep (SLEEP_MODE_PWR_DOWN)
wdt_reset();
......


Во сне я ожидаю реакцию от устройства, а чтобы не уснуть навсегда, я это дело контролирую wdt. Первый сон я прохожу нормально - код исполняется. Ухожу во второй сон, а просыпаюсь по ресету wdt (контролирую MCUSR). Что за дела?
Переписываю код так:

Код:
WDT_int_125mS;
......
Sleep (SLEEP_MODE_PWR_DOWN)
......
WDT_int_500mS;
......
Sleep (SLEEP_MODE_PWR_DOWN)
WDT_int_125mS;
......


И вот оно уже работает как надо. Может, надо два раза делать wdt_reset()? Но зачем, если я могу обойтись одной инструкцией записи в регистр.

мурррр, мяу)

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

Вт апр 09, 2019 18:24:14

ДОбрый день котаны!
позвольте прояснить для себя пару вопросов про собаку (камень 328P)

1) правильно я понял что максимальное время на которое можно настроить собаку это пробуждение через 8с ?

2) т.е. получается не реально настроить на пробуждение раз в сутки или неделю ?

3) правильно я понял что перед выключение собаки надо делать wdt_reset ? если да то - а зачем нужно делать ресет ?

4) правильно я понял что начальное значение WDTON,WDE,WDIE = 100 ?

5) правильно я понял что режим 110 (ресет) - это ресет камня каждые (например 8с) даже если в это время выполняется какойот другой код ?

6) а режим 101 (прерывания) как работает ? если камень например спит как этот режим его разбудит? обычное прерывание срабатывает по 1 или 0 на входе а тут?

7) если я отклучю собаку кодом из даташита в целях power save на что это повлияет (ну кроме самой собаки) ?

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

Вт апр 09, 2019 20:54:53

1 - это в даташит, наизусть не помню.

2 - с помощью watchdog - нет. С помощью других таймеров - вполне, надо считать. Вообще, Watchdog нужен не для этого.

3 - чтобы гарантированно дать время выключить таймер.

4 - наизусть не помню, в даташит.

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

6 - обычное прерывание срабатывает по любому событию; "1 или 0 на входе" - это конкретно прерывания GPIO.

7 - по-умолчанию watchdog-таймер и так выключен.

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

Вт апр 09, 2019 21:17:21

1) правильно я понял что максимальное время на которое можно настроить собаку это пробуждение через 8с ?

2) т.е. получается не реально настроить на пробуждение раз в сутки или неделю ?

Здрасти, идея не нова, я для этой цели хотел использовать ds3231(купил но руки так пока и не дошли), а именно это микросхема часов с будильником т.е. заводим будильник который сработает (максимально возможный период срабатывания 1 раз в месяц) сработает он через месяц, разбудит контроллер, контроллер перезаводит будильник на новую дату и спит ещё месяц. Так за год можно просыпаться не более 12 раз :)))

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

Ср апр 10, 2019 07:17:33

1 - ну других значений нет в ДШ если вы про это. ага значит максимальное время ресета камня 8 с. понял.

4 - WDTON WDE WDIE Mode Action on Time-out
1 0 0 Stopped None
1 0 1 Interrupt mode Interrupt
1 1 0 System reset mode Reset
1 1 1 Interrupt and system reset mode Interrupt, then go to system resetmode
0 x x System reset mode Reset
какие начальные значения ?

5 - если он нужен чтоб просто его ресетить то почему такие маленькие таймеры :) много не успеешь за 16 или 32 мс ?

6 - прочитал еще раз ДШ. получается после таймера (например 8с) будет вызвано ISR без ресета ?т.е. мы должны предусметреть чтобы после выхода из ISR указатель ушёл обратно в loop, и ресета не будет ,да ?
6 - что значит обычное прерывание? у собаки же нет тригера low/change/rising ? - какие кроме таймеров ресета есть тригеры у собаки для WDT_interrupts ?

7 - он выключен (disable) или просто stopped mode 100 (смотрите пункт 4) ?


http://ww1.microchip.com/downloads/en/D ... asheet.pdf

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

Ср апр 10, 2019 09:33:39

1- прерывание собаки может будить из глубокого сна и просыпаться из него раз в 8 сек, инкрементировать переменную перезаводить прерывание собаки и снова засыпать может оказаться экономичней, чем месяц мелко дремать с включенным таймером ...
5- если завел собаку, то кормить (сбрасывать) не забывай и всё будет норм (только надо правильно сбрасывалки расставить, например внутри цикла, который может повиснуть - неправильно).
6- насколько я помню, режим прерывания сбрасывается при сработке собаки и его надо снова устанавливать, если не установить - в следующий раз будет ресет. (это ещё одна защита от зависания кода)
6- такое же прерывание, как например переполнение любого другого таймера, только будит и из глубокого сна (в котором остальные таймеры тоже спят)...

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

Ср апр 10, 2019 10:59:17

5 - если он нужен чтоб просто его ресетить то почему такие маленькие таймеры :) много не успеешь за 16 или 32 мс ?


16 мс при частоте 8 МГц это 128 тысяч тактов. За этот промежуток, при условии линейного выполнения, можно исполнить все содержимое FLASH-памяти какой-нибудь ATmega48. Успеть можно много.

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

6 - что значит обычное прерывание? у собаки же нет тригера low/change/rising ? - какие кроме таймеров ресета есть тригеры у собаки для WDT_interrupts ?


Прерывание - это аппаратный переход к выполнению конкретного участка кода. Условия срабатывания по фронтам относятся только к конкретным блокам, для которых это актуально (портам и компаратору, например), и не имеют отношения к собственно механизму прерываний.

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

Чт апр 11, 2019 13:35:31

YS - 1 такт это 4мкс ? то 128 тыщ и не так много :) на один только блинк уходит 5000 мкс :)

Ivanoff-iv - иногда так экономичнее но если внешний таймер просто подаёт единицу раз в сутки то мыможем не дремать а глубоко спать :)

спасибо ребята, почти в голове нарисовалась картина про собаку и зачем оно может пригодиться. хотя для меня только вижу один проект где оно может понадобиться :)

1) правильно я понял что максимальное время на которое можно настроить собаку это пробуждение через 8с ?
если из глубукого сна то да максимум 8с, если из работающей программы то с помощью сброса собаки мы обнуляем счетчик собаки, столько сколько нужно, и ресета не будет пока счетчик не досчитает до 8с(или другой интервал)

4) правильно я понял что начальное значение WDTON,WDE,WDIE = 100 ?
начальное значение я так пока и не понял какое.
я смогу прочитать эти регистры из тела программы ?

6) а режим 101 (прерывания) как работает ?
а тут не по 1 или 0 как для портоа а как раз по таймеру :) дошли до 8с. вызов ISR. опять продолжаем loop() с точки откуда ушли в ISR и опять чере 8с ISR. так по кругу :)

7) если я отклучю собаку кодом из даташита в целях power save на что это повлияет (ну кроме самой собаки) ?
7 ) disable or enable WDTON я посматрю во фьюзах HIGH BITS.
так и не понял на что может повлиять отключеная собака / на какие сценари/ на функционирование встроенных блоков или компораторов в МК/ на работу самого МК.
например на время (длительность) пробуждения МК из глубокого сна может повлиять?

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

Чт апр 11, 2019 19:15:40

YS - 1 такт это 4мкс ? то 128 тыщ и не так много :) на один только блинк уходит 5000 мкс :)


При частоте 8 МГц один системный такт, как не трудно посчитать, это 125 наносекунд.

Я смотрю, вы не понимаете, зачем нужен сторожевой таймер.

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

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

Если контроллер по какой-то причине задержится с выполнением расчетов, то управляющий сигнал может залипнуть на одном уровне, когда уже давно нужен другой, и случится фейерверк. Для исключения этого можно сделать, например, так: перед входом в блок, выполняющий расчет, обнулять сторожевой таймер, настроенный на предельный безопасный интервал. После выхода тоже обнулять его. В этом случае, если расчеты завершатся за нормальное время, все будет функционировать штатно, а если по какой-то причине контроллер зависнет в процессе (неверные входные данные из-за помехи в сигнале датчика, какая-то плавающая ошибка в алгоритме, глюк самого контроллера из-за помех - такое тоже бывает), то сторожевой таймер перезагрузит контроллер, и последний с большой вероятностью успеет подхватить управление процессом до того, как случится непоправимое.

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

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

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

Пт апр 12, 2019 05:01:58

... если внешний таймер просто подаёт единицу раз в сутки то мыможем не дремать а глубоко спать...
По мне, использование WDT вкупе с внешним таймером слишком надумано. ATmega328P поддерживает режим POWER SAVE и асинхронный таймер Т2. Последний DS утверждает, что потребление в этом режиме порядка 0,6мкА.

Касательно DS3231. Не такая она и малопотребляющая, если учесть, что раз в 64 секунды аппаратно запускается преобразование температуры на 125мс с потреблением порядка 500мкА. Интерфейс IIC тоже дает о себе знать в плане потребления порядка 100мкА, не считая 2-х лап для его обслуживания.
Вложения
POWER_SAVE_M328P_32kHz.PNG
(38.92 KiB) Скачиваний: 831

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

Пт апр 12, 2019 09:15:53

Касательно DS3231. Не такая она и малопотребляющая

Речь шла при условии питания(только часов) от установленной батарейки в DS3231. Будильник при этом тоже срабатывает, после чего будим контроллер и подаём общее питание на DS3231 для возможности пообщаться по IIC. Сам не пробовал но читал на одном форуме что уже такое проделывали :))

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

Пт апр 12, 2019 10:22:41

YS - большое спасибо именно так я все и понял, о диодах речи не было ;)

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

Ср май 29, 2019 16:39:07

подскажите пожалуйста. нету под рукой НАНО не могу проверить. но на леонардо (встроенный usb) wdt_reset() неправильно сбрасывает, usb не подымается ну или я неправильно делаю.
что я хотел спросить

вот этот макрос
Код:
void soft_reset(){
   wdt_enable(0);
   while (1);
}

для НАНО абсолютно правильный /верный и программно и железно ? все регистры /порты буду правильно сброшенны , проинициализированны в начальное состояние. usb/serial работает.
или этого кода мало для коректного И БЕЗ ПРОБЛЕМНОГО ресета ?
Ответить