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 (почти все).

 

Михаил З
Offline
Зарегистрирован: 22.03.2020

пытаюсь попользовать

Send UDP packet

To send a UDP packet use ether.sendUdp().

char payload[] = "My UDP message";
uint8_t nSourcePort = 1234;
uint8_t nDestinationPort = 5678;
uint8_t ipDestinationAddress[IP_LEN];
ether.parseIp(ipDestinationAddress, "192.168.0.200");
 
ether.sendUdp(payload, sizeof(payload), nSourcePort, ipDestinationAddress, nDestinationPort);

что должно быть в IP_LEN ? количество символов IP адреса?

Михаил З
Offline
Зарегистрирован: 22.03.2020

sadman41 пишет:

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

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

 

да, много заморочек.

Вообще, посоветуйте библиотеку для обмена UDP пакетами.

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

Для ENC я знаю только две: EtherCard и UIPEthernet.

Михаил З
Offline
Зарегистрирован: 22.03.2020

в UIPEthernet не нашёл примеров с DHCP

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

Что ж поделать, если не нашли. Другие как-то справляются, находят.

Михаил З
Offline
Зарегистрирован: 22.03.2020

Форум то, на самом деле, бестолковый. Еще ни разу не помогли.

Зря потерянное время...

На других люди более грамотные и отзывчивые.

 

b707
Offline
Зарегистрирован: 26.05.2017

Михаил З пишет:

Форум то, на самом деле, бестолковый. Еще ни разу не помогли.

Зря потерянное время...

На других люди более грамотные и отзывчивые.

вот ведь гады, никто готового кода не дал...

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Михаил З пишет:

Форум то, на самом деле, бестолковый. Еще ни разу не помогли.

Зря потерянное время...

На других люди более грамотные и отзывчивые.

 

Просто этот форум для жаждущих знаний. А для «слепить по быстрому» есть куча других форумов. И я сначала не доумевал, но согласен. Представь что ты решил сделать управление газовым котлом не понимая что вообще делаешь (и фразы - ну у других же работает ничего не меняют). И вот в один момент котёл погас, электроника не сработала, потому что ты код хреновый сделал и все кто в доме жил - скажем так, перестали там жить и не по своей воле. А ты был в командировке. Как ты сам потом жить сможешь и что скажешь остальным родственникам?!

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

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Михаил З пишет:

Форум то, на самом деле, бестолковый. Еще ни разу не помогли.

Зря потерянное время...

На других люди более грамотные и отзывчивые.

 

Просто этот форум для жаждущих знаний. А для «слепить по быстрому» есть куча других форумов. И я сначала не доумевал, но согласен. Представь что ты решил сделать управление газовым котлом не понимая что вообще делаешь (и фразы - ну у других же работает ничего не меняют). И вот в один момент котёл погас, электроника не сработала, потому что ты код хреновый сделал и все кто в доме жил - скажем так, перестали там жить и не по своей воле. А ты был в командировке. Как ты сам потом жить сможешь и что скажешь остальным родственникам?!

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

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

BOOM ты что накатил?