Страница 5 из 13

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

Добавлено: Вт май 31, 2022 20:27:15
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 КБ) 147 скачиваний
сам модуль W5500 не будет ничего резать... без команды из вне))
библиотеки смотреть надо... или кто там управляет модулем W5500...

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

Добавлено: Вт май 31, 2022 20:42:29
tonyk
сам модуль W5500 не будет ничего резать... без команды из вне))
библиотеки смотреть надо... или кто там управляет модулем W5500...
Я прошёл в отладчике Визнетовскую библиотеку и нигде не встретил никаких попыток повторной отправки: загрузили в 5500 3 управляющих байта и 10 байт посылки- и всё, вернули мне 10. Я никаких явных команд отправки не делаю. Для чистоты эксперимента отключил все задачи, кроме одной.

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

Добавлено: Вт май 31, 2022 22:12:14
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:

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

Добавлено: Вт май 31, 2022 23:49:20
tonyk
Так ведь непонятка в том, что 5500, нормально передав посылку, с какого-то перепуга начинает ещё несколько раз отправлять её по частям, хотя никто его об этом, вроде, не просит.

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

Добавлено: Ср июн 01, 2022 00:29:57
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:

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

Добавлено: Ср июн 01, 2022 06:16:34
tonyk
roman.com писал(а):сам модуль W5500 не будет ничего резать... без команды из вне))
библиотеки смотреть надо... или кто там управляет модулем W5500...
Я прошёл отладчиком штатную библиотеку ioLibrary- там только один раз записала.
Посмотрю осциллографом, может, откуда-то из недр проекта кто-то дёргает ноги.

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

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

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

Добавлено: Ср авг 28, 2024 23:13:02
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-шки не исправляются.

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

Добавлено: Чт авг 29, 2024 06:46:05
tonyk
rw6hrm писал(а):слетают настройки W5500 при коммутации через реле высоковольтного (220) оборудования
rw6hrm писал(а):Хотя бы х4 сравнивать
Ну коли ни снаббер поставить, ни 4 байта сравнить не можете, может, ну его нафиг?

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

Добавлено: Чт авг 29, 2024 08:48:32
rw6hrm
Ну коль сказать по теме нечего, так может быть ну его нафиг?
Снабберы не помогают.

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

Добавлено: Чт авг 29, 2024 08:53:46
tonyk
[uquote="rw6hrm",url="/forum/viewtopic.php?p=4620106#p4620106"]Снабберы не помогают.[/uquote]
Всем помогают, а вам- нет. Может, не правильно рассчитали?
Плата в скольких слоях разведена?
Менять слетающие настройки в W5500- это лечить последствия, а не причину.

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

Добавлено: Чт авг 29, 2024 09:28:27
rw6hrm
Плата в один слой. Рассчитывать снаббер на соседский холодильник или торшер ну никак же...
Причина в нежности W-шки, на этом форуме уже об этом говорили. Но лечат на более низком уровне.
Ну а как сравнить хотя бы последний байт адреса - ну подскажите уж, будьте так любезны. Хотя бы формат ответа функции Ethernet.localIP() - стринг? Нифига. uint32_t ? Теплее, но не срабатывает.

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

Добавлено: Чт авг 29, 2024 09:53:58
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, усугубляет ситуацию.

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

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

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

Добавлено: Чт авг 29, 2024 10:17:02
tonyk
rw6hrm писал(а):Так что все фишки окружения не учесть.
Да ну. А как же тогда работает оборудование в цехах? У меня ПЛК с W5500 стоят в цехе и не сбоят при включении ни холодильников, ни насосов, ни сварочных аппаратов.
Мёртвого припарками на ноги не поставить. Без нормального "железа" будет лотерея: тут работает, а тут нет.

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

Добавлено: Чт авг 29, 2024 11:49:29
rw6hrm
...после зачистки мест посадки W5500 к крепёжным стойкам стало, конечно, лучше, зависаний гораздо меньше. Но они есть периодически. Всё ж земля на этой плате искаропки подключается только и исключительно через единственный пин (в старых версиях через два) и к корпусу устройства плата никак не контактирует.
Но как это программно добить именно в среде ИДЕ - вопрос остаётся.

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

Добавлено: Чт авг 29, 2024 13:44:05
tonyk
rw6hrm писал(а):...после зачистки мест посадки W5500 к крепёжным стойкам
Э-э-э... А, может, W5500 лучше припаять, а? По-моему, она для такого способа крепежа к плате лучше предназначена.

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

Добавлено: Чт авг 29, 2024 14:48:38
rw6hrm
Не ;), в моём случае всё заковыристей...

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

Добавлено: Чт авг 29, 2024 15:34:18
roman.com
у W5500 нет PoE...
W5500.jpg
(29.51 КБ) 88 скачиваний
надо добавить))
:roll:

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

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

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

Добавлено after 3 minutes 16 seconds:
одна из причин идеальной работы... потому что я не использую никаких библиотек... типа этого... Ethernet.begin(mac, ip);
ещё и поэтому нигде ничего не глючит и не зависает.
:tea:

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

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

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