Как принудительно перезагрузить ethernet shield w5100 ?
- Войдите на сайт для отправки комментариев
Есть Mega + ethernet shield w5100.
На них крутится вебсервер (библиотека Webduino поверх стандартоной ethernet). Все работает нормально, но иногда может зависнуть сам ethernet shield w5100 (не отвечает на запросы). Мега при этом продолжает работать. Возможно это связано с какими-то атаками из интернета.
Вопрос: как можно отслеживать с Меги состояние шилда и если он завис - перезагружать шилд?
Теоретически можно пинговать какой-то сервер в интернете и при отсутствии ответа - перезагружать шилд, но система должна работать и автономно в локальной сети, поэтому нужно как-то по другому определять зависание шилда.
Предполагаю, что перезагружать шилд можно как-то програмно, например провести переинициализацию, или перезагружать аппаратно - подавать на вывод Reset шилда соответствующий уровень с порта Меги при зависании шилда (при этом ресет шилда отсоединить от ресета Меги).
Какие есть идеи?
Спасибо.
Ну пингой хост, который с меги данные забирает.
Ну пингой хост, который с меги данные забирает.
С меги данные забирает не како-то постоянный хост, а например смартфон по мере необходимости. Также, хочется обеспечить полную автономность от интернета, т.к. если интернет пропадет, а шилд не зависнет, то нет необходимости его перезагружать. Работоспособность в таком случаэ сохраняется внутри сети.
В общем то весь топик и 24 и 26 посты в особенности.
http://arduino.ru/forum/obshchii/ntp-po-udp
Спасибо. Пост действительно интересный. Осталось выяснить, можно ли без пингов или обращений на внешний NTP сервер определить, что завис шилд.
В чем проблемы ? - минуту не было активности в обслуживании сервера, или обслуживании клиента, ресетим W5100 безусловно.
Активность может быть очень не регулярная. Может быть несколько подключений сразу, а может и несколько дней никто не подключаться.
Можно конечно при отсутствии активности через каждый час перегружать, но как-то не правильно :)
Если умнее ничего не придумаем - так и буду делать.
А что за проблема перезагружать ?
Бортовой компьютер Бурана принудительно ресетился 50 раз в секунду :)
Может кому-то пригодится.
Сделал перезагрузку через определенное время практически как в посте http://arduino.ru/forum/obshchii/ntp-po-udp
Пришлось отогнуть два штырька Reset шилда и Меги (один в общем ряду с портами, а второй на SPI разъеме) , чтобы они не соединялись при стыковке плат. Далее на штырек Reset шилда подключаю порт Меги и периодически подаю туда 0 -> задержка - > 1 и затем Ethernet.begin(mac,ip,dnServer,gateway,subnet)
Все работает.
Вопрос: ни чем не грозит частый вызов Ethernet.begin() ? Ну там память каждый раз выделяется или стек переполнится через месяц?
Прошло больше чем полгода. Интересно узнать - "стек не переполнился"?=-) Сейчас возник тот же вопрос, ищу варианты.
Дабы не анализировать всем всю ветку... Пожалуйста проквинтессенцуйте Ваш вопрос :)
Квинтэссенцую || квинтэссенцирую..:-).Собственно, суть вопроса в теме, но речь идет не о различных вариантах программного сброса дуины, а об аппаратном сбросе периферии, т.е. шилда. Нюанс заключается в том, что в бутерброде пины RESET соединены между собой в двух местах, а выламывать соединения, резать дорожки как-то некрасиво. Поэтому есть готовность сбрасывать вместе с шилдами и саму дуину, но тогда необходимо сформировать импульс сброса. Вот о нем и речь - как проще это сделать - возможно есть наработки?
Я откусил пин-штыри на эзернет шильде: и на линейном разъеме и на 2х3. На линейный разъем завел управляемый программно пин.
Если купить это то и кусать ничего не придется. Кстати оно летает устойчиво.
Этот вариант ( отгрызание PIN) оставляю как крайний вариант. Всё же хотелось бы что-то типа одновибратора, формирователя импульса, но естественно, не ставя доп. микросхему.
А толку? Все равно надо отвязывать ресет шильда от ресета главной платы.
вообще у меня w5100 годами устойчиво работает. Я ее ресечу только при подаче питания, чтобы она не запускалась раньше основной программы.
например это непрерывно работает с заходами от нескольких клиентов уже почти месяц.
Думал как раз не отвязывать ресет от главной платы - "для профилактики" - лишним не будет . Устройство не единичное, поэтому при разработе платы хочется застраховаться и предусмотреть сброс на всякий пожарный.
В таком случае у Вас ресет шильда и основной платы неизбежно будет начинаться одновременно , но стартовать платы будут по разному.
Но сейчас, при начальной подаче питания, они стартуют "по -разному"? Я как раз и думал, что не нужно будет дополнительных маневров с инициализацией шилда после сброса.
За 7 месяцев эксплуатации глюков замечено не было. Перезагружать всю дуину не вижу смысла, т.к. на ней работает сторожевой таймер и при необходимости сам перезагрузит дуину. Соответственно перезагрузится и шилд (программно при старте дуины).
Это хорошо что не виснет. Но хочется застраховаться так как устройство будет не одно и они территориально разбросаны . По той же причине не хотелось бы использовать внутреннюю собаку, чтоб не морочится с загрузчиками ( по той же причине не единичного изготовления). В принципе, собрал для пробы внешнюю собаку на 555 таймере, нормально работает. Буду использовать этот вариант - на случай если зависнет ардуина, а если с шилдом проблемы- ардуина принудительно сбросит его, приостановив подачу импульсов, да и удаленно можно будет ресетить ( пока правда не придумал зачем:-)))
Может кому-то пригодится.
Сделал перезагрузку через определенное время практически как в посте 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 вот фукция отображения странички сервер переодически зависает, а отправка клиент при этом работает значит виснет не весь шилд, а только сервер.
Сделал пока вот так
digitalWrite(7, 0);
delay(100);
digitalWrite(7, 1);
Ethernet.begin(mac, ip);
server.begin();
впехнул в функцию отправки данных которая срабатывает раз в 5 минут посмотрим как будет работать.