W5500_client+Atmega8_для самых начинающих.

Дисплеи, датчики и прочие функциональные узлы, управляемые МК.
roman.com
Друг Кота
Сообщения: 9149
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

Re: W5500_client+Atmega8_для самых начинающих.

Сообщение roman.com »

tonyk писал(а):192.168.27.100- это сервер;
192.168.27.133- это клиент.
клиент это кто ?))
W5500 - 192.168.27.133 ?

сервер это кто ?))
W5500 - 192.168.27.100 ?


ну допустим... W5500 - 192.168.27.100 в режиме сервер...
1.jpg
(61.06 КБ) 146 скачиваний
сам модуль W5500 не будет ничего резать... без команды из вне))
библиотеки смотреть надо... или кто там управляет модулем W5500...
Реклама
tonyk
Это не хвост, это антенна
Сообщения: 1309
Зарегистрирован: Вт ноя 19, 2019 06:10:18

Re: W5500_client+Atmega8_для самых начинающих.

Сообщение tonyk »

сам модуль W5500 не будет ничего резать... без команды из вне))
библиотеки смотреть надо... или кто там управляет модулем W5500...
Я прошёл в отладчике Визнетовскую библиотеку и нигде не встретил никаких попыток повторной отправки: загрузили в 5500 3 управляющих байта и 10 байт посылки- и всё, вернули мне 10. Я никаких явных команд отправки не делаю. Для чистоты эксперимента отключил все задачи, кроме одной.
Реклама
roman.com
Друг Кота
Сообщения: 9149
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

Re: W5500_client+Atmega8_для самых начинающих.

Сообщение roman.com »

я повыкидывал все библиотеки (включая визнетовскую) и пишу всё в ручную...


//TX_Socket_2:
/////////////////////////////////////////////////////////////////////////////////////////////
// Читаем начальный адрес для записи данных Socket_2:
PORTB.6=0; // SS W5500
tx=0x00; SPI(); tx=0x24; SPI(); tx=0x48; SPI(); // Address + Control Registers
tx=0x00; SPI(); x1 = rx; // Data -Sn_TX_WR0 -начальный адрес для записи данных
tx=0x00; SPI(); x2 = rx; // Data -Sn_TX_WR1 -начальный адрес для записи данных
PORTB.6=1; // SS W5500
// начальный адрес для записи данных:
add = x1; add = (add<<8)|x2; // 0x0000
/////////////////////////////////////////////////////////////////////////////////////////////
// начальный адрес для записи данных:
x1 = (add>>8);
x2 = add;
// Пишем данные Socket_2 с начального адреса:
PORTB.6=0; // SS W5500
tx=x1; SPI(); tx=x2; SPI(); tx=0x54; SPI(); // Address + Control Registers

// сброс len
len = 0; // 0x0000


////////////////////////////////////////// Data TX W5500 HTTP (например отправим текстовую страницу для браузера):
//GET / HTTP/1.1
//unsigned char bufer_TX_W5500_HTTP[]={
//"HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n>|"
//};
//bufer_TX_W5500_HTTP
for (x=0; bufer_TX_W5500_HTTP[x] != '|' ; x++) {
tx=bufer_TX_W5500_HTTP[x]; SPI(); len++;
};
////////////////////////////////////////// GET /1 HTTP/1.1
if (bufer_RX_W5500[5] == '1') {
////////////////////////////////////////// Data TX W5500:
for (x=0; x<30 ; x++) {
//////////////////////////////////////// перенос строка \r\n
tx='<'; SPI(); len++;
tx='b'; SPI(); len++;
tx='r'; SPI(); len++;
tx='>'; SPI(); len++;
//////////////////////////////////////// счёт x > HEX > DEC > 000
bi = x;
z=0; while (bi>99) {z++; bi=bi-100;}; // LED(z+48);
tx=z+48; SPI(); len++; // HEX
z=0; while (bi>9) {z++; bi=bi-10;}; // LED(z+48);
tx=z+48; SPI(); len++; // HEX
z=0; while (bi) {z++; bi=bi-1;}; // LED(z+48);
tx=z+48; SPI(); len++; // HEX
//////////////////////////////////////// пробел
tx=' '; SPI(); len++;
//////////////////////////////////////// RX_int[x] > HEX > DEC > 000
bi = RX_int[x];
z=0; while (bi>99) {z++; bi=bi-100;}; // LED(z+48);
tx=z+48; SPI(); len++; // HEX
z=0; while (bi>9) {z++; bi=bi-10;}; // LED(z+48);
tx=z+48; SPI(); len++; // HEX
z=0; while (bi) {z++; bi=bi-1;}; // LED(z+48);
tx=z+48; SPI(); len++; // HEX
/////////////////////////////////////////
};
};
/////////////////////////////////////////// Data END



PORTB.6=1; // SS W5500
/////////////////////////////////////////////////////////////////////////////////////////////
// Пишем указатель TX Socket_2 до увеличенного значения:
add = add + len; // add - конечный адрес переданных данных // 0x0000
// len - размер переданных данных // 0x0000
x1 = (add>>8);
x2 = add;
PORTB.6=0; // SS W5500
tx=0x00; SPI(); tx=0x24; SPI(); tx=0x4C; SPI(); // Address + Control Registers
tx=x1; SPI(); // Data -Sn_TX_WR0 -конечный адрес передачи данных
tx=x2; SPI(); // Data -Sn_TX_WR1 -конечный адрес передачи данных
PORTB.6=1; // SS W5500
/////////////////////////////////////////////////////////////////////////////////////////////
// Пишем команду передачи Socket_2:
PORTB.6=0; // SS W5500
tx=0x00; SPI(); tx=0x01; SPI(); tx=0x4C; SPI(); // Address + Control Registers
tx=0x20; SPI(); // Data -0x20 (SEND)
PORTB.6=1; // SS W5500
/////////////////////////////////////////////////////////////////////////////////////////////
//if (Sn_CR == 0x00); // По окончанию передачи регистр -Sn_CR будет = 0x00.


//Передача закончена.

сколько байт я указал W5500 передать (len), ровно столько байт W5500 и передаёт. Всё одним пакетом.
по другому и быть не может. По другому W5500 не работает.

остальные настройки (тайминги повторной передачи и т.д. не трогаем).

вывод:
надо повыкидывать нафиг все библиотеки))
:tea:
tonyk
Это не хвост, это антенна
Сообщения: 1309
Зарегистрирован: Вт ноя 19, 2019 06:10:18

Re: W5500_client+Atmega8_для самых начинающих.

Сообщение tonyk »

Так ведь непонятка в том, что 5500, нормально передав посылку, с какого-то перепуга начинает ещё несколько раз отправлять её по частям, хотя никто его об этом, вроде, не просит.
Реклама
Эиком - электронные компоненты и радиодетали
roman.com
Друг Кота
Сообщения: 9149
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

Re: W5500_client+Atmega8_для самых начинающих.

Сообщение roman.com »

5500 не может ещё несколько раз отправлять одну посылку по частям...

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

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

1.2.3.4.5.6.7.8.9

len = 3
1.2.3 >>
len = 3
4.5.6>>
len = 3
7.8.9 >>

или сделать посылку больше TCP пакета...

например для UDP... если длина пакета больше 1472 байта... например 0...1999 то 5500 будет отправлять по частям...
первый пакет UDP - 0...1471
второй пакет UDP - 1472...1999

по другому никак))

с другими вариантами не сталкивался))
:tea:
Реклама
tonyk
Это не хвост, это антенна
Сообщения: 1309
Зарегистрирован: Вт ноя 19, 2019 06:10:18

Re: W5500_client+Atmega8_для самых начинающих.

Сообщение tonyk »

roman.com писал(а):сам модуль W5500 не будет ничего резать... без команды из вне))
библиотеки смотреть надо... или кто там управляет модулем W5500...
Я прошёл отладчиком штатную библиотеку ioLibrary- там только один раз записала.
Посмотрю осциллографом, может, откуда-то из недр проекта кто-то дёргает ноги.
Реклама
Аватара пользователя
rw6hrm
Открыл глаза
Сообщения: 58
Зарегистрирован: Вт фев 26, 2019 14:44:04
Откуда: Ставрополь
Контактная информация:

Re: W5500_client+Atmega8_для самых начинающих.

Сообщение rw6hrm »

Прошу прощения, что поднимаю тему, но, как полный чайник в сишных делах, всё ж спрошу...
W5500, подключён к Атмега168, статический адрес, веб-сервер. Программирование сей связки происходит в Ардуино ИДЕ (я ещё мал для низкоуровневого программирования ;)). Подключения по сериалу нет.
Вылез описанный на форуме косяк - слетают настройки W5500 при коммутации через реле высоковольтного (220) оборудования, сама 168-я работает нормально или, если не повезёт, сбрасывается вачдогом. Т.е. требуется считывание настроек модуля W5500, сравнение с запрограммированным адресом и, если косяк, резет модуля с заливкой валидных данных.
Насколько я понял, возможно использовать функцию Ethernet.localIP(), возвращающему айпишник в формате х1.х2.х3.х4 (через точки). Но вот как сравнивать с первоначальной установкой в виде ip(x1, x2, x3, x4) (через запятые, это ж функция задаётся кяп) ... Хотя бы х4 сравнивать (его могу отдельной переменной сделать), но как оный вытаскивать из результата работы Ethernet.localIP()...
Всем печенек.
Аватара пользователя
rw6hrm
Открыл глаза
Сообщения: 58
Зарегистрирован: Вт фев 26, 2019 14:44:04
Откуда: Ставрополь
Контактная информация:

Re: W5500_client+Atmega8_для самых начинающих.

Сообщение rw6hrm »

Итак, сначала отработало, а потом снова никак...

Код: Выделить всё

// Определяем переменную, дабы помнить, какой адрес мы запрограммировали
String myip;

void setup() {
  Ethernet.begin(mac, ip);
  server.begin();
  myip = String(Ethernet.localIP()); // считываем зашитое после прошивки
}

void loop() {

  if (myip != String(Ethernet.localIP())) { // Если не одинаковы, то сбрасываем W-шку и заново её прошиваем
  digitalWrite (3, HIGH); // это мы транзистором управляем сбросом W-шки, коротя на землю.
  delay (50);
  digitalWrite (3, LOW); //set reset w5500
  Ethernet.begin(mac, ip);
  server.begin();
  delay (100);
 }
// По идее, если записанная ранее переменная и считывание адреса одинаковы, то работаем отсюда
}
Один раз сработало, прекрасно отрабатывало сбои из-за питания,... а потом никак.., проверка не проходит и всё постоянно сбрасывается. ЧЯНТД? Мож я где-то в типе данных ошибаюсь?
W-шки менял, контроллеры менял, чипы менял,...
Без блока, описанного выше в секции лупа, остальной код работает, но зависания W-шки не исправляются.
tonyk
Это не хвост, это антенна
Сообщения: 1309
Зарегистрирован: Вт ноя 19, 2019 06:10:18

Re: W5500_client+Atmega8_для самых начинающих.

Сообщение tonyk »

rw6hrm писал(а):слетают настройки W5500 при коммутации через реле высоковольтного (220) оборудования
rw6hrm писал(а):Хотя бы х4 сравнивать
Ну коли ни снаббер поставить, ни 4 байта сравнить не можете, может, ну его нафиг?
Аватара пользователя
rw6hrm
Открыл глаза
Сообщения: 58
Зарегистрирован: Вт фев 26, 2019 14:44:04
Откуда: Ставрополь
Контактная информация:

Re: W5500_client+Atmega8_для самых начинающих.

Сообщение rw6hrm »

Ну коль сказать по теме нечего, так может быть ну его нафиг?
Снабберы не помогают.
tonyk
Это не хвост, это антенна
Сообщения: 1309
Зарегистрирован: Вт ноя 19, 2019 06:10:18

Re: W5500_client+Atmega8_для самых начинающих.

Сообщение tonyk »

[uquote="rw6hrm",url="/forum/viewtopic.php?p=4620106#p4620106"]Снабберы не помогают.[/uquote]
Всем помогают, а вам- нет. Может, не правильно рассчитали?
Плата в скольких слоях разведена?
Менять слетающие настройки в W5500- это лечить последствия, а не причину.
Аватара пользователя
rw6hrm
Открыл глаза
Сообщения: 58
Зарегистрирован: Вт фев 26, 2019 14:44:04
Откуда: Ставрополь
Контактная информация:

Re: W5500_client+Atmega8_для самых начинающих.

Сообщение rw6hrm »

Плата в один слой. Рассчитывать снаббер на соседский холодильник или торшер ну никак же...
Причина в нежности W-шки, на этом форуме уже об этом говорили. Но лечат на более низком уровне.
Ну а как сравнить хотя бы последний байт адреса - ну подскажите уж, будьте так любезны. Хотя бы формат ответа функции Ethernet.localIP() - стринг? Нифига. uint32_t ? Теплее, но не срабатывает.
tonyk
Это не хвост, это антенна
Сообщения: 1309
Зарегистрирован: Вт ноя 19, 2019 06:10:18

Re: W5500_client+Atmega8_для самых начинающих.

Сообщение tonyk »

rw6hrm писал(а):Плата в один слой.
Даже китайцы делают два слоя. Как думаете, зачем?
Рассчитывать снаббер на соседский холодильник или торшер ну никак же...
Причём тут эти? Вы же не у соседа холодильник включаете.
Причина в нежности W-шки, на этом форуме уже об этом говорили.
Говорили, видимо, те, кто включает соседский холодильник. W5500 не более нежна, чем другие МК на основе ARM.
отя бы формат ответа функции Ethernet.localIP() - стринг?
Я никогда не пользовался и не пользуюсь Ардуино. Ниже метод инициализации W5500, использующий подправленную библиотеку от Wiznet. Метод устанавливает, потом обратно вычитывает установленный адрес и сравнивает его с тем, который должен был установлен. При совпадении возвращает true.
Спойлер

Код: Выделить всё

bool
Wiz5500::setNetInfo
(
    const uint8* _txBuffersSize,
    const uint8* _rxBuffersSize,
    const uint8* _IP,
    const uint8* _MAC,
    const uint8* _mask,
    const uint8* _gateway
)
{
    bool
        result = false;

    if( access -> take( W5500_TIMEOUT ) )
    {
        sizeOfTXbuff = _txBuffersSize;
        sizeOfRXbuff = _rxBuffersSize;

        int32
            wiz_result =
                wizchip_init
                (
                    ( uint8* )_txBuffersSize,
                    ( uint8* )_rxBuffersSize
                );

        if( wiz_result == 0 )
        {
            result = true;
        }
        else
        {
            result = false;
        }

        uint8
            wiz_id[ 16 ];

        memset( wiz_id, 0, sizeof( wiz_id ) );
        ctlwizchip( CW_GET_ID, &wiz_id );

        wiz_NetInfo
            netInfo;

        memset( &netInfo, 0, sizeof( netInfo ) );

        memcpy( &netInfo.mac, _MAC,     sizeof( netInfo.mac ) );
        memcpy( &netInfo.ip,  _IP,      sizeof( netInfo.ip  ) );
        memcpy( &netInfo.sn,  _mask,    sizeof( netInfo.sn  ) );
        memcpy( &netInfo.gw,  _gateway, sizeof( netInfo.gw  ) );

        wizchip_setnetinfo( &netInfo );

        wiz_NetInfo
            setNetInfo;

        memset( &setNetInfo, 0, sizeof( setNetInfo ) );

        wizchip_getnetinfo( &setNetInfo );

        if
        (
            ( memcmp( &setNetInfo.mac, &netInfo.mac, sizeof( netInfo.mac) )== 0 ) &&
            ( memcmp( &setNetInfo.ip,  &netInfo.ip,  sizeof( netInfo.ip ) )== 0 ) &&
            ( memcmp( &setNetInfo.sn,  &netInfo.sn,  sizeof( netInfo.sn ) )== 0 ) &&
            ( memcmp( &setNetInfo.gw,  &netInfo.gw,  sizeof( netInfo.gw ) )== 0 )
        )
        {
            result = true;
            present_flag = true;
        }
        else
        {
            result = false;
            present_flag = false;
        }

        access -> give();
    }

    return( result );
}
Если у вас W5500 сбоит при включении соседского холодильника, то это указывает на отсутствие полноценной фильтрации помех по цепям электропитания. Ну и отсутствие на плате полноценной "земли" и её разделение на аналоговую и цифровую, как рекомендует Wiznet, усугубляет ситуацию.
Вложения
5V-3V3.jpg
(39.34 КБ) 88 скачиваний
24V-5V.jpg
(67.78 КБ) 86 скачиваний
Аватара пользователя
rw6hrm
Открыл глаза
Сообщения: 58
Зарегистрирован: Вт фев 26, 2019 14:44:04
Откуда: Ставрополь
Контактная информация:

Re: W5500_client+Atmega8_для самых начинающих.

Сообщение rw6hrm »

О да, фильтрации нет. Аппараты стоят в деревнях, куда Россети не заглядывают, а сосед ещё и спит в обнимку со сваркой. И от меня в трёхстах км. Да ещё и УКВ передатчик рядом молотит и что у него с качеством антенны неизвестно. Так что все фишки окружения не учесть.
Тем не менее аналогичные платки (это передача телеметрии), но без управления розетками, стоят в других городах уже второй год и там всё норм. Что меня и заворожило.
С кодом спасибо, буду глядеть. По типам переменных уже что-то проясняется. Но увы, другой среды программирования у меня нет...
tonyk
Это не хвост, это антенна
Сообщения: 1309
Зарегистрирован: Вт ноя 19, 2019 06:10:18

Re: W5500_client+Atmega8_для самых начинающих.

Сообщение tonyk »

rw6hrm писал(а):Так что все фишки окружения не учесть.
Да ну. А как же тогда работает оборудование в цехах? У меня ПЛК с W5500 стоят в цехе и не сбоят при включении ни холодильников, ни насосов, ни сварочных аппаратов.
Мёртвого припарками на ноги не поставить. Без нормального "железа" будет лотерея: тут работает, а тут нет.
Аватара пользователя
rw6hrm
Открыл глаза
Сообщения: 58
Зарегистрирован: Вт фев 26, 2019 14:44:04
Откуда: Ставрополь
Контактная информация:

Re: W5500_client+Atmega8_для самых начинающих.

Сообщение rw6hrm »

...после зачистки мест посадки W5500 к крепёжным стойкам стало, конечно, лучше, зависаний гораздо меньше. Но они есть периодически. Всё ж земля на этой плате искаропки подключается только и исключительно через единственный пин (в старых версиях через два) и к корпусу устройства плата никак не контактирует.
Но как это программно добить именно в среде ИДЕ - вопрос остаётся.
tonyk
Это не хвост, это антенна
Сообщения: 1309
Зарегистрирован: Вт ноя 19, 2019 06:10:18

Re: W5500_client+Atmega8_для самых начинающих.

Сообщение tonyk »

rw6hrm писал(а):...после зачистки мест посадки W5500 к крепёжным стойкам
Э-э-э... А, может, W5500 лучше припаять, а? По-моему, она для такого способа крепежа к плате лучше предназначена.
Вложения
Screenshot_84.jpg
(198.8 КБ) 95 скачиваний
Аватара пользователя
rw6hrm
Открыл глаза
Сообщения: 58
Зарегистрирован: Вт фев 26, 2019 14:44:04
Откуда: Ставрополь
Контактная информация:

Re: W5500_client+Atmega8_для самых начинающих.

Сообщение rw6hrm »

Не ;), в моём случае всё заковыристей...
Вложения
Буфер обмена-1.png
(192.87 КБ) 96 скачиваний
roman.com
Друг Кота
Сообщения: 9149
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

Re: W5500_client+Atmega8_для самых начинающих.

Сообщение roman.com »

у W5500 нет PoE...
W5500.jpg
(29.51 КБ) 85 скачиваний
надо добавить))
:roll:

Добавлено after 2 minutes 33 seconds:
сначала добавим PoE в Wi-Fi роутер...
намотали самодельный трансформатор))
самодельный трансформатор.jpg
(62.93 КБ) 82 скачивания
установили в роутер... подключили + 5V...
роутер (1).jpg
(75.46 КБ) 86 скачиваний
работает.
:tea:

Добавлено after 5 minutes 13 seconds:
добавим POE в модуль W5500...
берём такой дроссель...
дроссель.jpg
(16.92 КБ) 82 скачивания
делам из него высокочастотный трансформатор...
мотаем 6+6 витков... с отводом...
трансформатор.jpg
(72.28 КБ) 82 скачивания
схема.jpg
(14.73 КБ) 91 скачивание
устанавливаем в модуль W5500...
после переделки.jpg
(81.19 КБ) 97 скачиваний
подключаем к аналог ардуино...
всё работает.
работает)).jpg
(90.09 КБ) 88 скачиваний
:tea:

Добавлено after 1 minute 3 seconds:
всё работает идеально.
нигде ничего не глючит и не зависает.
схема_1_PoE_5V2A.jpg
(188.6 КБ) 93 скачивания
:tea:

Добавлено after 3 minutes 16 seconds:
одна из причин идеальной работы... потому что я не использую никаких библиотек... типа этого... Ethernet.begin(mac, ip);
ещё и поэтому нигде ничего не глючит и не зависает.
:tea:
Аватара пользователя
rw6hrm
Открыл глаза
Сообщения: 58
Зарегистрирован: Вт фев 26, 2019 14:44:04
Откуда: Ставрополь
Контактная информация:

Re: W5500_client+Atmega8_для самых начинающих.

Сообщение rw6hrm »

>потому что я не использую никаких библиотек... типа этого... Ethernet.begin(mac, ip);
не вижу разницы между прямым управлением регистрами и тем же через либы. Ну разве что мусорокоду больше получается, то да,...
Крч, как я понял, никто W-шкой через иде не занимался и особо не вникал в это..., лан, проехали, чоуш, вопрос снят...

UPD, если кому-то скушно: Код выше рабочий. Проблема была в свободном ОЗУ Атмеги 168, меньше чем со 256 байтами работать со стрингами лучше не надо. Почистил код, добился 330 байт свободного - и заработало. Вывод: никому не верь, особенно себе и выдаче сообщений Ардуино ИДЕ...
...пользовал бы 328-ю, не напоролся бы...
Последний раз редактировалось rw6hrm Чт авг 29, 2024 16:45:10, всего редактировалось 1 раз.
Ответить

Вернуться в «Периферия»