Как принудительно перезагрузить ethernet shield w5100 ?

Vlad_Matviychuk
Offline
Зарегистрирован: 15.02.2016

Есть Mega + ethernet shield w5100.

На них крутится вебсервер (библиотека Webduino поверх стандартоной ethernet). Все работает нормально, но иногда может зависнуть сам ethernet shield w5100 (не отвечает на запросы). Мега при этом продолжает работать. Возможно это связано с какими-то атаками из интернета.

Вопрос: как можно отслеживать с Меги состояние шилда и если он завис - перезагружать шилд?

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

Предполагаю, что перезагружать шилд можно как-то програмно, например провести переинициализацию, или перезагружать аппаратно - подавать на вывод Reset шилда соответствующий уровень с порта Меги при зависании шилда (при этом ресет шилда отсоединить от ресета Меги).

Какие есть идеи?

Спасибо.

Radjah
Offline
Зарегистрирован: 06.08.2014

Ну пингой хост, который с меги данные забирает.

Vlad_Matviychuk
Offline
Зарегистрирован: 15.02.2016

Radjah пишет:

Ну пингой хост, который с меги данные забирает.

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

inspiritus
Offline
Зарегистрирован: 17.12.2012

В общем то весь топик и 24 и 26 посты в особенности.

http://arduino.ru/forum/obshchii/ntp-po-udp 

Vlad_Matviychuk
Offline
Зарегистрирован: 15.02.2016

Спасибо. Пост действительно интересный. Осталось выяснить, можно ли без пингов или обращений на внешний NTP сервер определить, что завис шилд.

inspiritus
Offline
Зарегистрирован: 17.12.2012

В чем проблемы ? - минуту не было активности в обслуживании сервера, или обслуживании клиента, ресетим W5100 безусловно.

Vlad_Matviychuk
Offline
Зарегистрирован: 15.02.2016

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

Можно конечно при отсутствии активности через каждый час перегружать, но как-то не правильно :)

Если умнее ничего не придумаем - так и буду делать.

inspiritus
Offline
Зарегистрирован: 17.12.2012

А что за проблема перезагружать ? 

Бортовой компьютер Бурана принудительно ресетился 50 раз в секунду :)

Vlad_Matviychuk
Offline
Зарегистрирован: 15.02.2016

Может кому-то пригодится.

Сделал перезагрузку через определенное время практически как в посте http://arduino.ru/forum/obshchii/ntp-po-udp

Пришлось отогнуть два штырька Reset шилда и Меги (один в общем ряду с портами, а второй на SPI разъеме) , чтобы они не соединялись при стыковке плат. Далее на штырек Reset шилда подключаю порт Меги и периодически подаю туда 0 -> задержка - > 1 и затем Ethernet.begin(mac,ip,dnServer,gateway,subnet)

Все работает.

Вопрос: ни чем не грозит частый вызов Ethernet.begin() ? Ну там память каждый раз выделяется или стек переполнится через месяц?

alfik777
alfik777 аватар
Offline
Зарегистрирован: 29.06.2015

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

inspiritus
Offline
Зарегистрирован: 17.12.2012

Дабы не анализировать всем всю ветку... Пожалуйста проквинтессенцуйте Ваш вопрос :)

alfik777
alfik777 аватар
Offline
Зарегистрирован: 29.06.2015

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

inspiritus
Offline
Зарегистрирован: 17.12.2012

Я откусил пин-штыри на эзернет шильде: и на линейном разъеме и на 2х3. На линейный разъем завел управляемый программно пин.

Если купить это то и кусать ничего не придется. Кстати оно летает устойчиво.

 

alfik777
alfik777 аватар
Offline
Зарегистрирован: 29.06.2015

Этот вариант ( отгрызание PIN) оставляю как крайний вариант. Всё же хотелось бы что-то типа одновибратора, формирователя импульса, но естественно, не ставя доп. микросхему.

inspiritus
Offline
Зарегистрирован: 17.12.2012

А толку? Все равно надо отвязывать ресет шильда от ресета главной платы.

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

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

alfik777
alfik777 аватар
Offline
Зарегистрирован: 29.06.2015

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

inspiritus
Offline
Зарегистрирован: 17.12.2012

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

alfik777
alfik777 аватар
Offline
Зарегистрирован: 29.06.2015

Но сейчас, при  начальной подаче питания, они стартуют "по -разному"? Я как раз и думал, что не нужно будет дополнительных маневров с инициализацией шилда после сброса.

Vlad_Matviychuk
Offline
Зарегистрирован: 15.02.2016

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

alfik777
alfik777 аватар
Offline
Зарегистрирован: 29.06.2015

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

avgaz
Offline
Зарегистрирован: 23.09.2014

Vlad_Matviychuk пишет:

Может кому-то пригодится.

Сделал перезагрузку через определенное время практически как в посте http://arduino.ru/forum/obshchii/ntp-po-udp

Пришлось отогнуть два штырька Reset шилда и Меги (один в общем ряду с портами, а второй на SPI разъеме) , чтобы они не соединялись при стыковке плат. Далее на штырек Reset шилда подключаю порт Меги и периодически подаю туда 0 -> задержка - > 1 и затем Ethernet.begin(mac,ip,dnServer,gateway,subnet)

Все работает.

Вопрос: ни чем не грозит частый вызов Ethernet.begin() ? Ну там память каждый раз выделяется или стек переполнится через месяц?

Покажите часть кода который отвечает за перезагрузку плиз, как часто вы перезагружаете? у меня Ethernet.begin(mac, ip); и server.begin(); прописаны в setup если вынести в для перезагрузки в loop скажем каждые 5 минут нужно ли и server.begin(); или достаточно Ethernet.begin(mac, ip);

 

Кстати может кто выяснил в чем причина зависания сервера? а то зависает ведь только север который отображает страничку, а вот фукция клиента продолжает при этом работать безпроблем. У меня вот скетч по запросу формирует страничку с данными и каждые 5 минут скидывает данные на xively.com вот фукция отображения странички сервер переодически зависает, а отправка клиент при этом работает значит виснет не весь шилд, а только сервер.

avgaz
Offline
Зарегистрирован: 23.09.2014

Сделал пока вот так

 digitalWrite(7, 0);
    delay(100);
    digitalWrite(7, 1);
    Ethernet.begin(mac, ip);
    server.begin();

впехнул в функцию отправки данных которая срабатывает раз в 5 минут посмотрим как будет работать.