Ethernet LAN Network Module ENC28J60 подтвердите предположение?

Тема в разделе "Arduino & Shields", создана пользователем kef82871, 6 июл 2016.

  1. kef82871

    kef82871 Нерд

    Для первого проекта использую Ethernet LAN Network Module ENC28J60. Проблема в том, что страницы открываются с 10-го раза, ардуино подвиссает, приходится постоянно ресать его. Есть предположение, что когда я нагружаю интернет, то это вот таким образом отражается на этом модуле. Когда я освобождаю канал, то вроде нормально начинает работать. Есть еще мое мнение, что это просто Ethernet LAN Network Module ENC28J60, как говорится, "сделан из риса" и поэтому так работает. Еще мне кажется, но не уверен, если купить Ethernet Shield для Arduino W5100, то эта проблема исчезнет. Кто сталкивался с подобным подскажите?
     
  2. DIYMan

    DIYMan Guest

    Если бы ещё кусочек кода...
     
  3. kef82871

    kef82871 Нерд

    Код (C++):
    ...
     
     
    Последнее редактирование: 10 июл 2016
  4. DIYMan

    DIYMan Guest

    Да вроде особого криминала не вижу, если честно. Вы упомянули, что Arduino подвисает - как это проявляется? Сервы перестают работать, ещё как? Надо смотреть конфликты - Servo юзает таймеры, у вас тоже таймер задействован. Проверяйте конфликты таймеров, используемых пинов и т.п.
     
  5. kef82871

    kef82871 Нерд

    проявляется так, что когда я, например, обращаюсь по адресу http://192.168.0.110:81/, то получаю
    [​IMG]
    так бывает не всегда, но в основном именно так. Допустим, страница загрузилась и я вижу кнопки, определены в скетче. Нажатием на кнопку, перехожу по адресу http://192.168.0.110:81/start и зажигаю диод. Если я буду обновлять эту страницу 10 раз с периодичностью 1сек, то вероятнее всего, произойдет зависание и диод будет гореть всегда, хотя он должен тухнуть через 5сек. Далее команды ардуино не воспринимает.
     
  6. ZAZ-965

    ZAZ-965 Гуру

  7. AlexVS

    AlexVS Гик

    Если все же надумаете менять Ethernet shield, то рекомендую не W5100, а W5500.
     
  8. AlexU

    AlexU Гуру

    Строчка кода:
    Код (C++):
    if (params = eth.serviceRequest())
    может тянуть на криминал -- надо внимательно посмотреть на код функции 'serviceRequest()', каким образом она подготавливает результат.
    И после компиляции прошивки обычно выводится информация об объёме памяти выделяемой для различных секций -- хотелось бы взглянуть на эту информацию.
     
  9. AlexVS

    AlexVS Гик

    На мой взгляд - тут полный криминал, ибо не
    Код (C++):
    if (params = eth.serviceRequest())
    а
    Код (C++):
    if (params == eth.serviceRequest())
    :)
     
  10. DIYMan

    DIYMan Guest

    Тут никакого криминала нет, всё штатно с точки зрения синтаксиса: сперва в params заносится результат вызова eth.serviceRequest(), потом уже params сравнивается на ненулевое значение. Т.е. это короткая запись следующей:
    Код (C++):
    params = eth.serviceRequest();
    if(params) {}
     
  11. AlexVS

    AlexVS Гик

    Век живи, век учись.
     
  12. AlexU

    AlexU Гуру

    Как уже было сказано, криминал не в условии, а в самой функции 'serviceRequest()'.
    Судя по коду эта функция возвращает указатель на участок памяти (char *), так вот надо разобраться что это за участок и каким образом он выделяется?
     
  13. kef82871

    kef82871 Нерд

    я провел эксперимент и использовал другую библиотеку для теста - EtherCard https://github.com/jcw/ethercard.
    залил стандартный пример с со счетчиком секунд.
    Код (C++):
    // This is a demo of the RBBB running as webserver with the Ether Card
    // 2010-05-28 <jc@wippler.nl> http://opensource.org/licenses/mit-license.php

    #include <EtherCard.h>

    // ethernet interface mac address, must be unique on the LAN
    static byte mymac[] = { 0x74,0x69,0x69,0x2D,0x30,0x31 };
    static byte myip[] = { 192,168,0,110 };

    byte Ethernet::buffer[500];
    BufferFiller bfill;

    void setup () {
      if (ether.begin(sizeof Ethernet::buffer, mymac) == 0)
        Serial.println(F("Failed to access Ethernet controller"));
      ether.staticSetup(myip);
    }

    static word homePage() {
      long t = millis() / 1000;
      word h = t / 3600;
      byte m = (t / 60) % 60;
      byte s = t % 60;
      bfill = ether.tcpOffset();
      bfill.emit_p(PSTR(
        "HTTP/1.0 200 OK\r\n"
        "Content-Type: text/html\r\n"
        "Pragma: no-cache\r\n"
        "\r\n"
        "<meta http-equiv='refresh' content='1'/>"
        "<title>RBBB server</title>"
        "<h1>$D$D:$D$D:$D$D</h1>"),
          h/10, h%10, m/10, m%10, s/10, s%10);
      return bfill.position();
    }

    void loop () {
      word len = ether.packetReceive();
      word pos = ether.packetLoop(len);
     
      if (pos)  // check if valid tcp data is received
        ether.httpServerReply(homePage()); // send web page data
    }
    как и раньше, каждую секунду страница обновляется и отображаются прошедшие секунды, но опять происходит зависание и браузер пишет, что ""не удается получить доступ к сайту". помогает только ресет ардуины. пробовал немного подождать, но ничего. может есть способ определить причина в сетевухе или ардуине?
     
  14. kef82871

    kef82871 Нерд

    Может есть у кого-то возможность закинуть этот скетч к себе и попробовать хотя бы на 10 минут запустить и посмотреть, будет ли зависание у вас?
     
  15. kef82871

    kef82871 Нерд

    переставил питание с 3.3 на 5 и полные зависания прекратились, теперь появляются зависания длительностью около 30 сек иногда. веду вывод из основного цикла в serial и там продолжается работа во время того, как сетевая не отвечает. короче, эти сетевые реально плохие о чем люди и пишут:

    http://arduino.ru/forum/apparatnye-voprosy/problema-s-enc28j60arduino-0
    https://geektimes.ru/post/255430/
    http://publikz.com/blog_19178

    придется покупать W5100, т.к. 5500 ооочень дорогая.
     
  16. aleksis-76

    aleksis-76 Нерд

    Сетевая и не должна отвечать,отвечать должен(а) ардуина,enc всего лишь конвертер,собсвенного стека не имеет,вся обработка происходит в ардуино, 5 вольтами можете поджарить enc(выходной каскад передатчика)
     
  17. kef82871

    kef82871 Нерд

    [​IMG]
    вроде решилась проблема, переводом на 5v и установкой порта на 2288), ранее был 81. с тех пор проблем не замечал. у меня и проскакивала мысль, что 81 порт каким-то образом забивается что ли.
     
  18. aleksis-76

    aleksis-76 Нерд

    а что за 81 порт?
    там значит стоит стабилизатор