| Форум РадиоКот https://radiokot.ru/forum/ |
|
| Watchdog для Arduino, или как защититься от зависаний https://radiokot.ru/forum/viewtopic.php?f=66&t=189094 |
Страница 1 из 2 |
| Автор: | vjk7 [ Вт июл 11, 2023 04:56:39 ] |
| Заголовок сообщения: | Watchdog для Arduino, или как защититься от зависаний |
По дефолту ардуина такова, что микроконтроллер при просадке питающего напряжения может зависнуть. Или еще от чего-нибудь, см. закон Мерфи. Я этот эффект лично ловил на 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... |
|
| Автор: | vlasovzloy [ Вт июл 11, 2023 08:25:36 ] |
| Заголовок сообщения: | Re: Watchdog для Arduino, или как защититься от зависаний |
По питанию сброс через светодиод и резистор, с вачдог не знаю есть спецмикросхемы Добавлено after 1 hour 40 minutes 28 seconds: Это я на тини2313 5 вольтовое питание, делал светодиод красный и резистор. Бодлевелем нифига не сбрасывало. Зависал мк |
|
| Автор: | JackSmith [ Вт июл 11, 2023 08:29:11 ] |
| Заголовок сообщения: | Re: Watchdog для Arduino, или как защититься от зависаний |
В микроконтроллере ATmega собака есть и ее следует использовать. Проблема в том, что у ардуины сначала работает загрузчик, который таймер собаки не сбрасывает. Поэтому первое, что приходит в голову, записать свою прошивку через программатор. проблема исчезнет. |
|
| Автор: | veso74 [ Вт июл 11, 2023 09:12:27 ] |
| Заголовок сообщения: | Re: Watchdog для Arduino, или как защититься от зависаний |
С новым загрузчиком (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); } void loop() { wdt_enable(WDTO_8S); // Infinite loop to simulate a crash while (1); } В помощь: How to make the Watchdog timer work |
|
| Автор: | roman.com [ Вт июл 11, 2023 09:56:13 ] |
| Заголовок сообщения: | Re: Watchdog для Arduino, или как защититься от зависаний |
Зачем загрузчик ? Arduino умеет работать напрямую с регистрами... -если мы например хотим включить Watchdog то просто в любом месте программы пишем "включить Watchdog" ////////////////////////////////////////////// Ст таймер WDTCR=0x1F; // Разрешение изменения ст таймера WDTCR=0x0F; // Вкл. ст таймер // время переполнения: 2,0 c ////////////////////////////////////////////// -затем в любом месте программы пишем "сбросить Watchdog" #asm("wdr") // Сброс ст таймер 2,0 c -если мы например хотим выключить Watchdog то просто в любом месте программы пишем "выключить Watchdog" ////////////////////////////////////////////// Ст таймер WDTCR=0x1F; // Разрешение изменения ст таймера WDTCR=0x00; // Выкл. ст таймер // время переполнения: 2,0 c ////////////////////////////////////////////// ![]() Вложение:
|
|
| Автор: | BOB51 [ Вт июл 11, 2023 11:04:46 ] |
| Заголовок сообщения: | Re: Watchdog для Arduino, или как защититься от зависаний |
По дефолту ардуина такова, что микроконтроллер при просадке питающего напряжения может зависнуть.... С какого такого перепугу?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
|
|
| Автор: | roman.com [ Вт июл 11, 2023 13:03:34 ] |
| Заголовок сообщения: | Re: Watchdog для Arduino, или как защититься от зависаний |
BOB51 писал(а): #asm("wdr") не воспринимает: invalid preprocessing directive #asm как так ! это же прямая инструкция Arduino ! Вложение: больше никогда не буду связываться с Arduino...
|
|
| Автор: | BOB51 [ Вт июл 11, 2023 14:09:49 ] |
| Заголовок сообщения: | Re: Watchdog для Arduino, или как защититься от зависаний |
WDR Это инструкция из набора ассемблерных команд АВРок. В отношении ардуино (за рамками "референса" IDE) необходимо правила для работы под ассемблером в AVR GCC использовать. А они "немного иные"....( Да и файлы, воспринимаемые ардуиноIDE должны иметь расширения Код: *.ino *.cpp *.h иные ( Код: *.c ) не воспринимаются.Не ведаю насчет WDR (там надо разбираться с документацией по включению ассемблерных вставок), но вот с прерываниями проще - имеем воть такие макросы: Код: sei() - глобальное разрешение прерываний;Код: cli() - глобальный запрет прерываний;Код: reti() - макрос принудительно помещает в код программы инструкцию reti, обеспечивая возврат из прерывания |
|
| Автор: | Morroc [ Вт июл 11, 2023 14:11:44 ] |
| Заголовок сообщения: | Re: Watchdog для Arduino, или как защититься от зависаний |
так на #asm ругается же, а не на wdr asm ("wdr"); |
|
| Автор: | BOB51 [ Вт июл 11, 2023 14:15:53 ] |
| Заголовок сообщения: | Re: Watchdog для Arduino, или как защититься от зависаний |
Воть и я про то... Уж больно тяжко вычитывать те "правила ассемблерных вставок" после работы с "чистокровным" avrasm2... Предпочитаю или "чистый ассемблер" или не вылазить за "рамки референса" - ибо у адуринки не только АВРки водятся. И второе... "расширенные возможности" допустимы в основном в подключаемых файлах проекта, а не в основном *.ino... т.е. в дополнительных файлах библиотек или *.h *.cpp в папке проекта. |
|
| Автор: | vjk7 [ Ср июл 12, 2023 03:44:56 ] |
| Заголовок сообщения: | Re: Watchdog для Arduino, или как защититься от зависаний |
По дефолту ардуина такова, что микроконтроллер при просадке питающего напряжения может зависнуть.... С какого такого перепугу?7... Ну я ловил этот эффект, когда еще был неопытным и пытался сделать свое первое устройство на Arduino Nano, запитав ее от 3 мизинчиковых батареек. Я тогда еще ничего толком не умел (ну, тех же батареек хватало этак... часов на шесть |
|
| Автор: | Martian [ Ср июл 12, 2023 09:14:18 ] |
| Заголовок сообщения: | Re: Watchdog для Arduino, или как защититься от зависаний |
Сомнительно. Вибромоторчик не такой уж мощный и батарейки вполне могут дать необходимый ток без просадки напряжения. По крайней мере, у меня солевые крутят вибромотор, сделанный из моторчика привода компакт-дисков. Никаких зависаний. Просто перед проектированием я всегда читаю рекомендации по питанию и не пренебрегаю конденсаторами. |
|
| Автор: | BOB51 [ Ср июл 12, 2023 09:26:59 ] |
| Заголовок сообщения: | Re: Watchdog для Arduino, или как защититься от зависаний |
vjk7 1. Схема BOD сбрасывает МК, но не периферию - та остается в том состоянии, что предшествовало сбросу (или исходному состоянию выводов МК по сигналу reset, если нет "промежуточных элементов" между выводом МК и нагрузкой); 2. Программа в МК после сброса по BOD будет перезапущена только после восстановления питания до определенного уровня. Так что ёжли устройство "вошло в крысис" по питанию - надо то питание вовремя восстановить. Или разрабатывать схему так, чтобы вся периферия переходила в пассивное состояние при отключенном МК. |
|
| Автор: | vlasovzloy [ Ср июл 12, 2023 09:43:20 ] |
| Заголовок сообщения: | Re: Watchdog для Arduino, или как защититься от зависаний |
Лет 10- 15 назад переделалывал термостат на холодильнике на тини2313, проблемно было найти обычный в те времена. Автора и схему щас не вспомню, комп сломан. Чуть попозже мб нарою. Ну там немного переделал плату под себя. В общем периодически все зависало и сбрасывались настройки. Хорошо дома жил в то воемя, так бы растаяло все испортилось. Бодлевел встроеный пробовал разный, нифига. Потом на форуме у нас вычитал про светодиод и резистор. Поставил на ресет цепочку, все ок. И в подвалах термостаты годами работают и на отопление. В общем рекомендую. Про вачдог не подскажу, таких устройств нету Добавлено after 9 minutes 1 second: https://hardlock.org.ua/viewtopic.php?t=10 Возможно этот, печатная плата по крайней мере та Добавлено after 2 minutes 20 seconds: Цитата: После сборки термостата он зароботал сразу но если передёрнуть быстро питание то слетало EEPROM, в этой бедемне так же помог форум , первую ножку микроконтролера я соединил с корпусом через резистор на 3.3к и между 20 и 1 н. подключил светодиод анодом на 20 н. после такого усовершенствования мне уже не удалось сбросить EEPROM как я не пытался. кстати сам автор об этом пишет тоже |
|
| Автор: | BOB51 [ Ср июл 12, 2023 15:39:16 ] |
| Заголовок сообщения: | Re: Watchdog для Arduino, или как защититься от зависаний |
Там скорее всего имела место "проблема нулевого адреса ЕЕПРОМ", свойственная АВРкам. Честно говоря сколько с МК не занимался (MCS51, PIC10/12/16, AVR) с "подвисанием" встречаться не приходилось (разве что на этапе отладки схемотехники и/или программы - но на то и отладка на макете |
|
| Автор: | kalobyte [ Чт июл 13, 2023 00:26:05 ] |
| Заголовок сообщения: | Re: Watchdog для Arduino, или как защититься от зависаний |
roman.com писал(а): больше никогда не буду связываться с Arduino... ардуино это фреймворк - работа в ограниченных рамках у каждого фреймворка есть документация и его ограничения смысл фреймворка - дать тебе готовые инструменты, чтобы ты не изобретал велосипед каждый раз и не таскал свой хлам из проекта в проект а вставки ассемблера это уже относится к синтаксису компилятора гцц для авр Код: asm ( "lds %0, (value) \n" "ror %0 \n" :"=r" (value) ); вот так это может выглядеть в других компиляторх вставки выглядят проще без тупых \n и прочей херни vjk7 писал(а): Но вот вопрос, а точно ли он эффективен (вызовет RESET) при зависании, вызванном чем угодно? Или нет? любой ватчдог имеет свой внутренний автономный низкочастотный генератор + счетчик, который считает, если он был запущен в начале проги в коде надо вызывать команду сброса счетчика, чтобы он не досчитал до своего переполнения по дефолту биты настроены так, что его выход дергает схему сброса, что нарисовано в даташите поэтому ватчдог сбрасывает всегда то, о чем ты пишеш vjk7 писал(а): По дефолту ардуина такова, что микроконтроллер при просадке питающего напряжения может зависнуть. Или еще от чего-нибудь, см. закон Мерфи. он не зависает там есть специальный супервизор питания, который прижимает сброс, блокируя всю работу, чтобы не повредить содержимое флеш памяти и не попортилась прошивка или епром напряжение срабатывания задается конфигурационными битами в настройке платы в опции перезаписи загрузчика vjk7 писал(а): В моем случае там здоровенный асинхронник, который поднимает 300 кг и имеет 20 метров троса, так что это откровенно небезопасно. для проектирования подобных устройств есть специальные курсы, где объясняется базовые принципы защиты например я смотрел демку курса по реле сименс лого, которое используется для автоматизации всяких машин и там этому уделяется некоторое внимание, чтобы заложить правильную логику в работу реле с учетом разных датчиков безопасности и там написано, в каких случаях какие концевики нельзя подключать к контроллеру, а нужно подключать к питанию приводов и должен ли это быть нормально замкнутый или разомкнутый и что произойдет, если делать не так |
|
| Автор: | Martian [ Чт июл 13, 2023 00:32:13 ] |
| Заголовок сообщения: | Re: Watchdog для Arduino, или как защититься от зависаний |
имхо, тут не только курсы, тут по хорошему надо специальность изучать, профессию получать, пусть даже рамках самообразования. И уж точно не на ардуино делать. |
|
| Автор: | Игорь_396 [ Чт июл 13, 2023 08:33:56 ] |
| Заголовок сообщения: | Re: Watchdog для Arduino, или как защититься от зависаний |
А если контролить компаратором напряжение на выходе блока питания, и как только оно падает - сбрасывать по прерыванию все порты? На МК отдельный стаб и кондёр большой ёмкости, чтобы он выключался в последнюю очередь. |
|
| Автор: | BOB51 [ Чт июл 13, 2023 08:59:42 ] |
| Заголовок сообщения: | Re: Watchdog для Arduino, или как защититься от зависаний |
Можно и компаратором и АЦП. Для адуринки удобнее АЦП (уже все необходимое в "референсе" имеется) Но тогда надо включать источник опорного напряжения - а это дополнительный расход энергии и настраивать порог чуток выше BOD. Плюс внешний делитель на резисторах. Да еще знать, с какой скоростью падает напряжение питания после выдачи сообщения об "батарейка издохла" ибо не исключено, что к моменту подсоединения зарядки уже успеет и BOD отработать (что не всегда явно заметно). |
|
| Автор: | Игорь_396 [ Чт июл 13, 2023 12:47:02 ] |
| Заголовок сообщения: | Re: Watchdog для Arduino, или как защититься от зависаний |
АЦП читать надо, а компаратор все сам делает )) По поводу ИОН - у 328р разве не могут оба входа компаратора на порты выводиться? Вроде должны. |
|
| Страница 1 из 2 | Часовой пояс: UTC + 3 часа |
| Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |
|



