Arduino + enc28j60+ библиотека Ethercard

Sega
Offline
Зарегистрирован: 15.05.2014

Уже несколько дней бьюсь, чтобы понять почему так происходит:

Есть Arduino pro mini и дешевый ethernet на чипе enc28j60. Подключаю библиотеку ethercard - свежую версию с https://github.com/jcw/ethercard

Часть примеров работает, часть нет.

Притом выяснил зависимость - например пример ниже - не работает вообще - виснет при инициализации:

 

// This demo does web requests via DNS lookup, using a fixed gateway.
// 2010-11-27 <jc@wippler.nl> http://opensource.org/licenses/mit-license.php

#include <EtherCard.h>

#define REQUEST_RATE 5000 // milliseconds

// ethernet interface mac address
static byte mymac[] = { 0x74,0x69,0x69,0x2D,0x30,0x31 };
// ethernet interface ip address
static byte myip[] = { 192,168,1,203 };
// gateway ip address
static byte gwip[] = { 192,168,1,1 };
// remote website name
const char website[] PROGMEM = "google.com";

byte Ethernet::buffer[300];   // a very small tcp/ip buffer is enough here
static long timer;

// called when the client request is complete
static void my_result_cb (byte status, word off, word len) {
  Serial.print("<<< reply ");
  Serial.print(millis() - timer);
  Serial.println(" ms");
  Serial.println((const char*) Ethernet::buffer + off);
}

void setup () {
  Serial.begin(57600);
  Serial.println("\n[getViaDNS]");
  
  if (ether.begin(sizeof Ethernet::buffer, mymac) == 0) 
    Serial.println( "Failed to access Ethernet controller");

  ether.staticSetup(myip, gwip);

  if (!ether.dnsLookup(website))
    Serial.println("DNS failed");
  ether.printIp("Server: ", ether.hisip);
  
  timer = - REQUEST_RATE; // start timing out right away
}

void loop () {
  ether.packetLoop(ether.packetReceive());
  
  if (millis() > timer + REQUEST_RATE) {
    timer = millis();
    Serial.println("\n>>> REQ");
    ether.browseUrl(PSTR("/foo/"), "bar", website, my_result_cb);
  }
}

Совершенно случайно заметил, что если в строке

const char website[] PROGMEM = "google.com";

убрать PROGMEM, то инициализация проходит, но ether.browseUrl отрабатывает некорректно - параметр website в GET запрос не передается - проверил при помощи WireShark - перехватил пакет и увидел, что во второй строке - пусто.

Что уже попробовал в качестве траблшутинга

- менял версию Arduino IDE - экспериментировал  на 1.05, 1.01 и 1.03

- менял enc28j60 - у меня их несколько штук

- пробовал заменить Arduino pro mini сначала на другой экземпляр, потом для очистки совести, на Arduino Uno

- с питанием все ок - через это я уже прошел раньше - поставил дополнительный стабилизатор на 3,3 В (AMS1117)

- естественно про известный казус с подключением CS на 8-й вывод вместо 10-го знаю.

Ничего не помогает - если имя сайта пишу во флеш при помощи PROGMEM - виснет при инициализации, если без PROGMEM, то не работает ether.browseUrl.

Вопрос уже просто принципиальный - почему есть куча примеров реализаций в интернете на этом же железе и этой же библиотеке и у всех все работает, а у меня не работает!!!???

Помогите советом, плиз!!!

 

Sega
Offline
Зарегистрирован: 15.05.2014

Сам разобрался. Последняя версия библиотеки на https://github.com/jcw/ethercard - не полностью рабочая.

Взял из архивов прошлогоднюю  - все работает.

eygen
Offline
Зарегистрирован: 26.08.2014

Поделись плиз где взял рабочую версию, походу я на теже грабли наступил.

kuzmich
Offline
Зарегистрирован: 15.08.2014

Sega пишет:

Сам разобрался. Последняя версия библиотеки на https://github.com/jcw/ethercard - не полностью рабочая.

Взял из архивов прошлогоднюю  - все работает.

 

Спасибо добрый человек, тоже имел проблемы на вроном месте.

Sega
Offline
Зарегистрирован: 15.05.2014

На гитхабе и взял - там же (если кликнуть на commits: https://github.com/jcw/ethercard/commits/master ) лежат все предыдущие версии с историей изменений. Откатывался на все более раннние, пока не заработало :-)

 

Рад, если кому-то помог. Кстати как их последние версии - не пофиксили? смотрю есть свежие изменения....

softm
Offline
Зарегистрирован: 25.08.2015

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

Немного поковырял библиотеку,

тут подробней - может кому пригодится

http://publikz.com/blog_18519

Irinka
Irinka аватар
Offline
Зарегистрирован: 28.06.2017

У меня несколько вопросов, начала работать с EtherCard

const char http_OK[] PROGMEM =
"HTTP/1.0 200 OK\r\n"
"Content-Type: text/html\r\n"
"Pragma: no-cache\r\n\r\n";

void homePage()
{
buf.emit_p(PSTR("$F"
"<!DOCTYPE html>"
"<html><head><meta charset=\"utf-8\" />"
"<title>HTML5</title>"
"</head>"
"<body>"
"<p>Привет, мир</p>"
"</body>"
"</html>"),
http_OK);
}

Что такое PSTR?

$F это переменная в которую "печатается" http_OK?

 

sadman41
Offline
Зарегистрирован: 19.10.2016

PSTR() - это макрос, который оставляет строки в Progmem Space по месту объявления (типа). См. #16 , например.

Но, бросали бы Вы это EtherCard - не шибко он гибкий. UIPEthernet (из старых выпусков) возьмите и всё. Примеры подходят от обычной Ethernet.h (почти все).