Заголовок сообщения: Watchdog для Arduino, или как защититься от зависаний
Добавлено: Вт июл 11, 2023 04:56:39
Родился
Зарегистрирован: Ср май 31, 2023 20:33:57 Сообщений: 5
Рейтинг сообщения:0
По дефолту ардуина такова, что микроконтроллер при просадке питающего напряжения может зависнуть. Или еще от чего-нибудь, см. закон Мерфи. Я этот эффект лично ловил на Arduino Nano (Atmega328P). Но думаю, что будет он и на Atmega32u4 (Arduino Pro Micro) и на Digispark (Attiny85) И тогда какие уровни выходов были LOW, те останутся LOW. А какие HIGH, те останутся HIGH. Если там двигатель и он вращается от HIGH, то при зависании он так и будет вращаться, пока не случится "авария". В моем случае там здоровенный асинхронник, который поднимает 300 кг и имеет 20 метров троса, так что это откровенно небезопасно.
В связи с этим 2 вопроса.
Вопрос 1. В микроконтроллерах (во всяком случае Atmega328P и Atmega32u4) бывает watchdog таймер. Как раз против зависаний. Надо только его настроить. Но вот вопрос, а точно ли он эффективен (вызовет RESET) при зависании, вызванном чем угодно? Или нет?
Вопрос 2. А если ему не доверять, то как сделать некий внешний "watchdog"? Какой самый простой способ? Ну, как бы, мы можем на какой-то из выходных пинов выдавать ШИМ или еще какой-нибудь пульсирующий сигнал. Но вот как сделать схему, которая в случае прекращения пульсации сигнала будет отключать питание либо нажимать тот же RESET...
По питанию сброс через светодиод и резистор, с вачдог не знаю есть спецмикросхемы
Добавлено after 1 hour 40 minutes 28 seconds: Это я на тини2313 5 вольтовое питание, делал светодиод красный и резистор. Бодлевелем нифига не сбрасывало. Зависал мк
В микроконтроллере ATmega собака есть и ее следует использовать. Проблема в том, что у ардуины сначала работает загрузчик, который таймер собаки не сбрасывает. Поэтому первое, что приходит в голову, записать свою прошивку через программатор. проблема исчезнет.
С новым загрузчиком (Optiboot) проблемы с WDT исправлены. Перезаписать загрузчик. --- Пробовал WDT несколько минут назад, Arduino Nano, Optiboot. Работает обычно - restart через 8 сек:
Код:
#include <avr/wdt.h>
#define LED_PIN 13
void setup() { // Blink LED to signal reset pinMode(LED_PIN, OUTPUT); digitalWrite(LED_PIN, HIGH); delay(1000); digitalWrite(LED_PIN, LOW); }
-если мы например хотим включить Watchdog то просто в любом месте программы пишем "включить Watchdog"
////////////////////////////////////////////// Ст таймер WDTCR=0x1F; // Разрешение изменения ст таймера WDTCR=0x0F; // Вкл. ст таймер // время переполнения: 2,0 c //////////////////////////////////////////////
-затем в любом месте программы пишем "сбросить Watchdog"
#asm("wdr") // Сброс ст таймер 2,0 c
-если мы например хотим выключить Watchdog то просто в любом месте программы пишем "выключить Watchdog"
////////////////////////////////////////////// Ст таймер WDTCR=0x1F; // Разрешение изменения ст таймера WDTCR=0x00; // Выкл. ст таймер // время переполнения: 2,0 c //////////////////////////////////////////////
По дефолту ардуина такова, что микроконтроллер при просадке питающего напряжения может зависнуть....
С какого такого перепугу?7... У адуринок по умолчанию (в случае загрузки бутлоадера также уже заложено ибо "записать загрузчик" одновременно и набор фузов устанавливает) установлен порог сработки по BOD для old bootloader к примеру это BODLEVEL2:BODLEVEL1:BODLEVEL0 = 1:0:1 т.е. аппаратный сброс при уровне питающего напряжения 2,5 - 2,7 - 2,9 вольта А вот касательно собаки... запустить то можно, но ведь ее надо внутри программы периодически сбрасывать - а это уже проблемы автора прожки... Тем более, что Ардуино IDE (тест на 1.8.9) таки #asm("wdr") не воспринимает: invalid preprocessing directive #asm
WDR Это инструкция из набора ассемблерных команд АВРок. В отношении ардуино (за рамками "референса" IDE) необходимо правила для работы под ассемблером в AVR GCC использовать. А они "немного иные"....( ) Да и файлы, воспринимаемые ардуиноIDE должны иметь расширения
Код:
*.ino *.cpp *.h
иные (
Код:
*.c
) не воспринимаются. Не ведаю насчет WDR (там надо разбираться с документацией по включению ассемблерных вставок), но вот с прерываниями проще - имеем воть такие макросы:
Код:
sei()
- глобальное разрешение прерываний;
Код:
cli()
- глобальный запрет прерываний;
Код:
reti()
- макрос принудительно помещает в код программы инструкцию reti, обеспечивая возврат из прерывания
Последний раз редактировалось BOB51 Вт июл 11, 2023 14:12:27, всего редактировалось 1 раз.
_________________ "Вся военная пропаганда, все крики, ложь и ненависть исходят от людей, которые на эту войну не пойдут !" / Джордж Оруэлл / "Война - это,когда за интересы других,гибнут совершенно безвинные люди." / Уинстон Черчилль /
Воть и я про то... Уж больно тяжко вычитывать те "правила ассемблерных вставок" после работы с "чистокровным" avrasm2... Предпочитаю или "чистый ассемблер" или не вылазить за "рамки референса" - ибо у адуринки не только АВРки водятся. И второе... "расширенные возможности" допустимы в основном в подключаемых файлах проекта, а не в основном *.ino... т.е. в дополнительных файлах библиотек или *.h *.cpp в папке проекта.
По дефолту ардуина такова, что микроконтроллер при просадке питающего напряжения может зависнуть....
С какого такого перепугу?7...
Ну я ловил этот эффект, когда еще был неопытным и пытался сделать свое первое устройство на Arduino Nano, запитав ее от 3 мизинчиковых батареек. Я тогда еще ничего толком не умел (ну, тех же батареек хватало этак... часов на шесть самых лучших алкалиновых. как же это наивно было...), но устройство всякими наворотами нафаршировал знатно. Был там и вибромоторчик, который включался электромагнитным реле, обмотка которого была запитана прямо от одного из выходов ардуины)) И вот при его включении - ардуина тупо зависала со включенным моторчиком. После перехода на 18650 проблема ушла, так что ее причина - это именно зависание при просадке напряжения, видимо от пускового тока вибромоторчика при питании от столь хилых батареек.
Сомнительно. Вибромоторчик не такой уж мощный и батарейки вполне могут дать необходимый ток без просадки напряжения. По крайней мере, у меня солевые крутят вибромотор, сделанный из моторчика привода компакт-дисков. Никаких зависаний. Просто перед проектированием я всегда читаю рекомендации по питанию и не пренебрегаю конденсаторами.
vjk7 1. Схема BOD сбрасывает МК, но не периферию - та остается в том состоянии, что предшествовало сбросу (или исходному состоянию выводов МК по сигналу reset, если нет "промежуточных элементов" между выводом МК и нагрузкой); 2. Программа в МК после сброса по BOD будет перезапущена только после восстановления питания до определенного уровня. Так что ёжли устройство "вошло в крысис" по питанию - надо то питание вовремя восстановить. Или разрабатывать схему так, чтобы вся периферия переходила в пассивное состояние при отключенном МК.
Лет 10- 15 назад переделалывал термостат на холодильнике на тини2313, проблемно было найти обычный в те времена. Автора и схему щас не вспомню, комп сломан. Чуть попозже мб нарою. Ну там немного переделал плату под себя. В общем периодически все зависало и сбрасывались настройки. Хорошо дома жил в то воемя, так бы растаяло все испортилось. Бодлевел встроеный пробовал разный, нифига. Потом на форуме у нас вычитал про светодиод и резистор. Поставил на ресет цепочку, все ок. И в подвалах термостаты годами работают и на отопление. В общем рекомендую. Про вачдог не подскажу, таких устройств нету
После сборки термостата он зароботал сразу но если передёрнуть быстро питание то слетало EEPROM, в этой бедемне так же помог форум , первую ножку микроконтролера я соединил с корпусом через резистор на 3.3к и между 20 и 1 н. подключил светодиод анодом на 20 н. после такого усовершенствования мне уже не удалось сбросить EEPROM как я не пытался.
Там скорее всего имела место "проблема нулевого адреса ЕЕПРОМ", свойственная АВРкам. Честно говоря сколько с МК не занимался (MCS51, PIC10/12/16, AVR) с "подвисанием" встречаться не приходилось (разве что на этапе отладки схемотехники и/или программы - но на то и отладка на макете ).
ардуино это фреймворк - работа в ограниченных рамках у каждого фреймворка есть документация и его ограничения смысл фреймворка - дать тебе готовые инструменты, чтобы ты не изобретал велосипед каждый раз и не таскал свой хлам из проекта в проект
а вставки ассемблера это уже относится к синтаксису компилятора гцц для авр
вот так это может выглядеть в других компиляторх вставки выглядят проще без тупых \n и прочей херни
vjk7 писал(а):
Но вот вопрос, а точно ли он эффективен (вызовет RESET) при зависании, вызванном чем угодно? Или нет?
любой ватчдог имеет свой внутренний автономный низкочастотный генератор + счетчик, который считает, если он был запущен в начале проги
в коде надо вызывать команду сброса счетчика, чтобы он не досчитал до своего переполнения по дефолту биты настроены так, что его выход дергает схему сброса, что нарисовано в даташите
поэтому ватчдог сбрасывает всегда
то, о чем ты пишеш
vjk7 писал(а):
По дефолту ардуина такова, что микроконтроллер при просадке питающего напряжения может зависнуть. Или еще от чего-нибудь, см. закон Мерфи.
он не зависает там есть специальный супервизор питания, который прижимает сброс, блокируя всю работу, чтобы не повредить содержимое флеш памяти и не попортилась прошивка или епром
напряжение срабатывания задается конфигурационными битами в настройке платы в опции перезаписи загрузчика
vjk7 писал(а):
В моем случае там здоровенный асинхронник, который поднимает 300 кг и имеет 20 метров троса, так что это откровенно небезопасно.
для проектирования подобных устройств есть специальные курсы, где объясняется базовые принципы защиты
например я смотрел демку курса по реле сименс лого, которое используется для автоматизации всяких машин и там этому уделяется некоторое внимание, чтобы заложить правильную логику в работу реле с учетом разных датчиков безопасности и там написано, в каких случаях какие концевики нельзя подключать к контроллеру, а нужно подключать к питанию приводов и должен ли это быть нормально замкнутый или разомкнутый и что произойдет, если делать не так
_________________ тематические ответы только в форуме, в приват не пишите
А если контролить компаратором напряжение на выходе блока питания, и как только оно падает - сбрасывать по прерыванию все порты? На МК отдельный стаб и кондёр большой ёмкости, чтобы он выключался в последнюю очередь.
Можно и компаратором и АЦП. Для адуринки удобнее АЦП (уже все необходимое в "референсе" имеется) Но тогда надо включать источник опорного напряжения - а это дополнительный расход энергии и настраивать порог чуток выше BOD. Плюс внешний делитель на резисторах. Да еще знать, с какой скоростью падает напряжение питания после выдачи сообщения об "батарейка издохла" ибо не исключено, что к моменту подсоединения зарядки уже успеет и BOD отработать (что не всегда явно заметно).
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 9
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения