====== Про прерывания от W5500, которых нет ====== --- //[[admin@artonit.ru|Бухаров А.В.]] 2019/06/18 09:08// В ходе проведенных опытов мы выяснили, что прерывание от W5500 нет. В этой статье http://www.cyberforum.ru/digital-signal-processing/thread2094151.html указано, что для получения прерываний необходимо перевести сокеты в состояние listen().\\ Хотя описание дано для W5100, я думаю, что и для W5500 оно тоже подойдет. Надо проверить. Но как? Вот тут приведено описание библиотеки ethernet: https://doc.arduino.ua/ru/prog/Ethernet Про listen() нет ни слова. Кирилл! Надо разбираться. ---- ====== Доработка скетча с веб-панелью. ====== --- //[[admin@artonit.ru|Бухаров А.В.]] 2019/06/14 08:24// По состоянию на 7 июня 2019 г в нем реализована обработка GET запросов, выделение команд и данных. {{ :mpt:webserver_mpt_ver_2_0.ino |}} Теперь необходимо реализовать эти команды, взяв за основу уже имеющийся скетч Ястребова. Скетч Ястребова: {{ :mpt:2artonitmpt_large_1_3.ino |}}. Именно этот код работал на презентации. ---- ====== Работа с W5500 по прерыванию. ====== Источник: [[https://habr.com/ru/post/414211/]] Модуль W5500 подключен к SPI интерфейсу МК (MOSI, MISO, SCK, SCLK). Кроме того, к определённому выходу МК подключен вывод RST (аппаратный сброс), и к входу внешнего прерывания INT0 подключен соответствующий вывод INT. Последний используется по прямому назначению: При возникновении того или иного события в модуле W5500 он формирует импульс на выводе INT, который обрабатывается контроллером в теле внешнего прерывания. МК узнаёт, на каких сокетах произошло событие, затем переписывает коды событий для каждого сокета в определённый массив. Дальнейшая обработка прерывания происходит внутри основного цикла программы. Всего документировано пять событий: клиент подключился, клиент отключился (точнее, подал запрос на отключение), поступили данные от клиента, сработал таймаут, данные отправлены успешно. В основном цикле обрабатываются все события, кроме последнего. В данную обработку помещён оператор switch-case. Самая большая часть программного кода на языке Си встречается в секции обработки третьего события (приём данных). В нём после функции обработки принятой информации также помещён оператор switch-case, но в данном случае этот «переключатель» связан с переменной, отвечающей за состояние сокета, о котором говорилось выше (значения 0, 1, 2). Первая секция отвечает за процедуру распознавания пароля. Принятые символы переписываются в отдельный парольный буфер. При определённых условиях работают функции сравнения принятой строки со строками-константами, содержащих пароли. В случае того или иного совпадения присваивается соответствующее состояние. Вторая секция самая простая – содержимое собственного буфера принятой информации перенаправляется на UART микроконтроллера. Это режим обычного использования. Третья секция (самая большая) отвечает за обработку команд – режим управления устройством. Кроме продолжения обработчика прерываний в основном цикле программы помещены обработчики виртуальных таймеров – таймаут для разрыва соединения при неуспешной попытке ввода пароля, периодическая отправка «keep-alive» и отправка клиенту сформированного по таймеру TCP пакета. Ещё в тело основного цикла помещена функция чтения из UART, внутри которой переписываются принятые контроллером символы в собственный (промежуточный) буфер передачи и происходит сброс таймера, отвечающий за формирование TCP пакета. Все процедуры сокетов помещены в цикл от 0 до 7, итератор которого привязан к номеру сокета. Таким образом, происходит последовательная обработка всех сокетов. Изначально я подразумевал, что, если присвоить каждому из восьми сокетов одинаковый номер порта, то можно обеспечить подключение до восьми пользователей по одному и тому же порту. Однако такая конфигурация не заработала, и данный вопрос пока отложен на будущее. В документации на W5500 это отражено т.о.: {{ :mpt:interrapt_table_atmega328.png |}} Предполагаемые задачи при работе с МПТ: - Судя по схеме, прерывание от W5500 заведено на пин 32. Это PD2, он же INT0. Статьи про прерывания: * a. [[http://arduinonsk.ru/blog/87-all-pins-interrupts]] * b. Работа надо вести на макете, через UART (для быстрой отладки). * c. Надо зафиксировать факт получения прерывания. Алгоритм примерно такой: * i. Разрешить обработку прерывания INT0. * ii. При получения прерывания выводить в UART сообщение. Прочитать связанные регистры. * iii. После отладки внести изменение в основную программу. Программа должна работать с W5500 не по опросу, а по прерыванию. - Обработку кнопок тоже сделать по прерыванию.